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
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
conanfile.txt
[merlukeun]
poco / 1.9.3
libpq / 11.5
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
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
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
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
sumber: www.habr.com