مقدمة في gRPC لـ C++
\n\ngRPC هو إطار عمل حديث لاستدعاء الإجراءات عن بُعد (RPC)، طورته Google. يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 كبروتوكول نقل. بالنسبة للغة C++، يوفر gRPC مكتبات أصلية تسمح بإنشاء خدمات مصغرة عالية الأداء وأنظمة موزعة.
\n\nفي هذه المقالة، سنشرح المكتبات الرئيسية، إعداد البيئة، وسنكتب مثالاً كاملاً لتطبيق خادم-عميل بلغة C++.
\n\nالمكتبات الرئيسية لـ gRPC في C++
\n\nللعمل مع gRPC في C++، يلزم تثبيت عدة مكونات:
\n\n- \n
- grpc — المكتبة الأساسية التي تحتوي على تطبيقات الخادم والعميل. \n
- grpc++ — غلاف C++ فوق gRPC، يوفر واجهة برمجة تطبيقات مريحة. \n
- protobuf — مكتبة للعمل مع Protocol Buffers (توليد الفئات، التسلسل/إلغاء التسلسل). \n
- grpc_cpp_plugin — إضافة لمترجم protoc، تولد كود C++ من ملفات .proto. \n
قد تكون هناك حاجة أيضاً إلى تبعيات مثل: abseil-cpp، openssl، zlib و c-ares.
تثبيت gRPC و protobuf
\n\nالطريقة الموصى بها هي البناء من المصدر باستخدام CMake. مثال لنظامي Linux/macOS:
\n\ngit clone --recurse-submodules -b v1.60.0 https://github.com/grpc/grpc\ncd grpc\nmkdir build && cd build\ncmake .. -DgRPC_INSTALL=ON -DCMAKE_INSTALL_PREFIX=/usr/local\nmake -j$(nproc)\nsudo make install\n\nبعد التثبيت، تحقق من توفر مترجم protobuf والإضافة:
\n\nprotoc --version\nwhich grpc_cpp_plugin\n\nتعريف الخدمة عبر ملف .proto
\n\nلننشئ ملف example.proto:
syntax = "proto3";\n\npackage example;\n\nservice Greeter {\n rpc SayHello (HelloRequest) returns (HelloReply);\n}\n\nmessage HelloRequest {\n string name = 1;\n}\n\nmessage HelloReply {\n string message = 1;\n}\n\nلنولد كود C++:
\n\nprotoc --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` example.proto\n\nنتيجة لذلك، ستظهر الملفات: example.pb.h، example.pb.cc، example.grpc.pb.h، example.grpc.pb.cc.
تنفيذ الخادم بلغة C++
\n\nأنشئ ملف server.cc:
#include <iostream>\n#include <memory>\n#include <string>\n\n#include <grpcpp/grpcpp.h>\n#include "example.grpc.pb.h"\n\nusing grpc::Server;\nusing grpc::ServerBuilder;\nusing grpc::ServerContext;\nusing grpc::Status;\nusing example::Greeter;\nusing example::HelloRequest;\nusing example::HelloReply;\n\nclass GreeterServiceImpl final : public Greeter::Service {\n Status SayHello(ServerContext* context,\n const HelloRequest* request,\n HelloReply* reply) override {\n std::string prefix("Hello, ");\n reply->set_message(prefix + request->name());\n return Status::OK;\n }\n};\n\nvoid RunServer() {\n std::string server_address("0.0.0.0:50051");\n GreeterServiceImpl service;\n\n ServerBuilder builder;\n builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());\n builder.RegisterService(&service);\n\n std::unique_ptr<Server> server(builder.BuildAndStart());\n std::cout << "Server listening on " << server_address << std::endl;\n server->Wait();\n}\n\nint main() {\n RunServer();\n return 0;\n}\n\nتنفيذ العميل بلغة C++
\n\nأنشئ ملف client.cc:
#include <iostream>\n#include <memory>\n#include <string>\n\n#include <grpcpp/grpcpp.h>\n#include "example.grpc.pb.h"\n\nusing grpc::Channel;\nusing grpc::ClientContext;\nusing grpc::Status;\nusing example::Gree