Microservices muC++. Fiction kana kuti chokwadi?

Microservices muC++. Fiction kana kuti chokwadi?

Muchikamu chino ndichataura nezve masikirwo andakaita template (cookiecutter) uye kumisikidza nharaunda yekunyora REST API sevhisi muC ++ uchishandisa docker/docker-compose uye conan package maneja.

Munguva yehackathon yakatevera, yandakapinda semugadziri webackend, mubvunzo wakamuka wezvekushandisa kunyora iyo inotevera microservice. Zvese zvakanyorwa kusvika zvino zvakanyorwa neni newangu comrade muPython, sezvo wandaishanda naye aive nyanzvi mune iyi ndima uye nehunyanzvi akagadziridzwa backends, nepo ini ndanga ndiri akamisikidzwa masisitimu ekuvandudza uye ndakanyora mune yakakura uye inotyisa C ++, uye ini ndichangodzidza Python kuyunivhesiti.

Saka, takanga takatarisana nebasa rekunyora basa repamusoro-soro, iro basa guru raiva rekugadzirisa dheta raiuya kwairi uye rinyore kune database. Uye mushure meimwe zororo rehutsi, shamwari yakakurudzira kuti ini, semugadziri weC ++, ndinyore sevhisi iyi ndichishandisa zvakanakira. Kupokana izvi ndezvekuti ichakurumidza, inobudirira, uye kazhinji, jury ichafadzwa nemaziviro atinoita mabatiro ezviwanikwa zvechikwata. Kwandakapindura kuti ndakanga ndisati ndamboita zvinhu zvakadaro muC ++ uye ndaigona kushandisa nyore nyore maawa e20+ akasara pakutsvaga, kuunganidza nekubatanidza maraibhurari akakodzera. Kungotaura zvishoma, ndakazvishingisa. Ndizvo zvatakasarudza uye takadzikama takapedza zvese muPython.

Zvino, panguva yekumanikidzwa kuzviparadzanisa nevamwe, ndakafunga kufunga kuti ndinganyora sei masevhisi muC ++. Chinhu chokutanga kuita chakanga chiri chokusarudza pamusoro peraibhurari yakakodzera. Sarudzo yangu yakawira pasi POCO, sezvo rakanga rakanyorwa nenzira yokureva chinhu uyewo richidada nemagwaro akajairika. Zvakare, mubvunzo wakamuka pamusoro pekusarudza hurongwa hwegungano. Kusvika panguva ino ndangoshanda neVisual Studio, IAR uye isina makefiles. Uye hapana yeaya masisitimu yakandifadza, sezvo ndakaronga kumhanyisa sevhisi yese mumudziyo wedocker. Ipapo ndakafunga kuyedza kufunga cmake uye inonakidza package maneja conan. Uyu maneja wepakeji akakubvumidza iwe kunyoresa zvese zvinotsamira mufaira rimwe

conanfile.txt
[inoda]poco/1.9.3
libpq/11.5

[jenareta] cmake

uye nemurairo uri nyore "conan install ." kuisa maraibhurari anodiwa. Sezvingatarisirwa, zvakanga zvakakodzerawo kuita chinjo ku

CMakeLists.txt

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

Mushure meizvozvo, ndakatanga kutsvaga raibhurari yekushanda nePostgreSQL, sezvo iri iyo yandaive ndisina ruzivo rwekushanda nayo, uye zvakare ndiyo iyo masevhisi edu ePython aipindirana nawo. Uye unoziva here zvandakadzidza? Iri muPOCO! Asi conan haazive kuti iri muPOCO uye haazive mavakirwo ayo; kune faira rekare rekugadzirisa mune repository (ndatonyora nezve kukanganisa uku kune vagadziri vePOCO). Izvi zvinoreva kuti uchafanirwa kutsvaga imwe raibhurari.

Uye ipapo sarudzo yangu yakawira paraibhurari isinganyanyozivikanwa libpg. Uye ndakaita rombo rakanaka, rakanga ratova muconan uye rakanga richitounganidzwa nekuunganidzwa.

Nhanho inotevera yaive yekunyora sevhisi template inogona kugadzirisa zvikumbiro.
Isu tinofanirwa kugara nhaka yedu TemplateServerApp kirasi kubva kuPoco ::Util ::ServerApplication uye kupfuudza nzira huru.

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

Munzira huru tinofanira kuseta parameters: port, number of threads and queue size. Uye zvakanyanya kukosha, iwe unofanirwa kutsanangura mubati wezvikumbiro zvinouya. Izvi zvinoitwa nekugadzira fekitari

TemplateRequestHandlerFactory

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

Mune yangu, inongogadzira iyo imwechete mubati nguva dzese - TemplateServerAppHandler. Apa ndipo patinogona kuisa bhizinesi redu 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();
    }
};

Ini zvakare ndakagadzira kirasi template yekushanda nePostgreSQL. Kuita SQL iri nyore, sekugadzira tafura, pane nzira ExecuteSQL (). Kuti uwane mamwe mibvunzo yakaoma kana kudzoreredza data, uchafanirwa kuwana chinongedzo kuburikidza GetConnection() uye shandisa iyo libpg API. (Zvichida gare gare ndichagadzirisa kusaruramisira uku).

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

Yese ma paramita ekubatanidza kune dhatabhesi anotorwa kubva kunharaunda, saka iwe zvakare unofanirwa kugadzira uye kugadzirisa iyo .env faira.

.env

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

Unogona kuona kodhi yese pa github.

Microservices muC++. Fiction kana kuti chokwadi?

Uye ikozvino kunouya nhanho yekupedzisira yekunyora iyo dockerfile uye docker-compose.yml. Kutaura chokwadi, izvi zvakatora nguva yakawanda, uye kwete chete nokuti ndiri noob, nokuti zvakanga zvakakodzera kuvakazve maraibhurari nguva dzose, asi nekuda kwezvipingamupinyi zveconan. Semuyenzaniso, kuti conan idhawunirodhe, igadzike uye ivake zvinovimbika, hazvina kukwana kuti itore "conan install.", inodawo kupfuura -s compiler.libcxx=libstdc++11 parameter, neimwe nzira. iwe uri panjodzi yekuwana boka rezvikanganiso panguva yekubatanidza application yako. Ndanga ndakabatikana nechikanganiso ichi kwemaawa akati wandei uye ndinovimba chinyorwa ichi chichabatsira vamwe vanhu kugadzirisa dambudziko iri munguva shoma.

Tevere, mushure mekunyora docker-compose.yml, pane zano reshamwari yangu, ndakawedzera rutsigiro cookiecutter uye zvino unogona kuzviwanira template yakazara-yakazara yeREST API sevhisi muC ++, ine nharaunda yakasarudzika, uye PostgreSQL yakaiswa, nekungopinza "cookiecutter" mukoni. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Uyezve "docker-compose up -kuvaka".

Ndinovimba iyi template ichabatsira vanotanga munzira yavo yakaoma yekugadzira REST API maapplication mune yakakura uye ine simba, asi mutauro wakaoma seC ++.
Zvakare, ndinokurudzira zvikuru kuverenga pano izvi article. Inotsanangura zvakadzama maitiro ekushanda nePOCO uye kunyora yako yega REST API sevhisi.

Source: www.habr.com

Voeg