Ana içeriğe geç

Kod Üretimi

Bir [Protobuf][protobuf] şeması, bir hizmeti, onun yöntemlerini (API'lerini) ve bunların istek/yanıt türlerini tanımlayan basit bir dosyadır:

syntax = "proto3";

package connectrpc.eliza.v1;

message SayRequest {
string sentence = 1;
}

message SayResponse {
string sentence = 1;
}

service ElizaService {
rpc Say(SayRequest) returns (SayResponse) {}
}

Yukarıdaki tanımın tamamen belgelenmiş bir versiyonu Buf Schema Registry (BSR) içinde görülebilir.

rpc anahtar kelimesi, uzaktan prosedür çağrısını (Remote Procedure Call) ifade eder — uzaktan çağrılabilen bir API yöntemi. Şema, sunucu ve istemci arasında bir sözleşme olup verilerin nasıl değiştirileceğini kesin bir şekilde tanımlar.

Şema, kod üreterek hayat bulur. Sunucu için bir arayüz oluşturulur ve mühendis, yöntemleri iş mantığı ile doldurmaya odaklanabilir. İstemci için ise, mühendis sadece istemci yöntemlerini çağırabilir, derleme zamanı tür güvenliği ve serileştirme için üretilen türlere güvenebilir ve uygulama mantığına odaklanabilir.

Uzaktan Eklentiler

Not: Eğitimde yer alan örnek, bu bölümün içeriğinin çoğunu kapsamaktadır.

[Protobuf eklentileri][available-plugins], .proto dosyası girdilerini kabul eden ve çeşitli çıktılar (.kt dosyaları bu durumda) üreten çalıştırılabilirlerdir. Uzaktan bir makinada üretim yapmak yerel kurulumu kolaylaştırır ve üretimin izole bir ortamda gerçekleşmesine olanak tanır. [Buf][buf] kullanacağız, bu Google'ın protobuf derleyicisi için modern bir alternatiftir ve [uzaktan eklentiler][remote-plugins] ile birlikte kullanılacaktır.

Bu, [Buf CLI'sinin][buf-cli] kurulmasını gerektirir:

brew install bufbuild/buf/buf

Yeni bir proje geliştirirken, oluşturulması gereken 2 yeni dosya vardır:

  • [buf.yaml][buf.yaml]
  • [buf.gen.yaml][buf.gen.yaml]

İlk dosya olan buf.yaml, şu komutla oluşturulabilir:

buf config init

İkinci dosya olan buf.gen.yaml, manuel olarak oluşturulmalı ve hangi eklentilerin kod üretmek için kullanılacağını belirtmelidir. Bu dosyanın bir örneği aşağıda gösterilmektedir:

version: v2
plugins:
- remote: buf.build/connectrpc/kotlin
out: generated
- remote: buf.build/protocolbuffers/java
out: generated

Bu dosya, [Connect-Kotlin eklentisi][connect-kotlin-plugin] çıktılarının generated dizinine yerleştirilmesini belirtir. Bu eklenti, tanımlanan service ve rpc türlerinden Kotlin arayüzleri ve bunların karşılık gelen uygulamalarını içeren .kt dosyaları oluşturur.

Yapılandırma ayrıca, .java çıktılarının aynı generated dizinine yerleştirileceği [protocolbuffers/java eklentisi][java-protobuf-plugin] ile başka bir seçenek grubu içerir. Bu eklenti, message ve enum gibi Protobuf türlerinden modeller oluşturur.

Önemli: Birlikte, bu iki eklenti gerekli tüm kodu üretir.

buf.gen.yaml içindeki eklentilerin yapılandırılması hakkında ayrıntılar [belgelerde][remote-plugins] bulunabilir ve mevcut uzaktan eklentilerin tam listesi [burada][available-plugins] bulunmaktadır.

Bu yapılandırma dosyaları yerinde olduğunda, kod üretmek için aşağıdaki komutu yürütün:

buf generate

Yukarıdaki yapılandırma ve örnek eliza.proto dosyasıyla birlikte, artık generated dizininde bazı üretilmiş dosyalar olmalıdır:

generated
└── connectrpc
└── eliza
└── v1
├── ConverseRequest.java
├── ConverseRequestOrBuilder.java
├── ConverseResponse.java
├── ConverseResponseOrBuilder.java
├── ElizaProto.java
├── ElizaServiceClient.kt
├── ElizaServiceClientInterface.kt
├── IntroduceRequest.java
├── IntroduceRequestOrBuilder.java
├── IntroduceResponse.java
├── IntroduceResponseOrBuilder.java
├── SayRequest.java
├── SayRequestOrBuilder.java
├── SayResponse.java
└── SayResponseOrBuilder.java

Üretilen Kodu Kullanma

Bir Gradle projesi için belirli bir dizine doğrudan üretin.

Üretilen kod, hem Connect hem de Google Java protobuf kütüphanelerine bağlıdır. Bu bağımlılıkları eklemek için Başlarken eğitiminde bu adımları takip edin.

Üretilen kodu çağırma konusunda rehberlik için, istemcileri kullanma belgelerine bakın.

Üretim Seçenekleri

Aşağıdaki üretim seçenekleri, çıktıların özelleştirilmesi için buf.gen.yaml dosyasının opt alanında birleştirilebilir:

SeçenekTürVarsayılanTekrarlanabilirAyrıntılar
generateCallbackMethodsBooleanfalseHayırTekil yöntemler için geri çağrı imzaları üretir.
generateCoroutineMethodsBooleantrueHayırTekil yöntemler için askıya alma imzaları üretir.
generateBlockingUnaryMethodsBooleanfalseHayırTekil yöntemler için engelleyici imzalar üretir.