በC ++ ውስጥ የማይክሮ አገልግሎቶች። ልቦለድ ወይስ እውነት?

በC ++ ውስጥ የማይክሮ አገልግሎቶች። ልቦለድ ወይስ እውነት?

በዚህ ጽሑፍ ውስጥ እንዴት አብነት እንደፈጠርኩ እናገራለሁ (ኩኪ መቁረጫ) እና የ REST API አገልግሎትን በ C ++ ውስጥ ለመፃፍ ዶከር / ዶከር-ኮምፖዝ እና የኮን ፓኬጅ ማኔጀርን በመጠቀም።

እንደ ደጋፊ ገንቢ በተሳተፍኩበት በሚቀጥለው ሃካቶን፣ ቀጣዩን ማይክሮ አገልግሎት ለመጻፍ ምን መጠቀም እንዳለብኝ ጥያቄው ተነሳ። እስካሁን የተፃፈው ሁሉ በእኔ እና በእኔ ነው የተፃፈው ጓደኛ በፓይዘን ውስጥ፣ የስራ ባልደረባዬ በዚህ መስክ ኤክስፐርት ስለነበረ እና በፕሮፌሽናል የድጋፍ ድጋፍ ስላዳበረ፣ እኔ በአጠቃላይ የተከተተ ሲስተም ገንቢ ሆኜ በትልቁ እና በአስፈሪው C++ ውስጥ ጽፌ ነበር፣ እና ፓይዘንን ገና በዩኒቨርሲቲ ተማርኩ።

ስለዚህ, ከፍተኛ ጭነት ያለው አገልግሎት የመጻፍ ሥራ አጋጥሞናል, ዋናው ሥራው ወደ እሱ የሚመጡትን መረጃዎች አስቀድመው ማዘጋጀት እና ወደ ዳታቤዝ መፃፍ ነበር. እና ሌላ የጢስ ጭስ ከተቋረጠ በኋላ አንድ ጓደኛዬ እኔ እንደ C++ ገንቢ ይህንን አገልግሎት ጥቅሞቹን በመጠቀም እንድጽፍ ሐሳብ አቀረበ። ይህ ፈጣን, የበለጠ ውጤታማ እና በአጠቃላይ, ዳኞች የቡድኑን ሀብቶች እንዴት ማስተዳደር እንዳለብን እንዴት እንደምናውቅ በመሟገት ይደሰታሉ. እኔም በC++ እንደዚህ አይነት ስራዎች ሰርቼ እንደማላውቅ እና ቀሪውን 20+ ሰአታት በቀላሉ ተስማሚ ቤተ-መጻህፍት ፍለጋ፣ማጠናቀር እና ማገናኘት እንደምችል መለስኩለት። በቀላል አነጋገር ዶሮ ወጣሁ። ያ ነው የወሰንነው እና ሁሉንም ነገር በፒቲን ውስጥ በእርጋታ አጠናቅቀን።

አሁን፣ በግዳጅ ራስን ማግለል ወቅት፣ በC++ ውስጥ አገልግሎቶችን እንዴት መፃፍ እንዳለብኝ ለማወቅ ወሰንኩ። የመጀመሪያው ነገር ተስማሚ ቤተ-መጽሐፍት ላይ መወሰን ነበር. ምርጫዬ ወደቀ POCOበነገር ተኮር ዘይቤ ስለተጻፈ እና በመደበኛ ሰነዶችም ይመካል። እንዲሁም የመሰብሰቢያ ስርዓትን ስለመምረጥ ጥያቄው ተነሳ. እስከዚህ ነጥብ ድረስ የሰራሁት ከቪዥዋል ስቱዲዮ፣ IAR እና በባዶ ሜካፋይሎች ብቻ ነው። እና ሙሉውን አገልግሎት በዶክተር ኮንቴይነር ውስጥ ለማስኬድ ስላቀድኩ ከእነዚህ ስርዓቶች ውስጥ አንዳቸውም አልወደዱኝም። ከዚያም cmake እና የሚስብ የጥቅል አስተዳዳሪን ለማወቅ ለመሞከር ወሰንኩ እሺ. ይህ የጥቅል አስተዳዳሪ ሁሉንም ጥገኞች በአንድ ፋይል ውስጥ እንዲመዘግቡ ፈቅዶልዎታል።

conanfile.txt
[ይጠይቃል]ፖኮ/1.9.3
libpq/11.5

[ጄነሬተሮች] cmake

እና በቀላል ትዕዛዝ "conan install." አስፈላጊዎቹን ቤተ-መጻሕፍት ይጫኑ. በተፈጥሮ, ለውጦችን ማድረግም አስፈላጊ ነበር

CMakeLists.txt

include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})

ከዚያ በኋላ ከPosgreSQL ጋር ለመስራት ብዙም ልምድ ያልነበረኝ እና የፓይዘን አገልግሎታችን የሚገናኘው እሱ ስለሆነ ከ PostgreSQL ጋር ለመስራት ቤተ-መጽሐፍት መፈለግ ጀመርኩ። እና የተማርኩትን ታውቃለህ? በPOCO ውስጥ ነው! ነገር ግን ኮናን በPOCO ውስጥ እንዳለ አያውቅም እና እንዴት እንደሚገነባ አያውቅም፤ በማከማቻው ውስጥ ጊዜው ያለፈበት የውቅር ፋይል አለ (ስለዚህ ስህተት ቀደም ሲል ለPOCO ፈጣሪዎች ጽፌያለሁ)። ይህ ማለት ሌላ ቤተ-መጽሐፍት መፈለግ አለብዎት ማለት ነው.

እና ከዚያ ምርጫዬ ባነሰ ታዋቂ ቤተ-መጽሐፍት ላይ ወደቀ libpg. እና በሚያስደንቅ ሁኔታ እድለኛ ነበርኩ ፣ ቀድሞውኑ በኮን ውስጥ ነበር እናም እየተሰበሰበ እና እየተሰበሰበም ነበር።

ቀጣዩ እርምጃ ጥያቄዎችን ማስተናገድ የሚችል የአገልግሎት አብነት መፃፍ ነበር።
የእኛን TemplateServerApp ክፍል ከPoco::Util::ServerApplication መውረስ እና ዋናውን ዘዴ መሻር አለብን።

TemplateServerApp

#pragma once

#include <string>
#include <vector>
#include <Poco/Util/ServerApplication.h>

class TemplateServerApp : public Poco::Util::ServerApplication
{
    protected:
        int main(const std::vector<std::string> &);
};

int TemplateServerApp::main(const vector<string> &)
{
    HTTPServerParams* pParams = new HTTPServerParams;

    pParams->setMaxQueued(100);
    pParams->setMaxThreads(16);

    HTTPServer s(new TemplateRequestHandlerFactory, ServerSocket(8000), pParams);

    s.start();
    cerr << "Server started" << endl;

    waitForTerminationRequest();  // wait for CTRL-C or kill

    cerr << "Shutting down..." << endl;
    s.stop();

    return Application::EXIT_OK;
}

በዋናው ዘዴ ውስጥ መለኪያዎችን ማዘጋጀት አለብን: ወደብ, የክሮች ብዛት እና የወረፋ መጠን. እና ከሁሉም በላይ፣ ለገቢ ጥያቄዎች ተቆጣጣሪን መግለጽ አለብዎት። ይህ ፋብሪካ በመፍጠር ነው

አብነት ጥያቄ ሃንድለር ፋብሪካ

class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
    virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
    {
        return new TemplateServerAppHandler;
    }
};

በእኔ ሁኔታ፣ በቀላሉ አንድ አይነት ተቆጣጣሪ ሁልጊዜ ይፈጥራል - TemplateServerAppHandler። የቢዝነስ አመክንዮአችንን የምናስቀምጥበት ይህ ነው።

TemplateServerAppHandler

class TemplateServerAppHandler : public HTTPRequestHandler
{
public:
    void handleRequest(HTTPServerRequest &req, HTTPServerResponse &resp)
    {
        URI uri(req.getURI());
        string method = req.getMethod();

        cerr << "URI: " << uri.toString() << endl;
        cerr << "Method: " << req.getMethod() << endl;

        StringTokenizer tokenizer(uri.getPath(), "/", StringTokenizer::TOK_TRIM);
        HTMLForm form(req,req.stream());

        if(!method.compare("POST"))
        {
            cerr << "POST" << endl;
        }
        else if(!method.compare("PUT"))
        {
            cerr << "PUT" << endl;
        }
        else if(!method.compare("DELETE"))
        {
            cerr << "DELETE" << endl;
        }

        resp.setStatus(HTTPResponse::HTTP_OK);
        resp.setContentType("application/json");
        ostream& out = resp.send();

        out << "{"hello":"heh"}" << endl;
        out.flush();
    }
};

ከPostgreSQL ጋር ለመስራት የክፍል አብነትም ፈጠርኩ። ቀላል SQL ለማከናወን, ለምሳሌ ሰንጠረዥ መፍጠር, አንድ ዘዴ አለ ExecuteSQL(). ለተጨማሪ ውስብስብ መጠይቆች ወይም ውሂብ ሰርስሮ ማውጣት፣ በ በኩል ግንኙነት ማግኘት አለብዎት GetConnection() እና libpg API ይጠቀሙ። (ምናልባት በኋላ ይህንን ግፍ አስተካክለው ይሆናል)።

የውሂብ ጎታ

#pragma once

#include <memory>
#include <mutex>
#include <libpq-fe.h>

class Database
{
public:
    Database();
    std::shared_ptr<PGconn> GetConnection() const;
    bool ExecuteSQL(const std::string& sql);

private:
    void establish_connection();
    void LoadEnvVariables();

    std::string m_dbhost;
    int         m_dbport;
    std::string m_dbname;
    std::string m_dbuser;
    std::string m_dbpass;

    std::shared_ptr<PGconn>  m_connection;
};

ከመረጃ ቋቱ ጋር ለማገናኘት ሁሉም መለኪያዎች የተወሰዱት ከአካባቢው ነው ፣ ስለሆነም የ .env ፋይል መፍጠር እና ማዋቀር ያስፈልግዎታል

.env

DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432

ሁሉንም ኮድ በ ላይ ማየት ይችላሉ github.

በC ++ ውስጥ የማይክሮ አገልግሎቶች። ልቦለድ ወይስ እውነት?

እና አሁን dockerfile እና docker-compose.yml የመጻፍ የመጨረሻው ደረጃ መጥቷል። እውነቱን ለመናገር, ይህ ብዙ ጊዜ ወስዷል, እና እኔ noob ስለሆንኩ ብቻ ሳይሆን, ምክንያቱም ቤተ-መጻሕፍትን በየጊዜው እንደገና መገንባት አስፈላጊ ነበር, ነገር ግን በኮንደን ጥፋቶች ምክንያት. ለምሳሌ ኮናን አስፈላጊ የሆኑትን ጥገኞች ለማውረድ፣ ለመጫን እና ለመገንባት፣ “conan install ን” ለማውረድ በቂ አይደለም፣ በተጨማሪም -s compiler.libcxx=libstdc++11 ፓራሜትር ማለፍ ያስፈልገዋል፣ አለበለዚያ ማመልከቻዎን በማገናኘት ደረጃ ላይ ብዙ ስህተቶችን ሊያገኙ ይችላሉ። ከዚህ ስህተት ጋር ለብዙ ሰዓታት ተጣብቄያለሁ እናም ይህ ጽሑፍ ሌሎች ሰዎች ይህንን ችግር በአጭር ጊዜ ውስጥ እንዲፈቱ እንደሚረዳቸው ተስፋ አደርጋለሁ።

በመቀጠል፣ docker-compose.yml ከጻፍኩ በኋላ፣ በጓደኛዬ ምክር፣ ድጋፍ ጨምሬያለሁ ኩኪ መቁረጫ እና አሁን በC++ ውስጥ ለ REST API አገልግሎት የተሟላ አብነት፣ ከተበጀ አካባቢ ጋር እና PostgreSQL ተጭኖ በቀላሉ “ኩኪ መቁረጫ” ወደ ኮንሶሉ ውስጥ በማስገባት ማግኘት ይችላሉ። https://github.com/KovalevVasiliy/cpp_rest_api_template.git" እና ከዚያ "ዶክከር-ማጠናቀር - መገንባት".

ይህ አብነት ለጀማሪዎች የREST API አፕሊኬሽኖችን በትልቁ እና በኃይለኛው፣ ነገር ግን እንደ ሲ ++ ያለ ብልሹ ቋንቋ ለማዳበር አስቸጋሪ በሆነ መንገዳቸው ላይ እንደሚረዳቸው ተስፋ አደርጋለሁ።
እንዲሁም እዚህ ለማንበብ በጣም እመክራለሁ። ይሄ ጽሑፍ. ከPOCO ጋር እንዴት እንደሚሰሩ እና የራስዎን REST API አገልግሎት እንዴት እንደሚጽፉ በበለጠ ዝርዝር ያብራራል.

ምንጭ: hab.com

አስተያየት ያክሉ