Microservices mu C++. Zopeka kapena zenizeni?

Microservices mu C++. Zopeka kapena zenizeni?

M'nkhaniyi ndilankhula za momwe ndinapangira template (cookiecutter) ndikukhazikitsa malo olembera ntchito ya REST API ku C ++ pogwiritsa ntchito docker / docker-compose ndi conan phukusi woyang'anira.

Pa hackathon yotsatira, momwe ndidakhala nawo ngati woyambitsa kumbuyo, funso lidawuka lazomwe mungagwiritse ntchito polemba microservice yotsatira. Zonse zomwe zalembedwa mpaka pano zidalembedwa ndi ine ndi wanga comrade ku Python, popeza mnzanga anali katswiri pa ntchitoyi ndipo amabwerera kumbuyo mwaukadaulo, pomwe nthawi zambiri ndinali wopanga makina ophatikizidwa ndikulemba mu C ++ yayikulu komanso yoyipa, ndipo ndidangophunzira Python ku yunivesite.

Kotero, tinayang'anizana ndi ntchito yolemba ntchito yolemetsa kwambiri, ntchito yaikulu yomwe inali yokonzekera deta yomwe imabwera kwa iyo ndikuyilemba ku database. Ndipo pambuyo popuma utsi wina, mnzanga adandiuza kuti, monga wopanga C ++, ndilembe ntchitoyi pogwiritsa ntchito zabwino. Kutsutsa izi ndikuti idzakhala yofulumira, yopindulitsa, ndipo kawirikawiri, oweruza adzakondwera ndi momwe timadziwira momwe tingagwiritsire ntchito zida za gulu. Kumene ndidayankha kuti sindinachitepo zinthu zotere mu C ++ ndipo ndimatha kuthera maola otsala a 20+ posaka, kupanga ndi kulumikiza malaibulale oyenera. Mwachidule, ndinangochita mantha. Ndizomwe tidasankha ndikumaliza zonse mu Python.

Tsopano, panthawi yodzipatula, ndinaganiza zolemba ntchito mu C ++. Chinthu choyamba kuchita chinali kusankha laibulale yoyenera. Kusankha kwanga kunagwera POCO, popeza linalembedwa m’njira yolunjika pa chinthu ndipo linadzitamandiranso zolembedwa zachibadwa. Komanso, funso linabuka posankha dongosolo la msonkhano. Mpaka pano ndangogwira ntchito ndi Visual Studio, IAR komanso ma fayilo opanda kanthu. Ndipo palibe machitidwe awa omwe adandisangalatsa, popeza ndidakonza zoyendetsa ntchito yonse mumtsuko wa docker. Kenako ndidaganiza zoyesa kudziwa cmake komanso woyang'anira phukusi wosangalatsa kondomu. Woyang'anira phukusili adakulolani kuti mulembetse zodalira zonse mufayilo imodzi

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

[majenereta] cmake

ndi lamulo losavuta "conan install ." kukhazikitsa malaibulale zofunika. Mwachibadwa, kunali koyeneranso kusintha

CMakeLists.txt

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

Pambuyo pake, ndinayamba kufunafuna laibulale yoti ndigwire ntchito ndi PostgreSQL, popeza inali yomwe sindinkadziwa zambiri ndikugwira nayo ntchito, ndipo inalinso yomwe ntchito zathu za Python zimagwirizana nazo. Ndipo mukudziwa zomwe ndaphunzira? Ili ku POCO! Koma conan sakudziwa kuti ili mu POCO ndipo sadziwa momwe angamangire; pali fayilo yosinthika yachikale m'malo osungira (ndalemba kale za cholakwikachi kwa omwe amapanga POCO). Izi zikutanthauza kuti muyenera kuyang'ana laibulale ina.

Ndiyeno kusankha kwanga kunagwera pa laibulale yotchuka kwambiri libpg. Ndipo ndinali ndi mwayi wodabwitsa, inali kale mu conan ndipo inali ikusonkhanitsidwa ndikusonkhanitsidwa.

Chotsatira chinali kulemba template ya utumiki yomwe ingathe kukonza zopempha.
Tiyenera kulandira kalasi yathu ya TemplateServerApp kuchokera ku Poco ::Util ::ServerApplication ndikuchotsa njira yayikulu.

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

Mu njira yayikulu tiyenera kukhazikitsa magawo: doko, kuchuluka kwa ulusi ndi kukula kwa mzere. Ndipo chofunikira kwambiri, muyenera kutchula wowongolera pazofunsira zomwe zikubwera. Izi zimachitika popanga fakitale

TemplateRequestHandlerFactory

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

Kwa ine, zimangopanga chogwirizira chomwecho nthawi zonse - TemplateServerAppHandler. Apa ndipamene titha kuyika malingaliro athu abizinesi.

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

Ndinapanganso template ya kalasi kuti ndigwire ntchito ndi PostgreSQL. Kuchita SQL yosavuta, monga kupanga tebulo, pali njira ExecuteSQL (). Pamafunso ovuta kwambiri kapena kubweza deta, muyenera kupeza kulumikizana kudzera GetConnection () ndikugwiritsa ntchito libpg API. (Mwina pambuyo pake ndikonza kusalungama kumeneku).

Nawonso achichepere

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

Magawo onse olumikizira ku database amatengedwa kuchokera ku chilengedwe, chifukwa chake muyenera kupanga ndikusintha fayilo ya .env

.fm

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

Mutha kuwona ma code onse pa github.

Microservices mu C++. Zopeka kapena zenizeni?

Ndipo tsopano pakubwera gawo lomaliza lolemba dockerfile ndi docker-compose.yml. Kunena zowona, izi zinatenga nthawi yambiri, osati chifukwa chakuti ndine noob, chifukwa kunali koyenera kumanganso malaibulale nthawi zonse, koma chifukwa cha misampha ya conan. Mwachitsanzo, kuti conan atsitse, kukhazikitsa ndi kumanga zodalira zofunika, sikokwanira kuti atsitse "conan install.", ikufunikanso kudutsa -s compiler.libcxx=libstdc++11 parameter, mwinamwake. mungakhale pachiwopsezo chopeza zolakwika zambiri panthawi yolumikizira pulogalamu yanu. Ndakhala ndi vuto ili kwa maola angapo ndipo ndikuyembekeza kuti nkhaniyi ithandiza anthu ena kuthetsa vutoli mu nthawi yochepa.

Kenako, nditalemba docker-compose.yml, paupangiri wa mnzanga, ndidawonjezera thandizo cookiecutter ndipo tsopano mutha kudzipezera template yathunthu ya ntchito ya REST API mu C ++, yokhala ndi makonda anu, ndikuyika PostgreSQL, kungolowetsa "cookiecutter" mu console. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Kenako "docker-compose up -build".

Ndikukhulupirira kuti template iyi ithandiza oyamba kumene panjira yawo yovuta yopangira mapulogalamu a REST API mu zazikulu ndi zamphamvu, koma chilankhulo chovuta ngati C ++.
Komanso, ndikupangira kuwerenga apa izi nkhani. Imalongosola mwatsatanetsatane momwe mungagwirire ntchito ndi POCO ndikulemba ntchito yanu ya REST API.

Source: www.habr.com

Kuwonjezera ndemanga