gRPC لـ Kotlin: المكتبات والأمثلة
gRPC هو إطار عمل عالي الأداء للاستدعاء الإجرائي عن بُعد (RPC)، طورته Google. يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. في نظام Kotlin البيئي، يتكامل gRPC بشكل ممتاز مع coroutines، مما يجعله خيارًا مثاليًا لبناء الخدمات المصغرة غير المتزامنة.
في هذه المقالة، سنشرح كيفية إعداد خادم وعميل gRPC على Kotlin باستخدام المكتبة الرسمية gRPC-Kotlin (grpc-kotlin). ستشاهد الدورة الكاملة: من وصف ملف proto إلى التشغيل والاختبار.
1. المكتبات الأساسية
للعمل مع gRPC في Kotlin، تُستخدم المكونات الرئيسية التالية:
- protobuf-gradle-plugin — إضافة لترجمة ملفات
.protoإلى فئات Kotlin/Java. - grpc-kotlin-stub — مكتبة تُنشئ stubs خاصة بـ Kotlin coroutine (دوال suspend).
- grpc-netty-shaded — طبقة نقل تعتمد على Netty (HTTP/2 مدمج).
- grpc-protobuf-lite — نسخة خفيفة من protobuf لنظام Android/العملاء.
2. هيكل المشروع
سنستخدم Gradle (Kotlin DSL). أنشئ مشروعًا بالهيكل التالي:
my-grpc-app/├── build.gradle.kts├── settings.gradle.kts└── src/ ├── main/ │ ├── proto/ │ │ └── hello.proto │ └── kotlin/ │ ├── server/ │ │ └── HelloServer.kt │ └── client/ │ └── HelloClient.kt3. وصف ملف proto
أنشئ ملف hello.proto في src/main/proto/:
syntax = "proto3";
package com.example.grpc;
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}4. إعداد Gradle (build.gradle.kts)
أضف الإضافات والتبعيات اللازمة:
plugins { id("org.jetbrains.kotlin.jvm") version "1.9.22" id("com.google.protobuf") version "0.9.4"}
repositories { mavenCentral()}
dependencies { implementation("io.grpc:grpc-kotlin-stub:1.4.1") implementation("io.grpc:grpc-netty-shaded:1.60.0") implementation("io.grpc:grpc-protobuf-lite:1.60.0")}
protobuf { protoc { artifact = "com.google.protobuf:protoc:3.25.1" } plugins { create("grpc") { artifact = "io.grpc:protoc-gen-grpc-java:1.60.0" } create("grpckt") { artifact = "io.grpc:protoc-gen-grpc-kotlin:1.4.1:jdk8@jar" } } generateProtoTasks { all().forEach { task -> task.plugins { create("grpc") { } create("grpckt") { } } } }}5. تنفيذ خادم gRPC
أنشئ ملف HelloServer.kt:
package com.example.server
import com.example.grpc.GreeterGrpcKtimport com.example.grpc.HelloReplyimport com.example.grpc.HelloRequestimport io.grpc.ServerBuilder
class GreeterService : GreeterGrpcKt.GreeterCoroutineImplBase() { override suspend fun sayHello(request: HelloRequest): HelloReply { println("تم استلام طلب من: ${request.name}") return HelloReply.newBuilder() .setMessage("مرحبًا، ${request.name}!") .build() }}
fun main() { val port = 50051 val server = ServerBuilder.forPort(port) .addService(GreeterService()) .build() .start()
println("خادم gRPC يعمل على المنفذ $port") server.awaitTermination()}6. تنفيذ عميل gRPC
أنشئ ملف HelloClient.kt:
package com.example.client
import com