Microservices na C++. Akụkọ ifo ma ọ bụ eziokwu?

Microservices na C++. Akụkọ ifo ma ọ bụ eziokwu?

N'isiokwu a, m ga-ekwu maka otu m si mepụta template (cookiecutter) ma guzobe gburugburu maka ide ọrụ API REST na C ++ site na iji docker / docker-compose na njikwa ngwugwu conan.

N'oge hackathon na-esote, nke m sonye dị ka onye nrụpụta azụ azụ, ajụjụ ahụ bilitere banyere ihe ị ga-eji dee microservice na-esote. Ihe niile edere ugbu a bụ nke m na nke m dere ibe na Python, ebe ọ bụ na onye ọrụ ibe m bụ ọkachamara n'ọhịa a na ọkachamara mepụtara azụ azụ, ebe m bụ onye na-emepụta usoro agbakwunyere ma dee na C ++ dị egwu ma dị egwu, na m mụtara Python na mahadum.

Ya mere, anyị chere ọrụ nke ide ọrụ dị elu, nke bụ isi ọrụ ya bụ iji dozie data na-abịa na ya ma dee ya na nchekwa data. Ma mgbe nkwụsịtụ anwụrụ ọkụ ọzọ gasịrị, enyi m tụrụ aro ka m, dịka onye mmepụta C ++, jiri uru ndị ahụ dee ọrụ a. Na-arụ ụka na nke a bụ na ọ ga-adị ngwa ngwa, na-arụpụta ihe, na n'ozuzu ya, ndị juri ga-enwe obi ụtọ ka anyị si mara ka esi ejikwa ihe onwunwe nke otu. M zara ya na emebeghị m ihe ndị dị otú ahụ na C++ na enwere ike itinye awa 20+ fọdụrụnụ n'ụzọ dị mfe n'ịchọ, na-achịkọta na ijikọ ọba akwụkwọ ndị kwesịrị ekwesị. N'ikwu ya n'ụzọ dị mfe, apụrụ m ya. Nke ahụ bụ ihe anyị kpebiri wee jiri nwayọọ mechaa ihe niile na Python.

Ugbu a, n'oge ikewapụ onwe m mmanye, ekpebiri m ịchọpụta otu esi ede ọrụ na C++. Ihe mbụ ị ga-eme bụ ikpebi ụlọ ọbá akwụkwọ kwesịrị ekwesị. Nhọrọ m dabara POCO, ebe ọ bụ na e dere ya n'ụdị gbadoro ụkwụ n'ihe ma na-etu ọnụ akwụkwọ nkịtị. Ọzọkwa, ajụjụ bilitere banyere ịhọrọ usoro mgbakọ. Ruo ugbu a, naanị m na-arụ ọrụ na Visual Studio, IAR na makefiles efu. Ma ọ dịghị nke ọ bụla n'ime usoro ndị a masịrị m, ebe ọ bụ na m mere atụmatụ ịrụ ọrụ ahụ dum n'ime akpa docker. Mgbe ahụ, ekpebiri m ịnwale ịchọpụta cmake na onye njikwa ngwugwu na-adọrọ mmasị conan. Onye njikwa ngwugwu a nyere gị ohere ịdebanye aha ndabere niile n'otu faịlụ

conanfile.txt
[chọrọ] poco/1.9.3
libpq/11.5

[generators] cmake

na iwu dị mfe "conan install." wụnye ọba akwụkwọ ndị dị mkpa. Dị ka o kwesịrị ịdị, ọ dịkwa mkpa ime mgbanwe

CMakeLists.txt

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

Mgbe nke ahụ gasịrị, amalitere m ịchọ ọbá akwụkwọ ka mụ na PostgreSQL na-arụ ọrụ, ebe ọ bụ na ọ bụ nke m na-enwechaghị ahụmahụ na-arụ ọrụ, ọ bụkwa ya bụ nke ọrụ Python anyị na-emekọrịta ihe. Ị̀ makwa ihe m mụtara? Ọ dị na POCO! Ma conan amaghị na ọ dị na POCO ma ọ maghị otú e si ewu ya; enwere faịlụ nhazi oge ochie na ebe nchekwa (Edela m akwụkwọ banyere njehie a nye ndị kere POCO). Nke a pụtara na ị ga-achọ ụlọ akwụkwọ ọzọ.

Ma nhọrọ m dabara n'ọbá akwụkwọ na-ewu ewu na-adịchaghị ewu ewu libpg. Ma enwere m nnukwu chioma, ọ dịlarị na conan na a na-agbakọta ma na-agbakọta.

Nzọụkwụ ọzọ bụ ide ndebiri ọrụ nwere ike hazie arịrịọ.
Anyị ga-eketa klas TemplateServerApp anyị site na Poco::Util::ServerApplication wee mebie usoro bụ isi.

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

Na isi usoro anyị ga-edozi parameters: ọdụ ụgbọ mmiri, ọnụ ọgụgụ nke eri na kwụ n'ahịrị size. Ma nke kachasị mkpa, ị ga-ezipụta onye na-ahụ maka arịrịọ mbata. A na-eme nke a site na ịmepụta ụlọ ọrụ mmepụta ihe

TemplateRequestHandlerFactory

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

N'ọnọdụ m, ọ na-emepụta otu onye na-ahụ maka oge ọ bụla - TemplateServerAppHandler. Nke a bụ ebe anyị nwere ike itinye mgbagha azụmahịa anyị.

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

Emekwara m template klas iji soro PostgreSQL rụọ ọrụ. Iji mee SQL dị mfe, dị ka ịmepụta tebụl, enwere usoro ExecuteSQL(). Maka ajụjụ dị mgbagwoju anya ma ọ bụ iweghachi data, ị ga-enweta njikọ site na GetConnect() wee jiri libpg API. (Ma eleghị anya ma emechaa m ga-edozi ikpe na-ezighị ezi a).

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

A na-ewepụta paramita niile maka ijikọ na nchekwa data site na gburugburu ebe obibi, yabụ ịkwesịrị ịmepụta na hazie faịlụ .env.

.nke

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

Ị nwere ike ịhụ koodu niile na github.

Microservices na C++. Akụkọ ifo ma ọ bụ eziokwu?

Ma ugbu a na-abịa ọkwa ikpeazụ nke ide dockerfile na docker-compose.yml. N'ikwu eziokwu, nke a na-ewe ọtụtụ oge, ọ bụghịkwa naanị n'ihi na m bụ noob, n'ihi na ọ dị mkpa iji wughachi ụlọ akwụkwọ oge ọ bụla, ma n'ihi ọnyà nke conan. Dịka ọmụmaatụ, ka conan wee budata, wụnye ma wuo ihe ndabere dị mkpa, ọ gaghị ezuru ya ibudata "conan install," ọ ga-agafekwa -s compiler.libcxx=libstdc++11 parameter, ma ọ bụghị ya. ị nwere ike ịnweta ụyọkọ mperi na njikọ njikọ ngwa gị. Anọgidewo m na njehie a ruo ọtụtụ awa ma enwere m olileanya na isiokwu a ga-enyere ndị ọzọ aka dozie nsogbu a na obere oge.

Na-esote, ka m dechara docker-compose.yml, na ndụmọdụ enyi m, agbakwunyere m nkwado onye kuki ma ugbu a, ị nwere ike nweta onwe gị template zuru oke maka ọrụ REST API na C ++, na gburugburu ebe obibi ahaziri ahazi, na PostgreSQL arụnyere, nanị site n'itinye "cookiecutter" na njikwa. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Ma mgbe ahụ "docker-compose up - wuo".

Enwere m olileanya na ndebiri a ga-enyere ndị mbido aka n'ụzọ siri ike ha na-emepe ngwa REST API dị ukwuu ma dị ike, mana asụsụ dị nro dị ka C ++.
Ọzọkwa, a na m akwado ịgụ akwụkwọ ebe a nke a edemede. Ọ na-akọwa n'ụzọ zuru ezu otu esi arụ ọrụ na POCO wee dee ọrụ REST API nke gị.

isi: www.habr.com

Tinye a comment