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.
Neden gRPC tercih edilir?
4. Proje Yapılandırması ve
Tonic'in bu
} [/CODE]
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:
.protodosyası 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(())
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 şekildeMetadataMap 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:
towerkütüphanesi ile birleşerek isteklerin servisler arasındaki yolculuğunu takip etmenizi sağlar.
Özet: Neden Rust + gRPC?
| Özellik | Sağladığı Avantaj |
| Hız | HTTP/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. |