Microservices ho C++. Tšōmo kapa 'nete?

Microservices ho C++. Tšōmo kapa 'nete?

Sehloohong sena ke tla bua ka kamoo ke entseng template (cookiecutter) le ho theha tikoloho ea ho ngola tšebeletso ea REST API ho C ++ ho sebelisa docker / docker-compose le mookameli oa sephutheloana sa conan.

Nakong ea hackathon e latelang, eo ke ileng ka kenya letsoho ho eona ke le moqapi oa backend, potso e ile ea hlaha mabapi le hore na ke sebelise eng ho ngola microservice e latelang. Ntho e 'ngoe le e' ngoe e ngotsoeng ho fihlela joale e ngotsoe ke 'na le oa ka motsoalle ho Python, kaha mosebetsi-'moho le 'na e ne e le setsebi lefapheng lena le li-backend tse tsoetseng pele tse tsoetseng pele, ha ka kakaretso ke ne ke le moqapi oa litsamaiso tse kenyelletsoeng' me ke ngotse ho C ++ e kholo le e tšabehang, 'me ke sa tsoa ithuta Python univesithing.

Kahoo, re ne re tobane le mosebetsi oa ho ngola tšebeletso e boima, mosebetsi o ka sehloohong e neng e le ho lokisa data e tlang ho eona le ho e ngola ho database. 'Me ka mor'a khefu e' ngoe ea mosi, motsoalle e mong o ile a etsa tlhahiso ea hore 'na, joaloka moqapi oa C ++, ke ngole tšebeletso ena ke sebelisa melemo. Ho pheha khang ka sena ke hore e tla ba kapele, e be le tlhahiso e eketsehileng, 'me ka kakaretso, lekhotla la lekhotla le tla thabela kamoo re tsebang ho laola lisebelisoa tsa sehlopha. Eo ke ileng ka araba ka hore ha ho mohla nkileng ka etsa lintho tse joalo ho C ++ 'me ke ne ke khona ho sebelisa lihora tse setseng tsa 20+ ho batla, ho hlophisa le ho hokahanya lilaebrari tse loketseng. Ka mantsoe a bonolo feela, ke ile ka tsieleha. Ke seo re ileng ra se etsa mme ra phethela ntho e 'ngoe le e' ngoe Python ka khutso.

Hona joale, nakong ea ho itšehla thajana, ke ile ka etsa qeto ea ho fumana mokhoa oa ho ngola litšebeletso ho C ++. Ntho ea pele eo u lokelang ho e etsa e ne e le ho etsa qeto ka laebrari e loketseng. Khetho ea ka e ile ea oela POCO, kaha e ne e ngotsoe ka mokhoa o sekametseng nthong ’me e boetse e ithorisa ka litokomane tse tloaelehileng. Hape, potso e ile ea hlaha mabapi le ho khetha tsamaiso ea kopano. Ho fihlela mona ke sebelitse feela le Visual Studio, IAR le li-makefiles tse se nang letho. 'Me ha ho le e' ngoe ea litsamaiso tsena e ileng ea nkhahla, kaha ke ne ke rerile ho tsamaisa tšebeletso eohle ka setshelo sa docker. Eaba ke etsa qeto ea ho leka ho tseba cmake le mookameli oa sephutheloana se thahasellisang conan. Motsamaisi ona oa sephutheloana o u lumelletse ho ngolisa litšepiso tsohle faeleng e le 'ngoe

conanfile.txt
[e hloka]poco/1.9.3
libpq/11.5

[lijenereithara] cmake

le ka taelo e bonolo "conan install ." kenya lilaebrari tse hlokahalang. Ka tlhaho, ho ne ho boetse ho hlokahala ho etsa liphetoho ho

CMakeLists.txt

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

Ka mor'a moo, ke ile ka qala ho batla laebrari ho sebetsa le PostgreSQL, kaha ke eona eo ke neng ke e-na le phihlelo e fokolang ea ho sebetsa le eona, hape e ne e boetse e le eona eo litšebeletso tsa rona tsa Python li neng li sebelisana le tsona. Hona na ua tseba hore na ke ithutile eng? E POCO! Empa Conan ha a tsebe hore e ho POCO mme ha a tsebe ho e haha; ho na le faele ea khale ea tlhophiso sebakeng sa polokelo (ke se ke ngotse ka phoso ena ho baetsi ba POCO). Sena se bolela hore o tla tlameha ho batla laebrari e 'ngoe.

Eaba khetho ea ka e oela laebraring e sa tsejoeng haholo libpg. 'Me ke ne ke e-na le mahlohonolo a makatsang, e ne e se e ntse e le conan' me e ntse e bokelloa le ho bokelloa.

Mohato o latelang e ne e le ho ngola template ea tšebeletso e ka sebetsanang le likōpo.
Re tlameha ho rua sehlopha sa rona sa TemplateServerApp ho tsoa ho Poco::Util::ServerApplication le ho hlakola mokhoa oa mantlha.

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

Ka mokhoa o ka sehloohong re tlameha ho beha litekanyo: koung, palo ea likhoele le boholo ba queue. Mme sa bohlokwa le ho feta, o tlameha ho hlakisa motshwari bakeng sa dikopo tse tlang. Sena se etsoa ka ho theha feme

TemplateRequestHandlerFactory

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

Tabeng ea ka, e mpa e theha sebatli se tšoanang nako le nako - TemplateServerAppHandler. Mona ke moo re ka behang mabaka a rona a khoebo.

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

Ke boetse ke thehile template ea sehlopha ho sebetsa le PostgreSQL. Ho etsa SQL e bonolo, joalo ka ho theha tafole, ho na le mokhoa PhethaSQL(). Bakeng sa lipotso tse thata kapa ho khutlisa data, o tla tlameha ho fumana khokahano ka GetConnection() 'me u sebelise libpg API. (Mohlomong hamorao ke tla lokisa ho hloka toka hona).

polokelongtshedimosetso

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

Likarolo tsohle tsa ho hokela ho database li nkiloe tikolohong, kahoo o hloka ho theha le ho lokisa faele ea .env.

.env

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

U ka bona khoutu eohle ho github.

Microservices ho C++. Tšōmo kapa 'nete?

'Me joale ho tla mohato oa ho qetela oa ho ngola dockerfile le docker-compose.yml. Ho bua 'nete, sena se ile sa nka nako e ngata, eseng feela hobane ke le noob, hobane ho ne ho hlokahala ho tsosolosa lilaebrari nako le nako, empa ka lebaka la maraba a conan. Mohlala, e le hore conan e khoasolle, e kenye le ho aha litšepe tse hlokahalang, ha ea lekana hore e ka khoasolla "conan install .", e boetse e hloka ho feta -s compiler.libcxx=libstdc++11 parameter, ho seng joalo. o ipeha kotsing ea ho fumana liphoso tse ngata sethaleng sa khokahano kopo ea hau. Ke 'nile ka khomarela phoso ena ka lihora tse' maloa 'me ke tšepa hore sehlooho sena se tla thusa batho ba bang ho rarolla bothata bona ka nako e khutšoanyane.

Ka mor'a moo, ka mor'a ho ngola docker-compose.yml, ka keletso ea motsoalle oa ka, ke ile ka eketsa tšehetso sekontiri 'me joale u ka iphumanela template e felletseng ea ts'ebeletso ea REST API ho C ++, e nang le tikoloho e ikhethileng, mme PostgreSQL e kentsoe, feela ka ho kenya "cookiecutter" ka har'a khomphutha. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" 'Me joale "docker-compose up -build".

Ke ts'epa hore template ena e tla thusa ba qalang tseleng ea bona e thata ea ho nts'etsapele lits'ebetso tsa REST API ka mokhoa o moholo le o matla, empa puo e makatsang joalo ka C ++.
Hape, ke khothaletsa haholo ho bala mona sena sehloho. E hlalosa ka botlalo mokhoa oa ho sebetsa le POCO le ho ngola ts'ebeletso ea hau ea REST API.

Source: www.habr.com

Eketsa ka tlhaloso