0Pricing
Learn Rust Coding · Ders

gRPC Sunucusu Uygulama

Tekli RPC yöntemleri sunun.

gRPC Sunucusu Uygulama, CoddyKit'te ücretsiz bir Learn Rust Coding dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Learn Rust Coding öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Learn Rust Coding kursu toplamda 4 dersten oluşur.

Oluşturulan Sunucu Özelliği

Greeter adlı bir hizmet için tonic, greeter_server içinde bir özellik oluşturur. Davranışı sağlamak için bu özelliği kendi yapınız üzerinde uygularsınız.

Özellik, #[tonic::async_trait] aracılığıyla async olarak tanımlanır; bu nedenle her yöntem bir Result döndüren eşzamansız bir fn'dir.

use greeter::v1::greeter_server::{Greeter, GreeterServer};
use greeter::v1::{HelloRequest, HelloReply};

İstek ve Yanıt Sarmalayıcıları

Yöntemler bir tonic::Request<T> alır ve tonic::Response<T> döndürür. Bu sarmalayıcılar üst verileri, uzantıları ve iç iletiyi taşır.

Kod çözülmüş iletiyi almak için .into_inner() çağrısını, bir yanıt oluşturmak için de Response::new(..) çağrısını kullanın.

let req: HelloRequest = request.into_inner();
let reply = HelloReply { message: format!("Hi {}", req.name) };
Ok(Response::new(reply))

Bir Sunucu Yapısı

Veritabanı havuzu gibi paylaşılan durumları tutacak bir yapı tanımlayın. Durum içermediğinde genellikle Default türetir.

Oluşturulan özelliği bu yapı üzerinde uygulayacaksınız.

#[derive(Default)]
pub struct MyGreeter {}

Tekli Yöntem Uygulama

impl bloğuna #[tonic::async_trait] özniteliğini ekleyin ve her RPC'yi, oluşturulan imzayla eşleşen bir eşzamansız fn olarak uygulayın.

Başarılı durumda Ok(Response::new(reply)) döndürün.

#[tonic::async_trait]
impl Greeter for MyGreeter {
    async fn say_hello(&self, request: Request<HelloRequest>)
        -> Result<Response<HelloReply>, Status> {
        let name = request.into_inner().name;
        Ok(Response::new(HelloReply { message: format!("Hello {name}") }))
    }
}

Status ile Hata Döndürme

Hatalar, bir gRPC durum koduna eşlenen tonic::Status olarak döndürülür. Status::invalid_argument veya Status::not_found gibi oluşturucuları kullanın.

İleti dizesi, kodla birlikte istemciye gönderilir.

if name.is_empty() {
    return Err(Status::invalid_argument("name must not be empty"));
}

Oluşturma ve Sunma

Eşzamansız bir main içinde tonic::transport::Server kullanın. Hizmetinizi, oluşturulan ...Server türüyle sarmalanmış şekilde ekleyin ve ardından bir yuva adresiyle serve çağrısını yapın.

#[tokio::main] makrosu çalışma zamanını sağlar.

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let addr = "[::1]:50051".parse()?;
    Server::builder()
        .add_service(GreeterServer::new(MyGreeter::default()))
        .serve(addr)
        .await?;
    Ok(())
}

Sunucu Akışlı Yanıtlar

Sunucu akışlı bir yöntem, bir akış türü döndürür. tonic, ilişkili bir türle birlikte kutulanmış bir akış kullanır; iletileri beslemek için mpsc kanalı yaygın bir yöntemdir.

ReceiverStream'i bir Response içine sararak döndürürsünüz.

use tokio_stream::wrappers::ReceiverStream;
let (tx, rx) = tokio::sync::mpsc::channel(8);
tokio::spawn(async move { tx.send(Ok(reply)).await.ok(); });
Ok(Response::new(ReceiverStream::new(rx)))

Üst Verileri Okuma

İstek üst verileri, kimlik doğrulama belirteçleri gibi üst bilgileri içerir. Gövdeyi tüketmeden önce bunlara request.metadata() ile erişin.

Anahtarlar ASCII'dir ve büyük-küçük harfe duyarlı değildir; değerler MetadataValue olarak döndürülür.

if let Some(token) = request.metadata().get("authorization") {
    // validate token
} else {
    return Err(Status::unauthenticated("missing token"));
}

Araya Giriciler

Bir araya girici her istekten önce çalışır; kimlik doğrulama veya günlük kaydı için idealdir. Request alır ve isteği ya da bir Status hatasını döndürür.

Hizmeti eklerken with_interceptor ile ilişkilendirin.

fn auth(req: Request<()>) -> Result<Request<()>, Status> {
    match req.metadata().get("authorization") {
        Some(_) => Ok(req),
        None => Err(Status::unauthenticated("no token")),
    }
}
// .add_service(GreeterServer::with_interceptor(svc, auth))

Düzenli Kapatma

Bir gelecek çözümlendiğinde, örneğin Ctrl-C sinyali geldiğinde yeni bağlantıları kabul etmeyi durdurmak için serve_with_shutdown kullanın.

Devam eden istekler sunucu çıkmadan önce tamamlanır; böylece bağlantılar aniden kesilmez.

Server::builder()
    .add_service(GreeterServer::new(MyGreeter::default()))
    .serve_with_shutdown(addr, async {
        tokio::signal::ctrl_c().await.ok();
    })
    .await?;

Paylaşılan Durum

İstekler arasında değiştirilebilir durumu paylaşmak için bu durumu sunucu yapınızın içinde Arc ve tokio::sync::Mutex gibi bir eşzamanlama ilkelinin arkasında tutun.

tonic hizmeti bağlantı başına çoğalttığından, kolayca kopyalanabilen paylaşılan tutacaklar doğru yaklaşımdır.

use std::sync::Arc;
use tokio::sync::Mutex;

#[derive(Default)]
pub struct MyGreeter {
    hits: Arc<Mutex<u64>>,
}

Kısa Kontrol

gRPC yöntemleri tonic'te başarısızlıkları nasıl bildirir?

Özet

Oluşturulan sunucu özelliğini uyguladınız: isteklerin içindeki iletileri çıkardınız, yanıtlar ve Status hataları döndürdünüz, tokio ile hizmet sundunuz, yanıtları akış olarak ilettiniz, üst verileri okudunuz, araya giriciler eklediniz, düzenli kapanmayı sağladınız ve durumu Arc ile paylaştınız.

Sonraki adımda bu sunucuyu çağıracak bir istemci oluşturacaksınız.

Sıkça Sorulan Sorular

“gRPC Sunucusu Uygulama” dersi ücretsiz mi?

Evet — “gRPC Sunucusu Uygulama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Learn Rust Coding kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Learn Rust Coding kursu toplamda 4 dersten oluşur.

“gRPC Sunucusu Uygulama” dersinde ne öğreneceğim?

Tekli RPC yöntemleri sunun. Learn Rust Coding ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Learn Rust Coding öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Learn Rust Coding, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“gRPC Sunucusu Uygulama” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Learn Rust Coding dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Learn Rust Coding dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Protobuf ve Hizmet Tanımları
  2. tonic-build ile Kod Oluşturma
  3. gRPC Sunucusu Uygulama
  4. gRPC İstemcisinden Çağrı Yapma
← Learn Rust Coding Sayfasına Dön