Microservices dina C++. Fiksi atawa kanyataan?

Microservices dina C++. Fiksi atawa kanyataan?

Dina artikel ieu kuring baris ngobrol ngeunaan kumaha kuring dijieun template (cookiecutter) tur nyetel hiji lingkungan pikeun nulis layanan REST API dina C ++ ngagunakeun docker / docker-ngarang jeung manajer pakét conan.

Salila hackathon salajengna, dimana kuring milu salaku pamekar backend, timbul patarosan ngeunaan naon anu dianggo pikeun nulis microservice salajengna. Sadayana anu parantos ditulis dugi ka ayeuna ditulis ku kuring sareng kuring babaturan di Python, saprak batur sapagawean mah ahli dina widang ieu sarta backends dimekarkeun professionally, bari kuring umumna hiji pamekar sistem embedded jeung nulis dina hébat sarta dahsyat C ++, sarta kuring ngan diajar Python di universitas.

Janten, kami disanghareupan tugas nyerat ladenan beban tinggi, tugas utama nyaéta pikeun ngolah data anu datang ka dinya sareng nyerat kana pangkalan data. Sarta sanggeus putus haseup sejen, babaturan nyarankeun yén kuring, salaku pamekar C ++, nulis layanan ieu ngagunakeun pro. Arguing ieu yén éta bakal leuwih gancang, leuwih produktif, sarta sacara umum, juri bakal delighted kalawan kumaha urang nyaho kumaha carana ngatur sumberdaya tim urang. Anu kuring ngawaler yén kuring henteu pernah ngalakukeun hal-hal sapertos kitu dina C ++ sareng tiasa ngahaturanan sésana 20+ jam pikeun milarian, nyusun sareng ngahubungkeun perpustakaan anu cocog. Kantun nempatkeun, abdi chickened kaluar. Éta naon urang mutuskeun on na tenang réngsé sagalana di Python.

Ayeuna, salami ngasingkeun diri kapaksa, kuring mutuskeun kumaha cara nyerat jasa dina C ++. Hal kahiji anu kedah dilakukeun nyaéta mutuskeun perpustakaan anu cocog. pilihan kuring murag kana POCO, Kusabab ieu ditulis dina gaya obyék-berorientasi sarta ogé boasted dokuméntasi normal. Ogé, patarosan timbul ngeunaan milih sistem assembly. Nepi ka titik ieu Kuring geus ngan gawé bareng Visual Studio, IAR na makefiles bulistir. Sarta taya sahiji sistem ieu banding ka kuring, saprak kuring rencanana ngajalankeun sakabéh jasa dina wadah docker. Saterusna kuring mutuskeun pikeun nyobaan angka kaluar cmake sarta manajer pakét metot Conan. Pangatur pakét ieu ngamungkinkeun anjeun ngadaptarkeun sadaya katergantungan dina hiji file

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

[generator] cmkeun

sarta kalawan paréntah basajan "conan install ." install perpustakaan diperlukeun. Alami, éta ogé diperlukeun pikeun nyieun parobahan

CMakeLists.txt

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

Saatos éta, kuring mimiti milarian perpustakaan pikeun damel sareng PostgreSQL, sabab éta mangrupikeun anu kuring gaduh sakedik pangalaman damel, sareng éta ogé anu berinteraksi sareng jasa Python. Sareng anjeun terang naon anu kuring diajar? Aya di POCO! Tapi conan henteu terang yén éta aya dina POCO sareng henteu terang kumaha ngawangun éta; aya file konfigurasi anu luntur dina gudang (Kuring parantos nyerat ngeunaan kasalahan ieu ka panyipta POCO). Ieu hartosna anjeun kedah milarian perpustakaan anu sanés.

Lajeng pilihan kuring murag kana perpustakaan kirang populér libpg. Sarta kuring éta incredibly untung, éta geus di conan komo keur dirakit sarta dirakit.

Lengkah saterusna nya éta nulis template layanan nu bisa ngolah requests.
Urang kudu inherit kelas TemplateServerApp urang ti Poco :: Util :: ServerApplication jeung override metodeu utama.

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

Dina metoda utama urang kudu nangtukeun parameter: port, Jumlah threads sarta ukuran antrian. Jeung paling importantly, anjeun kudu nangtukeun hiji Handler pikeun requests asup. Hal ieu dilakukeun ku nyieun pabrik

TemplateRequestHandlerFactory

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

Bisi kuring, éta ngan saukur nyiptakeun pawang anu sami unggal waktos - TemplateServerAppHandler. Ieu dimana urang tiasa nempatkeun logika bisnis urang.

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

Kuring ogé nyieun template kelas pikeun gawé kalawan PostgreSQL. Pikeun ngalakukeun SQL basajan, kayaning nyieun tabel, aya metoda ExecuteSQL(). Pikeun queries leuwih kompleks atawa dimeunangkeun data, anjeun bakal kudu ménta sambungan via GetConnection() sareng nganggo libpg API. (Sugan engke kuring bakal ngabenerkeun kateuadilan ieu).

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

Sadaya parameter pikeun nyambungkeun kana pangkalan data dicandak tina lingkungan, janten anjeun ogé kedah nyiptakeun sareng ngonpigurasikeun file .env

.env

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

Anjeun tiasa ningali sadaya kode di github.

Microservices dina C++. Fiksi atawa kanyataan?

Jeung ayeuna datang tahap ahir nulis dockerfile jeung docker-compose.yml. Mun jujur, ieu nyokot lolobana waktu, sarta henteu ngan kusabab Abdi noob a, sabab ieu diperlukeun pikeun ngawangun deui perpustakaan unggal waktu, tapi kusabab pitfalls of conan. Contona, dina urutan pikeun conan pikeun ngundeur, install sarta ngawangun dependensi diperlukeun, teu cukup pikeun ngundeur "conan install.", Éta ogé perlu lulus -s compiler.libcxx = libstdc ++ 11 parameter, disebutkeun. Anjeun risiko meunang kebat kasalahan dina tahap linking aplikasi Anjeun. Kuring parantos nyangkut kasalahan ieu sababaraha jam sareng kuring ngarepkeun tulisan ieu bakal ngabantosan jalma sanés ngabéréskeun masalah ieu dina waktos anu langkung sakedik.

Salajengna, saatos nyerat docker-compose.yml, dina naséhat babaturan kuring, kuring nambihan dukungan tukang cukur tur ayeuna anjeun bisa meunangkeun diri template full-fledged pikeun layanan REST API dina C ++, kalawan lingkungan ngaropéa, sarta PostgreSQL dipasang, cukup ku ngasupkeun "cookiecutter" kana konsol nu https://github.com/KovalevVasiliy/cpp_rest_api_template.git" Teras "docker-compose up -build".

Kuring miharep citakan ieu bakal mantuan beginners dina jalur hésé maranéhna pikeun ngembangkeun aplikasi REST API dina hébat sarta kuat, tapi basa kagok kawas C ++.
Ogé, kuring nyarankeun pisan maca di dieu ieu artikel. Éta ngajelaskeun sacara langkung rinci kumaha cara damel sareng POCO sareng nyerat jasa REST API anjeun nyalira.

sumber: www.habr.com

Tambahkeun komentar