Rust ile Mikroservisler: gRPC ve Tonic Kullanımı

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Mikroservis mimarilerinde hız, düşük gecikme süresi ve dilden bağımsız iletişim kritik öneme sahiptir. Rust'ın performansı, Google tarafından geliştirilen gRPC protokolüyle birleştiğinde ortaya yüksek ölçeklenebilir ve güvenli sistemler çıkar.
Rust ekosisteminde gRPC denildiğinde başvurulan en güçlü kütüphane Tonic'tir.

1. gRPC ve Protocol Buffers (Protobuf) Nedir?​

gRPC, geleneksel REST (JSON over HTTP/1.1) yerine HTTP/2 üzerinden ikili (binary) veri iletimini kullanır. Veriler, Protocol Buffers (.proto) dosyalarıyla tanımlanır.
Neden gRPC tercih edilir?
  • Performans: İkili format JSON'dan çok daha küçüktür ve daha hızlı işlenir.
  • Tip Güvenliği: .proto dosyası bir sözleşme (contract) görevi görür; hem istemci hem sunucu ne beklediğini bilir.
  • Streaming: Çift yönlü veri akışını (streaming) doğal olarak destekler.

2. Tonic Kütüphanesinin Rolü​

Tonic; Tokio (asenkron çalışma zamanı) ve Prost (Protobuf derleyicisi) üzerine inşa edilmiş bir gRPC kütüphanesidir. Sizin yerinize şunları yapar:
  • Protobuf dosyalarından otomatik Rust kodları üretir.
  • Tamamen asenkron bir sunucu ve istemci altyapısı sunar.
  • TLS desteği ve yük dengeleme (load balancing) özelliklerine sahiptir.

3. İlk gRPC Servisini Tanımlama​

Her şey bir .proto dosyasıyla başlar. proto/selamla.proto dosyamızı oluşturalım:
Kod:
 syntax = "proto3"; package selamla;
// Servis tanımı service Selamlayici { rpc SelamVer (SelamIstegi) returns (SelamYaniti); }
// Mesaj yapıları message SelamIstegi { string isim = 1; }
message SelamYaniti { string mesaj = 1; }

4. Proje Yapılandırması ve build.rs

Tonic'in bu .proto dosyasını anlaması için bir "build script" kullanırız. Projenin kök dizinine build.rs ekleyin:
Kod:
 fn main() -> Result<(), Box<dyn std::error::Error>> { tonic_build::compile_protos("proto/selamla.proto")?; Ok(()) }

5. Sunucu (Server) Tarafını Yazma​

Otomatik üretilen kodları kullanarak servis mantığını implemente edelim:
Kod:
 use tonic::{transport::Server, Request, Response, Status}; use selamla::selamlayici_server::{Selamlayici, SelamlayiciServer}; use selamla::{SelamIstegi, SelamYaniti};
// Üretilen kodları modül olarak dahil et pub mod selamla { tonic::include_proto!("selamla"); }
#[derive(Default)] pub struct BenimSelamlayicim {}
#[tonic::async_trait] impl Selamlayici for BenimSelamlayicim { async fn selam_ver(&self, request: Request<SelamIstegi>) -> Result<Response<SelamYaniti>, Status> { let girdi = request.into_inner(); let yanit = SelamYaniti { mesaj: format!("Merhaba {}! Rust ve gRPC dünyasına hoş geldin.", girdi.isim), }; Ok(Response::new(yanit)) } }
#[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let adres = "[::1]:50051".parse()?; let servis = BenimSelamlayicim::default();
[CODE]println!("gRPC Sunucusu {} adresinde çalışıyor...", adres);

Server::builder()
    .add_service(SelamlayiciServer::new(servis))
    .serve(adres)
    .await?;

Ok(())
} [/CODE]

6. Mikroservisler Arası İletişim: Hata Yönetimi ve Metadata​

Mikroservis mimarisinde sadece veri göndermek yetmez; kimlik doğrulama (auth) ve izlenebilirlik (tracing) için metadata kullanımı kritiktir. Tonic, HTTP header'larına benzer şekilde MetadataMap yapısını kullanır.
  • Interceptors: Gelen her isteğe (request) otomatik olarak "API Key" veya "JWT" kontrolü eklemek için kullanılır.
  • Tracing: tower kütüphanesi ile birleşerek isteklerin servisler arasındaki yolculuğunu takip etmenizi sağlar.

Özet: Neden Rust + gRPC?​

ÖzellikSağladığı Avantaj
HızHTTP/2 ve Binary Serileştirme ile milisaniyeler altında gecikme.
Sözleşme (Contract).proto dosyası sayesinde servisler arası uyuşmazlıkların önüne geçilir.
Asenkron GüçTokio sayesinde aynı anda binlerce gRPC isteği düşük kaynak tüketimiyle işlenir.
 
Geri
Üst