Microservices di C ++ de. Fiction an rastî?

Microservices di C ++ de. Fiction an rastî?

Di vê gotarê de ez ê bipeyivim ka min çawa şablonek (cookiecutter) çêkir û hawîrdorek ji bo nivîsandina karûbarek REST API di C++ de bi karanîna docker/docker-compose û rêvebirê pakêta conan saz kir.

Di dema hackathon-a din de, ku ez tê de wekî pêşdebirek paşîn beşdar bûm, pirs derket holê ka meriv çi bikar tîne da ku mîkroxizmeta paşîn binivîse. Her tiştê ku heta niha hatiye nivîsandin ji aliyê min û min ve hatiye nivîsandin nas di Python de, ji ber ku hevkarê min di vî warî de pispor bû û bi profesyonelî paşverû pêşxistibû, dema ku ez bi gelemperî pêşdebirkerek pergalên pêvekirî bûm û bi C++-ya mezin û xedar dinivîsim, û ez nû li zanîngehê fêrî Python bûm.

Ji ber vê yekê, em bi peywira nivîsandina karûbarek bargiraniyê re rû bi rû man, ku peywira sereke ya wê ew bû ku daneyên ku jê re dihatin pêşdibistanê û li databasê binivîsin. Û piştî dûmanek din, hevalek pêşniyar kir ku ez, wekî pêşdebirek C ++, vê karûbarê bi karanîna pisporan binivîsim. Axaftina vê yekê ev e ku ew ê zûtir, hilberdartir be, û bi gelemperî, jûrî dê ji vê yekê kêfxweş bibe ku em çawa dizanin ka meriv çawa çavkaniyên tîmê birêve dibe. Ji bo ku min bersiv da ku min çu carî tiştên weha di C++-ê de nekiriye û bi hêsanî dikarim 20+ demjimêrên mayî ji lêgerîn, berhevkirin û girêdana pirtûkxaneyên guncan re veqetînim. Bi tenê gotin, min hejand. Ya ku me biryar da û bi aramî her tişt li Python qedand ev e.

Naha, di dema xwe-izolkirina bi zorê de, min biryar da ku ez fêr bibim ka meriv çawa karûbaran di C ++ de binivîsim. Yekemîn tiştê ku meriv kir biryar li ser pirtûkxaneyek minasib bû. Hilbijartina min bi ser ket diyar gule neçe, ji ber ku ew bi şêwazek objekt-oriented hate nivîsandin û hem jî pesnê xwe da belgeyên normal. Di heman demê de, pirs li ser hilbijartina pergala meclîsê derket. Heya vê gavê min tenê bi Visual Studio, IAR û pelên tazî re xebitî. Û yek ji van pergalan gazî min nekir, ji ber ku min plan kir ku tevahiya karûbarê di konteynerek dokerê de bimeşînim. Dûv re min biryar da ku hewl bidim ku cmake û rêveberek pakêtek balkêş bibînim conan. Vê rêveberê pakêtê destûr da ku hûn hemî pêwendiyan di yek pelê de tomar bikin

conanfile.txt
[hewce dike] poco/1.9.3
libpq/11.5

[jenerator] cmake

û bi fermanek hêsan "conan install ." pirtûkxaneyên pêwîst saz bikin. Bi awayekî xwezayî, di heman demê de hewce bû ku guhartinan çêbibe

CMakeLists.txt

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

Piştî wê, min dest bi lêgerîna pirtûkxaneyek kir ku bi PostgreSQL re bixebitim, ji ber ku ew yeka ku min kêm ezmûna xebatê pê re hebû, û ew jî ya ku karûbarên me yên Python pê re têkilî danî bû. Û hûn dizanin ez çi fêr bûm? Ew di POCO de ye! Lê conan nizane ku ew di POCO de ye û nizane meriv wê çawa ava bike; di depoyê de pelek mîhengê ya kevnar heye (min berê li ser vê xeletiyê ji afirînerên POCO re nivîsandiye). Ev tê vê wateyê ku hûn neçar in ku li pirtûkxaneyek din bigerin.

Û paşê hilbijartina min ket ser pirtûkxaneyek kêmtir populer libpg. Û ez pir bi şens bûm, ew jixwe di konan de bû û tewra jî dihat komkirin û berhev kirin.

Pêngava paşîn nivîsandina şablonek karûbar bû ku dikare serlêdanan bike.
Divê em çîna xwe ya TemplateServerApp ji Poco::Bikarhêner::ServerApplication mîras bistînin û rêbaza sereke ji holê rakin.

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

Di rêbaza sereke de divê em pîvanan saz bikin: port, hejmara têlan û mezinahiya rêzê. Û ya herî girîng, divê hûn ji bo daxwazên hatinî rêvekerek diyar bikin. Ev bi çêkirina kargehekê pêk tê

TemplateRequestHandlerFactory

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

Di doza min de, ew bi tenê her carê heman handler diafirîne - TemplateServerAppHandler. Li vir em dikarin mantiqa karsaziya xwe bi cîh bikin.

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

Min di heman demê de şablonek polê çêkir ku bi PostgreSQL re bixebitim. Ji bo pêkanîna SQL-ya hêsan, wekî çêkirina tabloyek, rêbazek heye ExecuteSQL(). Ji bo pirsên tevlihevtir an vegerandina daneyê, hûn ê neçar bibin ku pêwendiyek bi rê ve bibin GetConnection () û libpg API bikar bînin. (Dibe ku paşê ez vê neheqiyê rast bikim).

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

Hemî pîvanên ji bo girêdana databasê ji hawîrdorê têne girtin, ji ber vê yekê hûn jî hewce ne ku pelê .env biafirînin û mîheng bikin.

.a V

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

Hûn dikarin hemî kodê li vir bibînin github.

Microservices di C ++ de. Fiction an rastî?

Û niha qonaxa dawî ya nivîsandina dockerfile û docker-compose.yml tê. Rast be, ev pir caran girt, û ne tenê ji ber ku ez nobedar im, ji ber ku hewce bû ku her car pirtûkxane ji nû ve ava bikin, lê ji ber xefikên konan. Mînakî, ji bo ku conan dakêşîne, saz bike û girêdanên pêwîst ava bike, ne bes e ku ew dakêşîne "conan install .", di heman demê de pêdivî ye ku ew pîvana -s compiler.libcxx=libstdc++11 jî derbas bike, wekî din. hûn xeternak in ku di qonaxa girêdanê de serîlêdana xwe de komek xeletî bistînin. Ez çend demjimêran bi vê xeletiyê re mam û ez hêvî dikim ku ev gotar dê ji kesên din re bibe alîkar ku di demek kêm de vê pirsgirêkê çareser bikin.

Dûv re, piştî nivîsandina docker-compose.yml, li ser şîreta hevalê xwe, min piştgirî lê zêde kir cookiecutter û naha hûn dikarin ji bo karûbarek REST API-ya di C++ de, bi hawîrdorek xwerû, û PostgreSQL sazkirî, şablonek bêkêmasî ji bo karûbarek API-ya REST-ê ya di C++-ê de, bi tenê bi ketina "cookiecutter" di konsolê de bistînin. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Û paşê "docker-compose up -build".

Ez hêvî dikim ku ev şablon dê alîkariya destpêkeran bike li ser riya wan a dijwar a pêşdebirina serîlêdanên REST API-ya mezin û bi hêz, lê zimanek wusa neqelp wek C++.
Di heman demê de, ez pir pêşniyar dikim ku li vir bixwînin ev tişt. Ew bi hûrgulî rave dike ka meriv çawa bi POCO re bixebite û karûbarê xweya REST API-ya xwe binivîse.

Source: www.habr.com

Add a comment