Microservices a C++. Fiction ko gaskiya?

Microservices a C++. Fiction ko gaskiya?

A cikin wannan labarin zan yi magana game da yadda na ƙirƙiri samfuri (cookiecutter) da kuma kafa yanayi don rubuta sabis na API na REST a cikin C ++ ta amfani da docker/docker-compose da mai sarrafa kunshin conan.

A lokacin hackathon na gaba, wanda na shiga a matsayin mai haɓakawa na baya, tambayar ta taso game da abin da za a yi amfani da shi don rubuta microservice na gaba. Duk abin da aka rubuta zuwa yanzu ni da nawa ne suka rubuta abokin aiki a Python, tun da abokin aikina kwararre ne a wannan fanni kuma ƙwararrun ƙwararrun ƙwararrun ƙwararrun ƙwararru ce, alhali ni gabaɗaya ni mai haɓaka tsarin tsarin ne kuma na yi rubutu a cikin babban C++ mai girma, kuma na koyi Python a jami'a.

Don haka, mun fuskanci aikin rubuta sabis ɗin mai ɗaukar nauyi, wanda babban aikin shi shine tsara bayanan da ke zuwa gare shi da rubuta su a cikin ma'ajin. Kuma bayan wani hutun hayaki, wani abokina ya ba da shawarar cewa ni, a matsayina na mai haɓaka C++, in rubuta wannan sabis ɗin ta amfani da ribobi. Yin jayayya da wannan shi ne cewa zai kasance da sauri, mafi amfani, kuma gaba ɗaya, juri zai yi farin ciki da yadda muka san yadda ake sarrafa albarkatun kungiyar. Wanda na amsa da cewa ban taba yin irin waɗannan abubuwa ba a C++ kuma zan iya ba da sauran sa'o'i 20+ cikin sauƙi don bincike, tattarawa da haɗa ɗakunan karatu masu dacewa. A taƙaice, na kaɗa. Abin da muka yanke ke nan kuma muka kammala komai cikin natsuwa a Python.

Yanzu, yayin da aka tilasta wa kaina, na yanke shawarar gano yadda ake rubuta sabis a C++. Abu na farko da za a yi shi ne yanke shawara a kan ɗakin karatu mai dacewa. Zabi na ya fadi POCO, Tun da an rubuta shi a cikin salon da ya dace kuma yana alfahari da takaddun al'ada. Har ila yau, tambaya ta taso game da zabar tsarin taro. Har zuwa wannan lokacin kawai na yi aiki tare da Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin, IAR da makefiles marasa tushe. Kuma babu ɗayan waɗannan tsarin da ya burge ni, tun da na shirya gudanar da aikin gabaɗaya a cikin akwati na docker. Sa'an nan na yanke shawarar ƙoƙarin gano cmake da mai sarrafa kunshin mai ban sha'awa conan. Wannan manajan fakitin ya ba ku damar yin rajistar duk abin dogaro a cikin fayil ɗaya

conanfile.txt
[ana bukatar]poco/1.9.3
libpq/11.5

[generators] cmake

kuma tare da umarni mai sauƙi "conan shigar." shigar da dakunan karatu da suka dace. A zahiri, ya zama dole kuma a yi canje-canje

CMakeLists.txt

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

Bayan haka, na fara neman ɗakin karatu don yin aiki tare da PostgreSQL, tun da yake shi ne wanda nake da ɗan gogewa tare da shi, kuma shi ne wanda ayyukanmu na Python ke hulɗa da shi. Kuma ka san abin da na koya? Yana cikin POCO! Amma conan bai san cewa yana cikin POCO ba kuma bai san yadda ake gina shi ba; akwai tsohuwar fayil ɗin daidaitawa a cikin ma'ajiyar (Na riga na rubuta game da wannan kuskuren ga masu ƙirƙirar POCO). Wannan yana nufin za ku nemi wani ɗakin karatu.

Sannan zabina ya fada kan wani dakin karatun da ba shi da farin jini libpg. Kuma na yi sa'a mai ban mamaki, ya riga ya kasance a cikin conan har ma ana taruwa ana taruwa.

Mataki na gaba shine rubuta samfurin sabis wanda zai iya aiwatar da buƙatun.
Dole ne mu gaji aji na TemplateServerApp daga Poco::Util::ServerApplication kuma mu soke babbar hanyar.

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

A cikin babbar hanyar dole ne mu saita sigogi: tashar jiragen ruwa, adadin zaren da girman jerin gwano. Kuma mafi mahimmanci, dole ne ka saka mai kula da buƙatun masu shigowa. Ana yin haka ta hanyar ƙirƙirar masana'anta

SamfuraRequestHandlerFactory

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

A cikin yanayina, kawai yana ƙirƙirar mai sarrafa iri ɗaya kowane lokaci - TemplateServerAppHandler. Wannan shine inda zamu iya sanya dabarun kasuwancin mu.

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

Na kuma ƙirƙiri samfurin aji don aiki tare da PostgreSQL. Don yin SQL mai sauƙi, kamar ƙirƙirar tebur, akwai hanya ExecuteSQL(). Don ƙarin hadaddun tambayoyin ko dawo da bayanai, dole ne ku sami haɗi ta hanyar GetConnection() kuma amfani da libpg API. (Watakila daga baya zan gyara wannan zalunci).

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

Ana ɗaukar duk sigogi don haɗawa zuwa bayanan bayanan daga mahalli, don haka kuna buƙatar ƙirƙira da daidaita fayil ɗin .env

.env

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

Kuna iya ganin duk lambar a github.

Microservices a C++. Fiction ko gaskiya?

Kuma yanzu ya zo mataki na ƙarshe na rubuta dockerfile da docker-compose.yml. A gaskiya, wannan ya ɗauki mafi yawan lokaci, kuma ba wai kawai don ni ba ne kawai ba, saboda ya zama dole a sake gina ɗakunan karatu a kowane lokaci, amma saboda ramukan conan. Misali, domin conan ya zazzage, shigar da gina abubuwan da suka dace, bai ishe shi don saukar da “conan install .”, kuma yana buƙatar wuce madaidaicin -s compiler.libcxx=libstdc++11, in ba haka ba. kuna haɗarin samun tarin kurakurai a matakin haɗin aikace-aikacenku. Na makale da wannan kuskure na tsawon sa'o'i da yawa kuma ina fatan wannan labarin zai taimaka wa wasu mutane su magance wannan matsalar cikin ɗan lokaci kaɗan.

Na gaba, bayan rubuta docker-compose.yml, bisa shawarar abokina, na ƙara tallafi mai dafa kuki kuma yanzu za ku iya samun kanku cikakken samfuri don sabis na API na REST a cikin C ++, tare da yanayin da aka keɓance, kuma an shigar da PostgreSQL, kawai ta shigar da "cookiecutter" a cikin na'ura wasan bidiyo. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Sannan "docker-compose up-gina".

Ina fatan wannan samfuri zai taimaka wa masu farawa akan hanyarsu mai wahala ta haɓaka aikace-aikacen REST API a cikin girma da ƙarfi, amma irin wannan yare mai banƙyama kamar C ++.
Har ila yau, ina ba da shawarar karantawa a nan wannan labarin. Yana yin bayani dalla-dalla yadda ake aiki tare da POCO da rubuta sabis ɗin API na REST na ku.

source: www.habr.com

Add a comment