A cikin wannan labarin zan yi magana game da yadda na ƙirƙiri samfuri (cookiecutter) da kuma kafa yanayi don rubuta sabis na API na REST a cikin C ++ ta amfani da docker/docker-compose da mai sarrafa kunshin conan.
A lokacin hackathon na gaba, wanda na shiga a matsayin mai haɓakawa na baya, tambayar ta taso game da abin da za a yi amfani da shi don rubuta microservice na gaba. Duk abin da aka rubuta zuwa yanzu ni da nawa ne suka rubuta
Don haka, mun fuskanci aikin rubuta sabis ɗin mai ɗaukar nauyi, wanda babban aikin shi shine tsara bayanan da ke zuwa gare shi da rubuta su a cikin ma'ajin. Kuma bayan wani hutun hayaki, wani abokina ya ba da shawarar cewa ni, a matsayina na mai haɓaka C++, in rubuta wannan sabis ɗin ta amfani da ribobi. Yin jayayya da wannan shi ne cewa zai kasance da sauri, mafi amfani, kuma gaba ɗaya, juri zai yi farin ciki da yadda muka san yadda ake sarrafa albarkatun kungiyar. Wanda na amsa da cewa ban taba yin irin waɗannan abubuwa ba a C++ kuma zan iya ba da sauran sa'o'i 20+ cikin sauƙi don bincike, tattarawa da haɗa ɗakunan karatu masu dacewa. A taƙaice, na kaɗa. Abin da muka yanke ke nan kuma muka kammala komai cikin natsuwa a Python.
Yanzu, yayin da aka tilasta wa kaina, na yanke shawarar gano yadda ake rubuta sabis a C++. Abu na farko da za a yi shi ne yanke shawara a kan ɗakin karatu mai dacewa. Zabi na ya fadi
conanfile.txt
[ana bukatar]poco/1.9.3
libpq/11.5
kuma tare da umarni mai sauƙi "conan shigar." shigar da dakunan karatu da suka dace. A zahiri, ya zama dole kuma a yi canje-canje
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
Bayan haka, na fara neman ɗakin karatu don yin aiki tare da PostgreSQL, tun da yake shi ne wanda nake da ɗan gogewa tare da shi, kuma shi ne wanda ayyukanmu na Python ke hulɗa da shi. Kuma ka san abin da na koya? Yana cikin POCO! Amma conan bai san cewa yana cikin POCO ba kuma bai san yadda ake gina shi ba; akwai tsohuwar fayil ɗin daidaitawa a cikin ma'ajiyar (Na riga na rubuta game da wannan kuskuren ga masu ƙirƙirar POCO). Wannan yana nufin za ku nemi wani ɗakin karatu.
Sannan zabina ya fada kan wani dakin karatun da ba shi da farin jini
Mataki na gaba shine rubuta samfurin sabis wanda zai iya aiwatar da buƙatun.
Dole ne mu gaji aji na TemplateServerApp daga Poco::Util::ServerApplication kuma mu soke babbar hanyar.
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;
}
A cikin babbar hanyar dole ne mu saita sigogi: tashar jiragen ruwa, adadin zaren da girman jerin gwano. Kuma mafi mahimmanci, dole ne ka saka mai kula da buƙatun masu shigowa. Ana yin haka ta hanyar ƙirƙirar masana'anta
SamfuraRequestHandlerFactory
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
A cikin yanayina, kawai yana ƙirƙirar mai sarrafa iri ɗaya kowane lokaci - TemplateServerAppHandler. Wannan shine inda zamu iya sanya dabarun kasuwancin mu.
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();
}
};
Na kuma ƙirƙiri samfurin aji don aiki tare da PostgreSQL. Don yin SQL mai sauƙi, kamar ƙirƙirar tebur, akwai hanya ExecuteSQL(). Don ƙarin hadaddun tambayoyin ko dawo da bayanai, dole ne ku sami haɗi ta hanyar GetConnection() kuma amfani da libpg API. (Watakila daga baya zan gyara wannan zalunci).
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;
};
Ana ɗaukar duk sigogi don haɗawa zuwa bayanan bayanan daga mahalli, don haka kuna buƙatar ƙirƙira da daidaita fayil ɗin .env
.env
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
Kuna iya ganin duk lambar a
Kuma yanzu ya zo mataki na ƙarshe na rubuta dockerfile da docker-compose.yml. A gaskiya, wannan ya ɗauki mafi yawan lokaci, kuma ba wai kawai don ni ba ne kawai ba, saboda ya zama dole a sake gina ɗakunan karatu a kowane lokaci, amma saboda ramukan conan. Misali, domin conan ya zazzage, shigar da gina abubuwan da suka dace, bai ishe shi don saukar da “conan install .”, kuma yana buƙatar wuce madaidaicin -s compiler.libcxx=libstdc++11, in ba haka ba. kuna haɗarin samun tarin kurakurai a matakin haɗin aikace-aikacenku. Na makale da wannan kuskure na tsawon sa'o'i da yawa kuma ina fatan wannan labarin zai taimaka wa wasu mutane su magance wannan matsalar cikin ɗan lokaci kaɗan.
Na gaba, bayan rubuta docker-compose.yml, bisa shawarar abokina, na ƙara tallafi
Ina fatan wannan samfuri zai taimaka wa masu farawa akan hanyarsu mai wahala ta haɓaka aikace-aikacen REST API a cikin girma da ƙarfi, amma irin wannan yare mai banƙyama kamar C ++.
Har ila yau, ina ba da shawarar karantawa a nan
source: www.habr.com