በዚህ ጽሑፍ ውስጥ እንዴት አብነት እንደፈጠርኩ እናገራለሁ (ኩኪ መቁረጫ) እና የ REST API አገልግሎትን በ C ++ ውስጥ ለመፃፍ ዶከር / ዶከር-ኮምፖዝ እና የኮን ፓኬጅ ማኔጀርን በመጠቀም።
እንደ ደጋፊ ገንቢ በተሳተፍኩበት በሚቀጥለው ሃካቶን፣ ቀጣዩን ማይክሮ አገልግሎት ለመጻፍ ምን መጠቀም እንዳለብኝ ጥያቄው ተነሳ። እስካሁን የተፃፈው ሁሉ በእኔ እና በእኔ ነው የተፃፈው
ስለዚህ, ከፍተኛ ጭነት ያለው አገልግሎት የመጻፍ ሥራ አጋጥሞናል, ዋናው ሥራው ወደ እሱ የሚመጡትን መረጃዎች አስቀድመው ማዘጋጀት እና ወደ ዳታቤዝ መፃፍ ነበር. እና ሌላ የጢስ ጭስ ከተቋረጠ በኋላ አንድ ጓደኛዬ እኔ እንደ C++ ገንቢ ይህንን አገልግሎት ጥቅሞቹን በመጠቀም እንድጽፍ ሐሳብ አቀረበ። ይህ ፈጣን, የበለጠ ውጤታማ እና በአጠቃላይ, ዳኞች የቡድኑን ሀብቶች እንዴት ማስተዳደር እንዳለብን እንዴት እንደምናውቅ በመሟገት ይደሰታሉ. እኔም በC++ እንደዚህ አይነት ስራዎች ሰርቼ እንደማላውቅ እና ቀሪውን 20+ ሰአታት በቀላሉ ተስማሚ ቤተ-መጻህፍት ፍለጋ፣ማጠናቀር እና ማገናኘት እንደምችል መለስኩለት። በቀላል አነጋገር ዶሮ ወጣሁ። ያ ነው የወሰንነው እና ሁሉንም ነገር በፒቲን ውስጥ በእርጋታ አጠናቅቀን።
አሁን፣ በግዳጅ ራስን ማግለል ወቅት፣ በC++ ውስጥ አገልግሎቶችን እንዴት መፃፍ እንዳለብኝ ለማወቅ ወሰንኩ። የመጀመሪያው ነገር ተስማሚ ቤተ-መጽሐፍት ላይ መወሰን ነበር. ምርጫዬ ወደቀ
conanfile.txt
[ይጠይቃል]ፖኮ/1.9.3
libpq/11.5
እና በቀላል ትዕዛዝ "conan install." አስፈላጊዎቹን ቤተ-መጻሕፍት ይጫኑ. በተፈጥሮ, ለውጦችን ማድረግም አስፈላጊ ነበር
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
ከዚያ በኋላ ከPosgreSQL ጋር ለመስራት ብዙም ልምድ ያልነበረኝ እና የፓይዘን አገልግሎታችን የሚገናኘው እሱ ስለሆነ ከ PostgreSQL ጋር ለመስራት ቤተ-መጽሐፍት መፈለግ ጀመርኩ። እና የተማርኩትን ታውቃለህ? በPOCO ውስጥ ነው! ነገር ግን ኮናን በPOCO ውስጥ እንዳለ አያውቅም እና እንዴት እንደሚገነባ አያውቅም፤ በማከማቻው ውስጥ ጊዜው ያለፈበት የውቅር ፋይል አለ (ስለዚህ ስህተት ቀደም ሲል ለPOCO ፈጣሪዎች ጽፌያለሁ)። ይህ ማለት ሌላ ቤተ-መጽሐፍት መፈለግ አለብዎት ማለት ነው.
እና ከዚያ ምርጫዬ ባነሰ ታዋቂ ቤተ-መጽሐፍት ላይ ወደቀ
ቀጣዩ እርምጃ ጥያቄዎችን ማስተናገድ የሚችል የአገልግሎት አብነት መፃፍ ነበር።
የእኛን TemplateServerApp ክፍል ከPoco::Util::ServerApplication መውረስ እና ዋናውን ዘዴ መሻር አለብን።
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;
}
በዋናው ዘዴ ውስጥ መለኪያዎችን ማዘጋጀት አለብን: ወደብ, የክሮች ብዛት እና የወረፋ መጠን. እና ከሁሉም በላይ፣ ለገቢ ጥያቄዎች ተቆጣጣሪን መግለጽ አለብዎት። ይህ ፋብሪካ በመፍጠር ነው
አብነት ጥያቄ ሃንድለር ፋብሪካ
class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
{
return new TemplateServerAppHandler;
}
};
በእኔ ሁኔታ፣ በቀላሉ አንድ አይነት ተቆጣጣሪ ሁልጊዜ ይፈጥራል - TemplateServerAppHandler። የቢዝነስ አመክንዮአችንን የምናስቀምጥበት ይህ ነው።
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();
}
};
ከPostgreSQL ጋር ለመስራት የክፍል አብነትም ፈጠርኩ። ቀላል SQL ለማከናወን, ለምሳሌ ሰንጠረዥ መፍጠር, አንድ ዘዴ አለ ExecuteSQL(). ለተጨማሪ ውስብስብ መጠይቆች ወይም ውሂብ ሰርስሮ ማውጣት፣ በ በኩል ግንኙነት ማግኘት አለብዎት GetConnection() እና libpg API ይጠቀሙ። (ምናልባት በኋላ ይህንን ግፍ አስተካክለው ይሆናል)።
የውሂብ ጎታ
#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;
};
ከመረጃ ቋቱ ጋር ለማገናኘት ሁሉም መለኪያዎች የተወሰዱት ከአካባቢው ነው ፣ ስለሆነም የ .env ፋይል መፍጠር እና ማዋቀር ያስፈልግዎታል
.env
DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432
ሁሉንም ኮድ በ ላይ ማየት ይችላሉ
እና አሁን dockerfile እና docker-compose.yml የመጻፍ የመጨረሻው ደረጃ መጥቷል። እውነቱን ለመናገር, ይህ ብዙ ጊዜ ወስዷል, እና እኔ noob ስለሆንኩ ብቻ ሳይሆን, ምክንያቱም ቤተ-መጻሕፍትን በየጊዜው እንደገና መገንባት አስፈላጊ ነበር, ነገር ግን በኮንደን ጥፋቶች ምክንያት. ለምሳሌ ኮናን አስፈላጊ የሆኑትን ጥገኞች ለማውረድ፣ ለመጫን እና ለመገንባት፣ “conan install ን” ለማውረድ በቂ አይደለም፣ በተጨማሪም -s compiler.libcxx=libstdc++11 ፓራሜትር ማለፍ ያስፈልገዋል፣ አለበለዚያ ማመልከቻዎን በማገናኘት ደረጃ ላይ ብዙ ስህተቶችን ሊያገኙ ይችላሉ። ከዚህ ስህተት ጋር ለብዙ ሰዓታት ተጣብቄያለሁ እናም ይህ ጽሑፍ ሌሎች ሰዎች ይህንን ችግር በአጭር ጊዜ ውስጥ እንዲፈቱ እንደሚረዳቸው ተስፋ አደርጋለሁ።
በመቀጠል፣ docker-compose.yml ከጻፍኩ በኋላ፣ በጓደኛዬ ምክር፣ ድጋፍ ጨምሬያለሁ
ይህ አብነት ለጀማሪዎች የREST API አፕሊኬሽኖችን በትልቁ እና በኃይለኛው፣ ነገር ግን እንደ ሲ ++ ያለ ብልሹ ቋንቋ ለማዳበር አስቸጋሪ በሆነ መንገዳቸው ላይ እንደሚረዳቸው ተስፋ አደርጋለሁ።
እንዲሁም እዚህ ለማንበብ በጣም እመክራለሁ።
ምንጭ: hab.com