Microservices amin'ny C++. Fiction sa zava-misy?

Microservices amin'ny C++. Fiction sa zava-misy?

Amin'ity lahatsoratra ity dia hiresaka momba ny fomba namoronako môdely (cookiecutter) aho ary nanangana tontolo iray hanoratana serivisy REST API amin'ny C ++ amin'ny fampiasana docker/docker-compose sy ny mpitantana fonosana conan.

Nandritra ny hackathon manaraka, izay nandraisako anjara amin'ny maha-mpamorona ny backend ahy, dia nipoitra ny fanontaniana momba izay tokony hampiasaina hanoratana ny microservice manaraka. Izay rehetra voasoratra hatramin'izao dia izaho sy izaho no nanoratra namana amin'ny Python, satria ny mpiara-miasa amiko dia manam-pahaizana manokana amin'ity sehatra ity ary namolavola backends matihanina, raha izaho kosa dia mpandrindra rafitra napetraka ary nanoratra tamin'ny C ++ lehibe sy mahatsiravina, ary vao nianatra Python tany amin'ny oniversite aho.

Noho izany, niatrika ny asa fanoratana serivisy avo lenta izahay, ny asa lehibe indrindra dia ny fanodinana mialoha ny angon-drakitra tonga ao aminy ary manoratra izany amin'ny angon-drakitra. Ary taorian'ny fiatoana setroka hafa, nisy namana iray nanoro hevitra fa izaho, amin'ny maha-mpamorona ny C ++ ahy, dia manoratra ity serivisy ity amin'ny fampiasana ny pros. Ny ady hevitra dia ny hoe ho haingana kokoa, hamokatra kokoa, ary amin'ny ankapobeny, ny mpitsara dia ho faly amin'ny fomba hahafantarantsika ny fomba fitantanana ny loharanon'ny ekipa. Namaly aho fa tsy mbola nanao zavatra toy izany tamin'ny C ++ aho ary afaka nanokana mora foana ny 20+ ora sisa amin'ny fikarohana, fanangonana ary fampifandraisana ireo tranomboky mety. Raha tsorina, dia nikoropaka aho. Izany no nanapa-kevitray ary nahavita tamim-pahatoniana ny zava-drehetra tamin'ny Python.

Ankehitriny, nandritra ny fitokana-tena an-tery dia nanapa-kevitra ny hamantatra ny fomba hanoratana serivisy amin'ny C ++ aho. Ny zavatra voalohany tokony hatao dia ny manapa-kevitra momba ny tranomboky mety. Nilatsaka ny safidiko POCO, satria nosoratana tamin'ny fomba miompana amin'ny zava-misy izy io ary mirehareha amin'ny antontan-taratasy mahazatra ihany koa. Nipoitra koa ny fanontaniana momba ny fisafidianana rafitra fivoriambe. Hatramin'izao fotoana izao dia tsy niasa afa-tsy tamin'ny Visual Studio, IAR ary makefiles miboridana aho. Ary tsy nisy nahasarika ahy ireo rafitra ireo, satria nikasa ny hampandeha ny serivisy manontolo ao anaty container docker aho. Avy eo aho dia nanapa-kevitra ny hanandrana hamantatra cmake sy mpitantana fonosana mahaliana Conan. Ity mpitantana fonosana ity dia namela anao hanoratra ny fiankinan-doha rehetra amin'ny rakitra iray

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

[generators] cmake

ary miaraka amin'ny baiko tsotra "conan install ." mametraka ireo tranomboky ilaina. Mazava ho azy fa nilaina koa ny fanovana ny

CMakeLists.txt

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

Taorian'izay dia nanomboka nitady tranomboky hiarahana amin'ny PostgreSQL aho, satria io no tsy dia nanana traikefa niasa tamiko, ary io ihany koa no nifaneraseranay tamin'ny serivisy Python. Ary fantatrao ve izay nianarako? Ao amin'ny POCO io! Saingy tsy fantatr'i conan fa ao amin'ny POCO izy io ary tsy hainy ny manamboatra azy; misy fichier configuration efa lany andro ao amin'ny repository (efa nanoratra momba an'io fahadisoana io tamin'ny mpamorona ny POCO aho). Midika izany fa tsy maintsy mitady tranomboky hafa ianao.

Ary avy eo dia nilatsaka tamina tranomboky tsy dia malaza loatra ny safidiko libpg. Ary tena tsara vintana aho, efa ao amin'ny conan izany ary nanangona sy nanangona mihitsy aza.

Ny dingana manaraka dia ny fanoratana môdely serivisy afaka manodina ny fangatahana.
Tsy maintsy mandova ny kilasy TemplateServerApp avy amin'ny Poco::Util::ServerApplication isika ary manafoana ny fomba lehibe.

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

Amin'ny fomba lehibe dia tsy maintsy mametraka ny masontsivana: seranan-tsambo, isan'ny kofehy sy ny haben'ny filaharana. Ary ny tena zava-dehibe dia tsy maintsy mamaritra mpitantana iray ianao amin'ny fangatahana ho avy. Izany dia atao amin'ny famoronana orinasa

TemplateRequestHandlerFactory

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

Raha ny amiko, dia mamorona mpitantana iray ihany isaky ny mandeha - TemplateServerAppHandler. Eto no ahafahantsika mametraka ny lojikan'ny fandraharahantsika.

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

Namorona môdely kilasy hiasa amin'ny PostgreSQL ihany koa aho. Mba hanaovana SQL tsotra, toy ny famoronana latabatra dia misy fomba iray ExecuteSQL(). Ho an'ny fanontaniana sarotra kokoa na fakana angona, dia tsy maintsy mahazo fifandraisana amin'ny alalan'ny GetConnection() ary ampiasao ny libpg API. (Angamba any aoriana aho hanitsy izany tsy rariny izany).

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

Ny paramètre rehetra hifandraisana amin'ny angon-drakitra dia nalaina avy amin'ny tontolo iainana, noho izany dia mila mamorona sy manitsy ny rakitra .env koa ianao

.env

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

Azonao jerena ny code rehetra ao amin'ny github.

Microservices amin'ny C++. Fiction sa zava-misy?

Ary tonga ny dingana farany amin'ny fanoratana ny dockerfile sy docker-compose.yml. Raha ny marina, izany dia naka ny ankamaroan'ny fotoana, ary tsy noho izaho noob, satria ilaina ny manangana indray ny tranomboky isaky ny, fa noho ny fandrika conan. Ohatra, mba hahafahan'i conan misintona, mametraka ary manangana ireo fiankinan-doha ilaina, dia tsy ampy ny misintona "conan install .", mila mandalo ny -s compiler.libcxx=libstdc++11 ihany koa izy, raha tsy izany atahorana hahazo lesoka maro ianao amin'ny dingana fampifandraisana ny fampiharanao. Nifikitra tamin'ity hadisoana ity nandritra ny ora maromaro aho ary manantena aho fa ity lahatsoratra ity dia hanampy ny hafa hamaha ity olana ity ao anatin'ny fotoana fohy.

Avy eo, rehefa avy nanoratra docker-compose.yml, noho ny torohevitry ny namako dia nanampy fanohanana aho cookiecutter ary ankehitriny ianao dia afaka mahazo môdely feno ho an'ny serivisy REST API ao amin'ny C ++, miaraka amin'ny tontolo namboarina, ary napetraka ny PostgreSQL, amin'ny alàlan'ny fampidirana fotsiny ny "cookiecutter" ao amin'ny console. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Ary avy eo "docker-compose up -build".

Manantena aho fa ity môdely ity dia hanampy ireo vao manomboka amin'ny lalan-tsarotra amin'ny fampivelarana ny rindranasa REST API amin'ny fiteny lehibe sy mahery, saingy fiteny manjavozavo toa ny C++.
Ary koa, manoro hevitra mafy aho hamaky eto izany lahatsoratra. Manazava amin'ny antsipiriany bebe kokoa ny fomba fiasa miaraka amin'ny POCO sy ny fanoratana ny serivisy REST API anao manokana.

Source: www.habr.com

Add a comment