gRPC للغة C++: المكتبات، الأمثلة ودليل الاستخدام

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

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

ابدأ الدورة

gRPC للغة C++: المكتبات والأمثلة والدليل العملي

gRPC هي بيئة حديثة وعالية الأداء لاستدعاء الإجراءات عن بعد (RPC)، طورتها Google. تتيح لتطبيقات العميل والخادم بلغات مختلفة (بما في ذلك C++ و Python و Go و Java) التواصل مع بعضها البعض بسهولة كما لو كانت استدعاءات وظائف محلية. بالنسبة للغة C++، يوفر gRPC واجهة قوية ومكتوبة بشكل صارم تعتمد على Protocol Buffers (protobuf)، مما يجعله خيارًا مثاليًا لإنشاء الخدمات المصغرة والأنظمة الموزعة.

في هذه المقالة، سنقوم بتحليل المكتبات الرئيسية، وعملية التثبيت، وكتابة مثال كامل لخادم وعميل gRPC بلغة C++.



المكتبات الرئيسية لـ gRPC في C++

للعمل مع gRPC بلغة C++، ستحتاج إلى المكونات التالية:

  • grpc (libgrpc++) — مكتبة gRPC الأساسية. تحتوي على تنفيذ طبقة النقل (HTTP/2)، والقنوات، والخوادم، والمكدسات غير المتزامنة.
  • protobuf (libprotobuf) — مكتبة لتسلسل البيانات المنظمة. تحدد تنسيق الرسائل (ملفات .proto) وتقوم بتوليد كود C++.
  • grpc++ (libgrpc++_unsecure أو libgrpc++_reflection) — غلاف C++ عالي المستوى لـ gRPC. يوفر واجهة برمجة تطبيقات متزامنة وغير متزامنة للخدمات.
  • grpc_cpp_plugin — إضافة لمترجم protobuf (protoc)، والتي تقوم بتوليد كود C++ للخوادم والعملاء في gRPC.
  • abseil-cpp — مكتبة من Google، تستخدمها gRPC للسلاسل النصية، والخيوط، والمزامنة (غالبًا ما يتم تضمينها تلقائيًا).


التثبيت والإعداد

الطريقة الموصى بها للتثبيت هي البناء من المصدر أو استخدام مدير الحزم vcpkg/conan. سنعرض التثبيت عبر vcpkg:

# تثبيت vcpkg (إذا لم يكن مثبتًا بالفعل)git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh

# تثبيت gRPC مع دعم C++./vcpkg install grpc[ssl]

بعد التثبيت، قم بتضمين المكتبات في ملف CMakeLists.txt:

cmake_minimum_required(VERSION 3.15)project(GrpcExample CXX)

set(CMAKE_CXX_STANDARD 17)find_package(gRPC CONFIG REQUIRED)find_package(Protobuf CONFIG REQUIRED)

# توليد ملفات protoset(PROTO_FILE proto/hello.proto)set(GENERATED_PROTO_SRC ${CMAKE_CURRENT_BINARY_DIR}/hello.pb.cc)set(GENERATED_PROTO_HDR ${CMAKE_CURRENT_BINARY_DIR}/hello.pb.h)set(GENERATED_GRPC_SRC ${CMAKE_CURRENT_BINARY_DIR}/hello.grpc.pb.cc)set(GENERATED_GRPC_HDR ${CMAKE_CURRENT_BINARY_DIR}/hello.grpc.pb.h)

add_custom_command( OUTPUT ${GENERATED_PROTO_SRC} ${GENERATED_PROTO_HDR} ${GENERATED_GRPC_SRC} ${GENERATED_GRPC_HDR} COMMAND protobuf::protoc ARGS --grpc_out ${CMAKE_CURRENT_BINARY_DIR} --cpp_out ${CMAKE_CURRENT_BINARY_DIR} --plugin=protoc-gen-grpc=$<TARGET_FILE:gRPC::grpc_cpp_plugin> -I ${CMAKE_CURRENT_SOURCE_DIR}/proto ${CMAKE_CURRENT_SOURCE_DIR}/${PROTO_FILE} DEPENDS ${PROTO_FILE} COMMENT "توليد كود gRPC من ملفات proto")add_library(generated_proto ${GENERATED_PROTO_SRC} ${GENERATED_GRPC_SRC})target_include_directories(generated_proto PUBLIC ${CMAKE_CURRENT_BINARY_DIR})target_link_libraries(generated_proto gRPC::grpc++ protobuf::libprotobuf)


إنشاء ملف .proto

أولاً، سنقوم بتعريف الخدمة والرسائل في ملف hello.proto:

syntax = "proto3";

package hello;

// الطلب: نرسل الاسمmessage HelloRequest { string name = 1;}

// الرد: نحصل على التحيةmessage HelloReply { string message = 1;}

// تعريف خدمة gRPCservice Greeter { // RPC أحادي (طلب واحد - رد واحد) rpc SayHello (HelloRequest) returns (HelloReply);}


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

سنقوم بإنشاء ملف se

توصيات