परिचय: माइक्रोसर्विसेज़ के लिए C++ क्यों?
माइक्रोसर्विस आर्किटेक्चर ने डेवलपमेंट की दुनिया में मजबूती से प्रवेश किया है, लेकिन पारंपरिक रूप से यह Go, Java या Python जैसी भाषाओं से जुड़ा है। हालांकि, C++ वहाँ अपरिहार्य बना हुआ है जहाँ प्रदर्शन, कम विलंबता और मेमोरी का कुशल उपयोग महत्वपूर्ण है। इस लेख में, हम समझेंगे कि C++ पर माइक्रोसर्विसेज़ कैसे बनाएं, कौन सी लाइब्रेरीज़ का उपयोग करें और इंफ्रास्ट्रक्चर को कैसे व्यवस्थित करें।
माइक्रोसर्विसेज़ में C++ के मुख्य लाभ:
- अधिकतम प्रदर्शन (नेटिवली कम्पाइल्ड कोड)
- न्यूनतम मेमोरी खपत
- संसाधनों पर पूर्ण नियंत्रण
- गार्बेज कलेक्टर का अभाव (पूर्वानुमानित विलंबता)
हम व्यावहारिक उदाहरणों के साथ आर्किटेक्चर, REST API का कार्यान्वयन, gRPC, कतारों के साथ काम और कंटेनरीकरण पर विचार करेंगे।
C++ पर माइक्रोसर्विस का आर्किटेक्चर
मूल सिद्धांत
C++ पर माइक्रोसर्विस होना चाहिए:
- स्वायत्त — प्रत्येक सेवा स्वतंत्र रूप से काम करती है
- ढीला युग्मित — सेवाओं के बीच न्यूनतम निर्भरताएँ
- व्यावसायिक कार्यों पर केंद्रित — एक सेवा एक कार्य हल करती है
- विफलताओं के प्रति लचीला — graceful degradation
विशिष्ट प्रोजेक्ट संरचना
my_microservice/├── CMakeLists.txt├── src/│ ├── main.cpp│ ├── server/│ │ ├── http_server.cpp│ │ └── http_server.h│ ├── service/│ │ ├── order_service.cpp│ │ └── order_service.h│ ├── repository/│ │ ├── order_repository.cpp│ │ └── order_repository.h│ └── config/│ ├── config.cpp│ └── config.h├── include/│ └── (सार्वजनिक हेडर)├── tests/│ └── test_order_service.cpp└── Dockerfileव्यावहारिक कार्यान्वयन: REST API माइक्रोसर्विस
HTTP-लाइब्रेरी का चयन
C++ के लिए सबसे अच्छे विकल्प cpp-httplib (हल्का, header-only) और Drogon (पूर्ण-विशेषताओं वाला फ्रेमवर्क) हैं। cpp-httplib के साथ एक उदाहरण देखें।
उदाहरण: ऑर्डर प्रबंधन सेवा
// main.cpp#include <httplib.h>#include <nlohmann/json.hpp>#include <iostream>#include <memory>#include "order_service.h"
using json = nlohmann::json;
int main() { httplib::Server svr; auto orderService = std::make_shared<OrderService>();
// POST /orders — ऑर्डर बनाना svr.Post("/orders", [orderService](const httplib::Request& req, httplib::Response& res) { try { auto data = json::parse(req.body); auto order = orderService->createOrder(data); res.set_content(order.dump(), "application/json"); res.status = 201; } catch (const std::exception& e) { res.set_content(json{{"error", e.what()}}.dump(), "application/json"); res.status = 400; } });
// GET /orders/{id} — ऑर्डर प्राप्त करना svr.Get(R"(/orders/(\\d+))", [orderService](const httplib::Request& req, httplib::Response& res) { int orderId = std::stoi(req.matches[1]); auto order = orderService->getOrder(orderId); if (order) { res.set_content(order->dump(), "application/json"); } else { res.status = 404; res.set_content(json{{"error", "Order not found"}}.dump(), "application/json"); } });
std::cout << "Server started on port 8080" << std::endl; svr.listen("0.0.0.0", 8080); return 0;}// order_service.cpp#include "order_service.h"#include <stdexcept>
using json = nlohmann::json;
json OrderService::createOrder(const json& data) { if (!data.contains("product_id") || !data.contains("quantity")) { throw std::invalid_argument("Missing required fields"); }
Order or
```