gRPC لـ Kotlin: المكتبات وأمثلة الاستخدام
\n\ngRPC هو إطار عمل عالي الأداء لاستدعاء الإجراءات عن بُعد (RPC)، طورته Google. يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. في نظام Kotlin البيئي، يتكامل gRPC بسلاسة خاصة بفضل المكتبات التي تدعم coroutines والكتابة الصارمة. في هذه المقالة، سنستعرض الأدوات الأساسية اللازمة للعمل مع gRPC في Kotlin، ونقدم أمثلة عملية للخادم والعميل.
\n\nالمكتبات الأساسية
\n\nللعمل مع gRPC في Kotlin، ستحتاج إلى المجموعة التالية:
\n\n- \n
- grpc-kotlin — المكتبة الرسمية من Google، التي توفر واجهات برمجة تطبيقات خاصة بـ Kotlin، بما في ذلك دعم coroutines (وظائف suspend، Flow). \n
- protobuf-java و protobuf-gradle-plugin — لتوليد الفئات من ملفات .proto. \n
- grpc-netty أو grpc-okhttp — طبقة النقل (Netty للخادم، OkHttp لنظام Android/العميل). \n
- javax.annotation-api — غالبًا ما يكون مطلوبًا لتجميع الكود المولد بشكل صحيح. \n
لإدارة التبعيات، استخدم Gradle (Kotlin DSL). مثال على كتلة dependencies:
\n\ndependencies {\n implementation("io.grpc:grpc-netty-shaded:1.58.0")\n implementation("io.grpc:grpc-protobuf:1.58.0")\n implementation("io.grpc:grpc-stub:1.58.0")\n implementation("io.grpc:grpc-kotlin-stub:1.4.0")\n implementation("com.google.protobuf:protobuf-java:3.24.3")\n implementation("javax.annotation:javax.annotation-api:1.3.2")\n}\n\nأيضًا، تأكد من إضافة إضافة protobuf لتوليد الكود:
\n\nplugins {\n id("com.google.protobuf") version "0.9.4"\n}\n\nprotobuf {\n protoc {\n artifact = "com.google.protobuf:protoc:3.24.3"\n }\n plugins {\n create("grpc") {\n artifact = "io.grpc:protoc-gen-grpc-java:1.58.0"\n }\n create("grpckt") {\n artifact = "io.grpc:protoc-gen-grpc-kotlin:1.4.0:jdk8@jar"\n }\n }\n generateProtoTasks {\n all().forEach {\n it.plugins {\n create("grpc")\n create("grpckt")\n }\n }\n }\n}\n\nتعريف الخدمة عبر ملف .proto
\n\nأنشئ ملف src/main/proto/hello.proto:
syntax = "proto3";\n\npackage com.example.grpc;\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بعد تشغيل بناء Gradle، سيتم توليد الفئات: HelloRequest، HelloReply، GreeterGrpc و GreeterGrpcKt (إصدار Kotlin مع coroutines).
تنفيذ خادم gRPC في Kotlin
\n\nسيستخدم الخادم الفئة المولدة GreeterGrpcKt.GreeterCoroutineImplBase:
import com.example.grpc.GreeterGrpcKt\nimport com.example.grpc.HelloReply\nimport com.example.grpc.HelloRequest\nimport io.grpc.ServerBuilder\nimport kotlinx.coroutines.runBlocking\n\nclass GreeterService : GreeterGrpcKt.GreeterCoroutineImplBase() {\n override suspend fun sayHello(request: HelloRequest): HelloReply {\n val message = "مرحبًا، ${request.name}!"\n println("تم استلام الطلب: ${request.name}")\n return HelloReply.newBuilder().setMessage(message).build()\n }\n}\n\nfun main() {\n val port = 50051\n val server = ServerBuilder.forPort(port)\n .addService(GreeterService())\n .build()\n\n server.start()\n println("تم تشغيل الخادم على المنفذ $port")\n server.awaitTermination()\n}\n\nتنفيذ عميل gRPC في Kotlin
\n\nيستخدم العميل قناة و stub مع دعم coroutines:
\n\nimport com.example.grpc.GreeterGrpcKt\ni