Microservices hauv C ++. Cov ntawv tseeb los yog kev muaj tiag?

Microservices hauv C ++. Cov ntawv tseeb los yog kev muaj tiag?

Hauv tsab xov xwm no kuv yuav tham txog yuav ua li cas kuv tsim tus qauv (cookiecutter) thiab teeb tsa ib puag ncig rau kev sau cov kev pabcuam REST API hauv C ++ siv docker / docker-compose thiab tus thawj tswj pob conan.

Thaum lub sijhawm hackathon tom ntej, uas kuv tau koom nrog ua tus tsim tawm backend, cov lus nug tshwm sim txog dab tsi siv los sau cov microservice tom ntej. Txhua yam uas tau sau los txog tam sim no yog sau los ntawm kuv thiab kuv phooj ywg hauv Python, txij li kuv cov npoj yaig yog ib tus kws tshaj lij hauv qhov haujlwm no thiab tsim cov haujlwm backends, thaum kuv feem ntau yog tus tsim cov kab ke tsim thiab sau rau hauv C ++ zoo thiab txaus ntshai, thiab kuv nyuam qhuav kawm Python hauv tsev kawm ntawv.

Yog li, peb tau ntsib nrog txoj haujlwm ntawm kev sau cov kev pabcuam siab, lub luag haujlwm tseem ceeb ntawm uas yog ua ntej cov ntaub ntawv tuaj rau nws thiab sau rau hauv cov ntaub ntawv. Thiab tom qab lwm cov pa luam yeeb tawg, ib tus phooj ywg tau hais tias kuv, ua tus tsim C ++, sau cov kev pabcuam no siv cov txiaj ntsig zoo. Kev sib cav qhov no yog tias nws yuav nrawm dua, muaj txiaj ntsig ntau dua, thiab feem ntau, pawg txiav txim siab yuav zoo siab nrog peb paub yuav ua li cas tswj hwm pab pawg cov peev txheej. Qhov uas kuv tau teb tias kuv tsis tau ua tej yam zoo li no hauv C ++ thiab tuaj yeem yooj yim mob siab rau 20+ teev ntxiv rau kev tshawb nrhiav, sau thiab txuas cov tsev qiv ntawv tsim nyog. Cias muab, kuv qaib tawm. Qhov ntawd yog qhov peb tau txiav txim siab thiab ua tiav txhua yam hauv Python.

Tam sim no, thaum lub sij hawm yuam kev cais tus kheej, kuv txiav txim siab seb yuav sau cov kev pab cuam hauv C ++ li cas. Thawj qhov uas yuav tsum tau ua yog txiav txim siab rau lub tsev qiv ntawv tsim nyog. Kuv qhov kev xaiv poob rau POCO, txij li nws tau sau nyob rau hauv ib yam khoom-taw qhia kom paub thiab kuj boasted ib txwm cov ntaub ntawv. Tsis tas li ntawd, cov lus nug tshwm sim txog kev xaiv ib qho kev sib dhos. Txog rau tam sim no kuv tsuas yog ua haujlwm nrog Visual Studio, IAR thiab liab qab makefiles. Thiab tsis muaj ib qho ntawm cov tshuab no tau thov rau kuv, txij li kuv tau npaj yuav khiav tag nrho cov kev pabcuam hauv lub thawv docker. Tom qab ntawd kuv txiav txim siab los sim txiav txim siab cmake thiab tus thawj tswj pob nthuav conan. Tus thawj tswj pob no tso cai rau koj sau npe txhua qhov kev vam khom hauv ib cov ntaub ntawv

conanfile.txt
[requires]poco/1.9.3
lib/11.5

[generators] ua

thiab nrog cov lus txib yooj yim "conan install ." nruab cov tsev qiv ntawv tsim nyog. Lawm, nws tseem yuav tsum tau hloov mus rau

CMakeLists.txt

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

Tom qab ntawd, kuv pib nrhiav lub tsev qiv ntawv los ua haujlwm nrog PostgreSQL, vim nws yog qhov kuv tsis muaj kev paub ua haujlwm nrog, thiab nws kuj yog qhov peb cov kev pabcuam Python cuam tshuam nrog. Thiab koj puas paub qhov kuv kawm? Nws nyob hauv POCO! Tab sis conan tsis paub tias nws yog nyob rau hauv POCO thiab tsis paub yuav ua li cas los tsim nws; muaj ib tug outdated configuration ntaub ntawv nyob rau hauv lub repository (Kuv twb tau sau txog qhov yuam kev no rau cov creators ntawm POCO). Qhov no txhais tau tias koj yuav tau mus nrhiav lwm lub tsev qiv ntawv.

Thiab tom qab ntawd kuv qhov kev xaiv tau poob rau ntawm lub tsev qiv ntawv tsis tshua nyiam libpg. Thiab kuv muaj hmoo kawg, nws twb nyob rau hauv conan thiab txawm raug assembled thiab assembled.

Cov kauj ruam tom ntej yog sau cov qauv kev pabcuam uas tuaj yeem ua cov lus thov.
Peb yuav tsum tau txais peb lub TemplateServerApp chav kawm los ntawm Poco::Util::ServerApplication thiab override lub ntsiab txoj kev.

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;
}

Nyob rau hauv txoj kev tseem ceeb peb yuav tsum teeb qhov tsis: chaw nres nkoj, xov tooj ntawm threads thiab queue loj. Thiab qhov tseem ceeb tshaj, koj yuav tsum qhia tus neeg tuav ntaub ntawv rau kev thov tuaj. Qhov no yog ua los ntawm kev tsim lub Hoobkas

TemplateRequestHandlerFactory

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

Hauv kuv qhov xwm txheej, nws tsuas yog tsim tib tus tuav txhua lub sijhawm - TemplateServerAppHandler. Qhov no yog qhov uas peb tuaj yeem tso peb txoj kev lag luam logic.

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();
    }
};

Kuv kuj tau tsim ib chav kawm template los ua haujlwm nrog PostgreSQL. Txhawm rau ua SQL yooj yim, xws li tsim lub rooj, muaj ib txoj hauv kev ExecuteSQL(). Rau ntau cov lus nug nyuaj lossis cov ntaub ntawv rov qab, koj yuav tsum tau txais kev sib txuas ntawm GetConnection() thiab siv libpg API. (Tej zaum tom qab kuv yuav kho qhov kev tsis ncaj ncees no).

database

#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;
};

Txhua qhov tsis sib txuas rau cov ntaub ntawv khaws cia yog coj los ntawm ib puag ncig, yog li koj kuj yuav tsum tsim thiab teeb tsa cov ntaub ntawv .env

.env

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

Koj tuaj yeem pom tag nrho cov cai ntawm github.

Microservices hauv C ++. Cov ntawv tseeb los yog kev muaj tiag?

Thiab tam sim no los txog theem kawg ntawm kev sau cov dockerfile thiab docker-compose.yml. Ua kom ncaj ncees, qhov no tau siv sijhawm ntau, thiab tsis yog vim kuv yog noob xwb, vim tias nws yuav tsum tsim kho cov tsev qiv ntawv txhua lub sijhawm, tab sis vim yog lub pitfalls ntawm conan. Piv txwv li, txhawm rau kom conan rub tawm, nruab thiab tsim kom muaj kev vam khom tsim nyog, nws tsis txaus rau nws rub tawm "conan install.", nws kuj yuav tsum dhau qhov -s compiler.libcxx=libstdc++ 11 parameter, txwv tsis pub. koj pheej hmoo tau txais ntau yam yuam kev ntawm theem txuas koj daim ntawv thov. Kuv tau nyam nrog qhov yuam kev no rau ob peb teev thiab kuv vam tias tsab xov xwm no yuav pab lwm tus neeg daws qhov teeb meem no hauv lub sijhawm tsawg.

Tom qab ntawd, tom qab sau docker-compose.yml, ntawm cov lus qhia ntawm kuv tus phooj ywg, kuv ntxiv kev txhawb nqa khob noom cookie thiab tam sim no koj tuaj yeem tau txais koj tus kheej ib daim qauv ua tiav rau REST API cov kev pabcuam hauv C ++, nrog rau qhov chaw tsim kho, thiab PostgreSQL ntsia, yooj yim los ntawm kev nkag mus rau "cookiecutter" rau hauv lub console. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Thiab ces "docker-compose up-build".

Kuv vam tias cov qauv no yuav pab cov neeg pib ntawm lawv txoj kev nyuaj ntawm kev tsim REST API cov ntawv thov hauv qhov zoo thiab muaj zog, tab sis cov lus tsis zoo li C ++.
Tsis tas li ntawd, kuv xav kom nyeem ntawm no qhov no tsab xov xwm. Nws piav qhia ntau ntxiv txog yuav ua li cas ua haujlwm nrog POCO thiab sau koj tus kheej REST API kev pabcuam.

Tau qhov twg los: www.hab.com

Ntxiv ib saib