Microservices i C++. He pakiwaitara, he mooni ranei?

Microservices i C++. He pakiwaitara, he mooni ranei?

I roto i tenei tuhinga ka korero ahau me pehea taku hanga tauira (cookiecutter) me te whakarite i tetahi taiao mo te tuhi i tetahi ratonga REST API i C++ ma te whakamahi i te docker/docker-compose me te kaiwhakahaere kete conan.

I te wa o te hackathon e whai ake nei, i uru atu ahau hei kaiwhakawhanake tuara, ka puta ake te patai mo te aha hei whakamahi hei tuhi i te ratonga moroiti e whai ake nei. Ko nga mea katoa i tuhia i tenei wa, naku me taku i tuhi hoa i roto i te Python, i te mea he tohunga taku hoa mahi ki tenei mara me te whakawhanake ngaiotanga ki muri, i te mea he kaiwhakawhanake punaha whakauru ahau me te tuhi ki te C++ nui, whakamataku, katahi ano ahau ka ako i te Python i te whare wananga.

Na, i anga matou ki te mahi ki te tuhi i tetahi ratonga kawenga nui, ko te mahi matua ko te mahi i mua i nga raraunga ka tae mai ki reira ka tuhi ki te papaarangi. A, i muri i tetahi atu paowa paowa, i kii tetahi hoa ki ahau, hei kaiwhakawhanake C++, tuhia tenei ratonga ma te whakamahi i nga mea pai. Ko te tautohetohe ko tenei ka tere ake, ka nui ake te hua, a, i te nuinga o te waa, ka koa nga kaiwhakawa ki te mohio ki te whakahaere i nga rawa a te kapa. I whakautu ahau kaore ano au i mahi penei i roto i te C++ ka taea e au te whakapau i nga haora 20+ e toe ana ki te rapu, ki te whakahiato me te hono i nga whare pukapuka e tika ana. Maama noa iho, ka mutu ahau. Koira te mea i whakatauhia e matou me te ata whakaoti i nga mea katoa i roto i te Python.

Inaianei, i te wa e noho wehe ana ahau, ka whakatau ahau me pehea te tuhi i nga ratonga ki C++. Ko te mahi tuatahi ko te whakatau he whare pukapuka pai. I hinga taku whiringa POCO, i te mea i tuhia i roto i te ahua o te ahanoa me te whakahihiri i nga tuhinga noa. I puta ano te patai mo te whiriwhiri i te punaha huihuinga. Tae noa ki tenei wa kua mahi noa ahau me te Visual Studio, IAR me nga konae hanga noa. A kaore tetahi o enei punaha i pai ki ahau, na te mea i whakamahere ahau ki te whakahaere i te ratonga katoa i roto i te ipu docker. Na ka whakatau ahau ki te tarai i te cmake me tetahi kaiwhakahaere kete whakamere Tuhinga. I whakaaetia e tenei kaiwhakahaere kete kia rehita koe i nga whakawhirinakitanga katoa ki te konae kotahi

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

[generators] cmake

me te whakahau ngawari "conan install ." whakauruhia nga whare pukapuka e tika ana. Ko te tikanga, me whakarereke ano

CMakeLists.txt

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

Whai muri i tera, ka tiimata ahau ki te rapu whare pukapuka hei mahi tahi me PostgreSQL, na te mea he iti nei taku mohio ki te mahi, ko ia ano hoki te mahi tahi a a maatau ratonga Python. A e mohio ana koe ki taku i ako ai? Kei POCO! Engari kaore a Conan e mohio kei roto i te POCO kaore e mohio ki te hanga; he konae whirihoranga tawhito kei roto i te putunga (Kua tuhia e au tenei hapa ki nga kaihanga o POCO). Ko te tikanga me rapu koe mo tetahi atu whare pukapuka.

Na ka taka taku whiringa ki te whare pukapuka iti rongonui libpg. A he tino waimarie ahau, kua uru kee ki roto i te conan, kua whakaemihia, kua whakaemihia.

Ko te mahi i muri mai ko te tuhi i tetahi tauira ratonga ka taea te tukatuka i nga tono.
Me tuku iho to tatou akomanga TemplateServerApp mai i Poco::Util::ServerApplication me te whakakore i te tikanga matua.

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

I roto i te tikanga matua me whakarite e tatou nga tawhā: te tauranga, te maha o nga miro me te rahi o te rarangi. A ko te mea nui, me tohu e koe he kaihautu mo nga tono e tau mai ana. Ka mahia tenei ma te hanga wheketere

TauiraRequestHandlerFactory

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

I roto i taku keehi, ka hanga noa e ia te kaihautu kotahi i nga wa katoa - TemplateServerAppHandler. Koinei te waahi ka taea e taatau te whakatakoto i o maatau whakaaro pakihi.

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

I hanga ano e ahau he tauira akomanga hei mahi me PostgreSQL. Hei mahi i te SQL ngawari, penei i te hanga tepu, he tikanga WhakahaereSQL(). Mo nga patai uaua ake, tango raraunga ranei, me whiwhi hononga koe ma Tikina Hononga() me te whakamahi i te libpg API. (Tena pea ka whakatika ahau i tenei mahi he).

pātengi Raraunga

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

Ko nga tawhā katoa mo te hono ki te papaarangi ka tangohia mai i te taiao, na me hanga me te whirihora i te konae .env

Tuhinga .env

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

Ka taea e koe te kite i nga waehere katoa i github.

Microservices i C++. He pakiwaitara, he mooni ranei?

Inaianei kua tae mai te waahanga whakamutunga o te tuhi i te dockerfile me te docker-compose.yml. Ki te pono, i pau tenei i te nuinga o te waa, ehara i te mea he noob noa ahau, na te mea i tika kia hanga ano nga whare pukapuka i nga wa katoa, engari na nga mahanga o te conan. Hei tauira, kia taea ai e conan te tango, te whakauru me te hanga i nga whakawhirinakitanga e tika ana, kaore e ranea mo te tango i te "conan install .", me tuku ano te -s compiler.libcxx=libstdc++11 tawhā, ki te kore Ka tupono koe ka maha nga hapa i te wa hono i to tono. He maha nga haora kua mau ahau ki tenei hapa me te tumanako ka awhina tenei tuhinga ki etahi atu tangata ki te whakaoti i tenei raru i roto i te wa iti.

I muri mai, i muri i te tuhi i te docker-compose.yml, i runga i nga tohutohu a taku hoa, ka taapirihia e au te tautoko tapahi pihikete a inaianei ka taea e koe te tiki tauira tino pai mo te ratonga REST API i C ++, me te taiao kua whakaritea, me te PostgreSQL kua whakauruhia, ma te whakauru noa i te "pihikete" ki te papatohu. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Na ka "docker-compose up —hanga".

Ko te tumanako ka awhina tenei tauira ki te hunga katahi ka timata i to raatau ara uaua ki te whakawhanake i nga tono REST API i roto i te reo nui me te kaha, engari he reo hauwarea penei i te C++.
Ano, ka tino taunaki ahau ki te panui i konei tenei tuhinga. He whakamarama ake me pehea te mahi me te POCO me te tuhi i to ake ratonga REST API.

Source: will.com

Tāpiri i te kōrero