gRPC لـ C++: المكتبات، الإعداد وأمثلة الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في gRPC لـ C++

\n\n

gRPC هو إطار عمل حديث لاستدعاء الإجراءات عن بُعد (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
\n\n

قد تكون هناك حاجة أيضاً إلى تبعيات مثل: abseil-cpp، openssl، zlib و c-ares.

\n\n

تثبيت gRPC و protobuf

\n\n

الطريقة الموصى بها هي البناء من المصدر باستخدام CMake. مثال لنظامي Linux/macOS:

\n\n
git 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\n
protoc --version\nwhich grpc_cpp_plugin
\n\n

تعريف الخدمة عبر ملف .proto

\n\n

لننشئ ملف example.proto:

\n\n
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\n
protoc --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.

\n\n

تنفيذ الخادم بلغة C++

\n\n

أنشئ ملف server.cc:

\n\n
#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:

\n\n
#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                    

توصيات