Ama-Microservices ku-C++. Inganekwane noma iqiniso?

Ama-Microservices ku-C++. Inganekwane noma iqiniso?

Kulesi sihloko ngizokhuluma ngendlela engadala ngayo ithempulethi (i-cookiecutter) futhi ngisethe indawo yokubhala isevisi ye-REST API ku-C ++ usebenzisa i-docker/docker-compose kanye nomphathi wephakheji le-conan.

Ngesikhathi se-hackathon elandelayo, lapho ngibambe iqhaza khona njengomthuthukisi we-backend, kwaphakama umbuzo mayelana nokuthi yini okufanele isetshenziswe ukubhala i-microservice elandelayo. Konke okulotshiwe kuze kube manje kubhalwe yimina wami umngane ePython, njengoba uzakwethu ebenguchwepheshe kulo mkhakha futhi athuthukiswe kahle, kuyilapho mina ngokuvamile ngangingumthuthukisi wezinhlelo ezishumekiwe futhi ngibhala ku-C++ enkulu nesabekayo, futhi ngisanda kufunda iPython enyuvesi.

Ngakho-ke, sasibhekene nomsebenzi wokubhala insizakalo yomthwalo omkhulu, umsebenzi oyinhloko owawuwukucubungula kusengaphambili idatha ezayo kuyo bese uyibhala ku-database. Futhi ngemva kwesinye ikhefu lentuthu, umngane uphakamise ukuthi mina, njengomthuthukisi we-C ++, ngibhale le sevisi ngisebenzisa izinzuzo. Ukuphikisa lokhu ukuthi kuzoshesha, kukhiqize kakhudlwana, futhi ngokuvamile, amajaji azojabula ngendlela esazi ngayo ukuphatha izinsiza zeqembu. Engaphendula kukho ukuthi angikaze ngenze izinto ezinjalo ku-C++ futhi nginganikela kalula amahora angama-20+ asele ekusesheni, ekuhlanganiseni nasekuxhumaniseni imitapo yolwazi efanelekile. Ngamafuphi nje, ngavele ngathuka. Yilokho esanquma ngakho futhi saqeda ngokuthula yonke into ePython.

Manje, ngesikhathi sokuzihlukanisa ngenkani, nginqume ukuthola ukuthi ngingabhala kanjani izinsiza ku-C ++. Into yokuqala okufanele yenziwe kwakuwukunquma ngomtapo ofanelekayo. Ukukhetha kwami ​​kwawela phezu Poco, njengoba lalibhalwe ngendlela eqondiswe entweni futhi futhi liqhosha ngemibhalo evamile. Futhi, kwaphakama umbuzo mayelana nokukhetha uhlelo lokuhlanganisa. Kuze kube manje ngisebenze kuphela ne-Visual Studio, i-IAR kanye nama-makefiles angenalutho. Futhi akukho neyodwa yalezi zinhlelo eyangikhanga, njengoba ngangihlele ukwenza yonke insizakalo esitsheni se-docker. Ngabe senginquma ukuzama ukuthola i-cmake kanye nomphathi wephakheji othokozisayo i-conan. Lo mphathi wephakheji ukuvumele ukuthi ubhalise konke okuncikile efayeleni elilodwa

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

[amajeneretha] cmake

futhi ngomyalo olula othi "conan install ." faka imitapo yolwazi edingekayo. Ngokwemvelo, kwakudingeka futhi ukwenza izinguquko ku

CMakeLists.txt

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

Ngemuva kwalokho, ngaqala ukufuna umtapo wolwazi engizosebenza nawo nge-PostgreSQL, njengoba bekuyiyona enganginolwazi oluncane lokusebenza nayo, futhi bekuyiyona izinsizakalo zethu zePython ezisebenzisana nayo. Uyazi ukuthi ngifundeni? Iku-POCO! Kodwa u-conan akazi ukuthi iku-POCO futhi akazi ukuthi yakha kanjani; kukhona ifayela lokumisa eliphelelwe yisikhathi endaweni yokugcina (sengibhale kakade ngaleli phutha kubadali be-POCO). Lokhu kusho ukuthi kuzodingeka ufune omunye umtapo wolwazi.

Futhi-ke ukukhetha kwami ​​kwawela emtatsheni wezincwadi ongadumile kakhulu libpg. Futhi ngaba nenhlanhla emangalisayo, yayivele ise-conan futhi yayiqoqwa futhi iqoqwe.

Isinyathelo esilandelayo kwakuwukubhala isifanekiso sesevisi esingacubungula izicelo.
Kufanele sithathe ifa lekilasi lethu le-TemplateServerApp ku-Poco::Util::ServerApplication futhi sikhiphe indlela eyinhloko.

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

Endleleni eyinhloko kufanele sibeke imingcele: imbobo, inombolo yezintambo kanye nosayizi womugqa. Futhi okubaluleke kakhulu, kufanele ucacise isibambi sezicelo ezingenayo. Lokhu kwenziwa ngokwakha imboni

I-TemplateRequestHandlerFactory

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

Endabeni yami, imane idale isibambi esifanayo ngaso sonke isikhathi - TemplateServerAppHandler. Yilapho singabeka khona umqondo webhizinisi lethu.

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

Ngiphinde ngenza isifanekiso sekilasi ukuze ngisebenze ne-PostgreSQL. Ukwenza i-SQL elula, njengokwenza itafula, kunendlela I-ExecuteSQL(). Ngemibuzo eminingi eyinkimbinkimbi noma ukubuyisa idatha, kuzodingeka ukuthi uthole uxhumano nge I-GetConnection() futhi usebenzise i-libpg API. (Mhlawumbe ngokuhamba kwesikhathi ngizokulungisa lokhu kungabi nabulungiswa).

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

Wonke amapharamitha wokuxhuma kusizindalwazi athathwe endaweni, ngakho-ke udinga ukudala nokumisa ifayela le-.env

.inv

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

Ungabona yonke ikhodi ku github.

Ama-Microservices ku-C++. Inganekwane noma iqiniso?

Futhi manje kufika isigaba sokugcina sokubhala i-dockerfile kanye ne-docker-compose.yml. Uma ngikhuluma iqiniso, lokhu kwathatha isikhathi esiningi, futhi hhayi nje ngoba ngiyi-noob, ngoba kwakudingeka ukwakha kabusha imitapo yolwazi ngaso sonke isikhathi, kodwa ngenxa yezingibe ze-conan. Isibonelo, ukuze i-conan ilande, ifake futhi yakhe ukuncika okudingekayo, akwanele ukuthi ilande “conan install .”, idinga futhi ukwedlula ipharamitha -s compiler.libcxx=libstdc++11, ngaphandle kwalokho. usengozini yokuthola inqwaba yamaphutha esigabeni sokuxhumanisa isicelo sakho. Bengilokhu ngibambekile kuleli phutha amahora ambalwa futhi ngithemba ukuthi lesi sihloko sizosiza abanye abantu ukuxazulula le nkinga ngesikhathi esincane.

Okulandelayo, ngemva kokubhala i-docker-compose.yml, ngeseluleko somngane wami, ngengeze ukusekelwa umsiki wekhukhi futhi manje usungakwazi ukuzitholela isifanekiso esigcwele ngokugcwele sesevisi ye-REST API ku-C++, ngendawo eyenziwe ngokwezifiso, futhi i-PostgreSQL ifakiwe, ngokumane ufake “i-cookiecutter” kukhonsoli. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Bese kuthi "docker-compose up -build".

Ngithemba ukuthi lesi sifanekiso sizosiza abaqalayo endleleni yabo enzima yokuthuthukisa izinhlelo zokusebenza ze-REST API enkulu futhi enamandla, kodwa ulimi oluyinkimbinkimbi njenge-C++.
Futhi, ngincoma kakhulu ukufunda lapha lokhu isihloko. Ichaza ngokuningiliziwe ukuthi usebenza kanjani ne-POCO futhi ubhale isevisi yakho ye-REST API.

Source: www.habr.com

Engeza amazwana