Microservices ma C++. He moʻolelo moʻolelo paha?

Microservices ma C++. He moʻolelo moʻolelo paha?

Ma kēia ʻatikala e kamaʻilio wau e pili ana i kaʻu hana ʻana i kahi template (cookiecutter) a hoʻonohonoho i kahi kaiapuni no ke kākau ʻana i kahi lawelawe REST API ma C ++ me ka hoʻohana ʻana i ka docker/docker-compose a me ka conan package manager.

I ka wā o ka hackathon aʻe, kahi aʻu i komo ai ma ke ʻano he mea hoʻomohala backend, ua kū mai ka nīnau e pili ana i ka mea e hoʻohana ai e kākau i ka microservice aʻe. ʻO nā mea a pau i kākau ʻia i kēia manawa, naʻu a me kaʻu i kākau hoa ma Python, no ka mea he loea koʻu hoa hana ma kēia kahua a hoʻomohala ʻia i nā backends, ʻoiai ʻo wau he mea hoʻomohala pūnaewele i hoʻopili ʻia a kākau i ka C ++ nui a weliweli, a aʻo wau i ka Python ma ke kulanui.

No laila, ua alo mākou i ka hana o ke kākau ʻana i kahi lawelawe haʻahaʻa kiʻekiʻe, ʻo ka hana nui ʻo ia ka preprocess i ka ʻikepili e hele mai ana a kākau iā ia i ka waihona. A ma hope o ka uahi ʻē aʻe, ua ʻōlelo mai kekahi hoaaloha iaʻu, ma ke ʻano he mea hoʻomohala C++, e kākau i kēia lawelawe me ka hoʻohana ʻana i ka pono. ʻO ka hoʻopaʻapaʻa ʻana i kēia, ʻoi aku ka wikiwiki, ʻoi aku ka maikaʻi, a ma ke ʻano nui, e hauʻoli ka jure i ka ʻike pehea e hoʻokele ai i nā kumuwaiwai o ka hui. ʻO ia kaʻu i pane aku ai ʻaʻole wau i hana i kēlā mau mea ma C ++ a hiki ke hāʻawi maʻalahi i nā hola 20+ i koe no ka ʻimi ʻana, hōʻuluʻulu a hoʻopili ʻana i nā hale waihona puke kūpono. ʻO ka'ōlelo maʻalahi, ua moa wau. ʻO ia ka mea a mākou i hoʻoholo ai a hoʻopau mālie i nā mea āpau ma Python.

I kēia manawa, i ka wā o ka hoʻokaʻawale ʻana, ua hoʻoholo wau e noʻonoʻo pehea e kākau ai i nā lawelawe ma C ++. ʻO ka mea mua e hana ai, ʻo ia ka hoʻoholo ʻana i kahi waihona kūpono. Ua hāʻule kaʻu koho POCO, no ka mea, ua kākau ʻia ma kahi ʻano mea i hoʻopaʻa ʻia a kaena pū kekahi i nā palapala maʻamau. Eia kekahi, ua ala mai ka nīnau e pili ana i ke koho ʻana i kahi ʻōnaehana hui. A hiki i kēia manawa ua hana wale wau me Visual Studio, IAR a me nā makefiles ʻole. A ʻaʻohe o kēia mau ʻōnaehana i hoʻopiʻi mai iaʻu, ʻoiai ua hoʻolālā wau e holo i ka lawelawe holoʻokoʻa i kahi pahu docker. A laila ua hoʻoholo wau e hoʻāʻo e noʻonoʻo i ka cmake a me kahi mana hoʻokele hoihoi conan. Ua ʻae kēia luna pūʻolo iā ʻoe e hoʻopaʻa inoa i nā hilinaʻi āpau i hoʻokahi faila

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

[generators] cmake

a me kahi kauoha maʻalahi "conan install ." e hoʻokomo i nā hale waihona puke e pono ai. Maʻamau, pono nō hoʻi e hoʻololi i

CMakeLists.txt

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

Ma hope o kēlā, hoʻomaka wau e ʻimi i kahi hale waihona puke e hana pū me PostgreSQL, ʻoiai ʻo ia kaʻu ʻike liʻiliʻi i ka hana ʻana, a ʻo ia hoʻi ka mea i launa pū me kā mākou lawelawe Python. A maopopo iā ʻoe kaʻu i aʻo ai? Aia ma POCO! Akā ʻaʻole ʻike ʻo conan aia i POCO a ʻaʻole ʻike i ke kūkulu ʻana; aia kahi faila hoʻonohonoho kahiko i loko o ka waihona (Ua kākau mua wau e pili ana i kēia hewa i nā mea hana o POCO). 'O ia ho'i, pono 'oe e 'imi i kahi waihona 'ē a'e.

A laila hāʻule kaʻu koho i kahi hale waihona puke kaulana ʻole libpg. Laki loa au, aia i ka conan a ua ʻākoakoa ʻia a ʻākoakoa ʻia.

ʻO ka hana aʻe, ʻo ia ke kākau ʻana i kahi laʻa lawelawe e hiki ke hana i nā noi.
Pono mākou e hoʻoili i kā mākou papa TemplateServerApp mai Poco::Util::ServerApplication a kāpae i ke ʻano kumu.

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

Ma ke ala nui pono mākou e hoʻonohonoho i nā ʻāpana: port, helu o nā kaula a me ka nui o ka queue. A ʻo ka mea nui loa, pono ʻoe e kuhikuhi i kahi mea hoʻokele no nā noi komo. Hana ʻia kēia ma ka hana ʻana i hale hana

TemplateRequestHandlerFactory

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

I koʻu hihia, hana wale ia i ka mea lawelawe like i kēlā me kēia manawa - TemplateServerAppHandler. ʻO kēia kahi e hiki ai iā mākou ke kau i kā mākou loiloi ʻoihana.

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

Ua hana pū au i kahi papa hana e hana pū me PostgreSQL. No ka hana SQL maʻalahi, e like me ka hana ʻana i kahi papaʻaina, aia kahi ala ExecuteSQL(). No nā nīnau paʻakikī a kiʻi ʻikepili paha, pono ʻoe e kiʻi i kahi pilina ma o GetConnection() a hoʻohana i ka libpg API. (Ma hope paha e hoʻoponopono wau i kēia hewa).

hōkeoʻikepili

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

Lawe ʻia nā ʻāpana āpau no ka hoʻopili ʻana i ka waihona mai ke kaiapuni, no laila pono ʻoe e hana a hoʻonohonoho i ka faila .env

.NS

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

Hiki iā ʻoe ke ʻike i nā code āpau ma github.

Microservices ma C++. He moʻolelo moʻolelo paha?

A ke hiki mai nei ka pae hope o ke kākau ʻana i ka dockerfile a me docker-compose.yml. ʻO kaʻoiaʻiʻo, ua lawe kēia i ka hapa nui o ka manawa, a ʻaʻole wale no ka mea he noob wau, no ka mea he mea pono ke kūkulu hou i nā hale waihona puke i kēlā me kēia manawa, akā no nā pitfalls o conan. No ka laʻana, i mea e hiki ai iā conan ke hoʻoiho, hoʻokomo a kūkulu i nā mea hilinaʻi e pono ai, ʻaʻole lawa ia e hoʻoiho i ka "conan install .", pono nō hoʻi e hele i ka -s compiler.libcxx=libstdc++11 parameter, i ʻole. pilikia ʻoe i ka loaʻa ʻana o nā hewa i ka pae hoʻopili i kāu noi. Ua paʻa wau i kēia kuhi no kekahi mau hola a ke manaʻo nei au e kōkua kēia ʻatikala i nā poʻe ʻē aʻe e hoʻoponopono i kēia pilikia i ka manawa liʻiliʻi.

A laila, ma hope o ke kākau ʻana i ka docker-compose.yml, ma ka ʻōlelo aʻo a koʻu hoaaloha, ua hoʻohui au i ke kākoʻo ʻoki kuki a i kēia manawa hiki iā ʻoe ke kiʻi iā ʻoe iho i kahi hoʻopihapiha piha no kahi lawelawe REST API ma C ++, me kahi kaiapuni maʻamau, a hoʻokomo ʻia ʻo PostgreSQL, ma ke komo ʻana i "cookiecutter" i loko o ka console. https://github.com/KovalevVasiliy/cpp_rest_api_template.git" A laila "hoʻokumu i ka docker-compose up".

Manaʻo wau e kōkua kēia laʻana i ka poʻe hoʻomaka ma ko lākou ala paʻakikī o ka hoʻomohala ʻana i nā noi REST API i ka nui a me ka mana, akā ʻo ia ʻōlelo clumsy e like me C++.
Eia kekahi, makemake nui au e heluhelu maanei kēia ʻatikala. E wehewehe i nā kikoʻī hou aʻe pehea e hana pū ai me POCO a kākau i kāu lawelawe REST API ponoʻī.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka