Tekli ve Sunucu Akışlı RPC'ler
Tekli çağrıları ve verileri sunucudan istemciye gerçek zamanlı gönderen sunucu tarafı akışını uygulayın.
Tekli ve Sunucu Akışlı RPC'ler, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 2. 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, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
gRPC RPC Türleri
gRPC dört RPC örüntüsünü destekler: Tekli (istek/yanıt), Sunucu akışı (istemci bir tane gönderir, sunucu birçok tane gönderir), İstemci akışı ve Çift yönlü akış. Bu derste ilk ikisi ele alınır.
Tekli RPC: Temel Örüntü
Tekli, en basit örüntüdür — bir istek, bir yanıt. Normal bir işlev çağrısı gibi görünür, ancak Protobuf kodlamasıyla HTTP/2 üzerinden iletilir.
// .proto definition
service OrderService {
rpc GetOrder (GetOrderRequest) returns (OrderResponse);
}
message GetOrderRequest { int32 id = 1; }
message OrderResponse { int32 id = 1; string status = 2; double total = 3; }Tekli RPC Uygulama
Oluşturulan temel metodu geçersiz kılın. ServerCallContext; meta verileri, iptal belirtecini, son tarihi ve eş bilgilerini sağlar.
public class OrderService : OrderService.OrderServiceBase
{
private readonly IOrderRepository _repo;
public OrderService(IOrderRepository repo) => _repo = repo;
public override async Task<OrderResponse> GetOrder(
GetOrderRequest request,
ServerCallContext context)
{
var order = await _repo.GetByIdAsync(request.Id, context.CancellationToken);
if (order is null)
throw new RpcException(new Status(StatusCode.NotFound, "Order not found"));
return new OrderResponse
{
Id = order.Id,
Status = order.Status.ToString(),
Total = (double)order.Total
};
}
}İstemciden Tekli RPC Çağrısı
Oluşturulan istemci hem eş zamanlı görünen hem de gerçekten eşzamansız yöntemler sağlar. Üretimde her zaman Async çeşidini kullanın.
var client = new OrderService.OrderServiceClient(channel);
// Async call with cancellation
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var reply = await client.GetOrderAsync(
new GetOrderRequest { Id = 42 },
cancellationToken: cts.Token);
Console.WriteLine($"Order {reply.Id}: {reply.Status} - ${reply.Total}");Sunucu Akışı: Protokol Tanımı
Sunucu akışı, yanıt türünün önüne stream anahtar sözcüğünün eklenmesiyle oluşturulur. Sunucu, akışı kapatmadan önce aynı bağlantı üzerinden birden çok ileti gönderir.
service StockService {
// Client sends one symbol, server streams price updates
rpc WatchStock (WatchRequest) returns (stream StockUpdate);
}
message WatchRequest { string symbol = 1; }
message StockUpdate { string symbol = 1; double price = 2; int64 timestamp = 3; }Sunucu Akışını Uygulama
İletileri göndermek için IServerStreamWriter<T> kullanın. Yöntem bir Task döndürür — işlem tamamlanana kadar yazın, ardından dönün.
public override async Task WatchStock(
WatchRequest request,
IServerStreamWriter<StockUpdate> responseStream,
ServerCallContext context)
{
while (!context.CancellationToken.IsCancellationRequested)
{
var price = await _market.GetPriceAsync(request.Symbol);
await responseStream.WriteAsync(new StockUpdate
{
Symbol = request.Symbol,
Price = price,
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
});
await Task.Delay(1000, context.CancellationToken);
}
}İstemciden Sunucu Akışını Tüketme
Her iletiyi geldiği anda işlemek için ResponseStream.ReadAllAsync() üzerinde await foreach kullanın.
using var call = client.WatchStock(
new WatchRequest { Symbol = "MSFT" });
await foreach (var update in call.ResponseStream.ReadAllAsync())
{
Console.WriteLine($"{update.Symbol}: ${update.Price:F2}");
}
// Continues until server closes the stream or client cancelsSunucu Akışını İptal Etme
Akışı istemci tarafında durdurmak için çağrıyı açarken bir CancellationToken geçirin. Sunucu, iptali kendi token'ı aracılığıyla alır.
var cts = new CancellationTokenSource();
// Cancel after 30 seconds
cts.CancelAfter(TimeSpan.FromSeconds(30));
using var call = client.WatchStock(
new WatchRequest { Symbol = "AAPL" },
cancellationToken: cts.Token);
try
{
await foreach (var update in
call.ResponseStream.ReadAllAsync(cts.Token))
{
Console.WriteLine($"Price: {update.Price}");
}
}
catch (OperationCanceledException)
{
Console.WriteLine("Stream cancelled.");
}Üstveri: İstek Üstbilgileri ve Sonbilgiler
gRPC, yanıttan önce üstbilgi, yanıttan sonra ise sonbilgi olarak gönderilen üstverileri (anahtar-değer çiftlerini) destekler. Bunları kimlik doğrulama token'ları, izleme kimlikleri veya sayfalama imleçleri için kullanın.
// Server: send initial metadata
await context.WriteResponseHeadersAsync(new Metadata
{
{ "x-correlation-id", Guid.NewGuid().ToString() }
});
// Server: set trailing metadata
context.ResponseTrailers.Add("x-total-count", "1500");
// Client: read headers
var headers = await call.ResponseHeadersAsync;
var trailerId = headers.GetValue("x-correlation-id");Tarayıcı İstemcileri için gRPC-Web
Tarayıcılar ham gRPC kullanamaz (HTTP/2 sonbilgileri desteklenmez). Grpc.AspNetCore.Web ile grpc-web JavaScript istemcisini veya Blazor'ın Grpc.Net.Client.Web bileşenini kullanın.
// dotnet add package Grpc.AspNetCore.Web
app.UseGrpcWeb();
app.MapGrpcService<GreeterService>().EnableGrpcWeb();
// Blazor client:
var handler = new GrpcWebHandler(GrpcWebMode.GrpcWeb,
new HttpClientHandler());
using var channel = GrpcChannel.ForAddress(
"https://localhost:7042",
new GrpcChannelOptions { HttpHandler = handler });Gerçek Dünya: Günlük Akışı Hizmeti
Bir günlük toplama hizmeti, uygulama günlük girdilerini sunucu akışını kullanarak bağlı izleme istemcilerine gerçek zamanlı olarak aktarır.
public override async Task StreamLogs(
LogStreamRequest request,
IServerStreamWriter<LogEntry> responseStream,
ServerCallContext context)
{
await foreach (var log in _logChannel.Reader.ReadAllAsync(
context.CancellationToken))
{
if (log.Level >= request.MinLevel)
{
await responseStream.WriteAsync(new LogEntry
{
Level = log.Level.ToString(),
Message = log.Message,
Timestamp = Timestamp.FromDateTime(log.Timestamp)
});
}
}
}Hızlı Kontrol
Bir .proto dosyasında sunucu akışlı bir RPC'yi hangi anahtar sözcük belirtir?
Özet: Tekli ve Sunucu Akış RPC'leri
Temel çıkarımlar:
- Tekli RPC: bir istek, bir yanıt — en yaygın örüntü
- Sunucu akışı: zaman içinde bir istek, birden çok yanıt iletisi
- Sunucu akışını
IServerStreamWriter<T>öğesine yazarak uygulayın - Sunucu akışlarını
ReadAllAsync()üzerindeawait foreachkullanarak tüketin - Akışları her iki taraftan da düzgün biçimde durdurmak için CancellationToken kullanın
- gRPC-Web, tarayıcı istemcilerinin gRPC hizmetlerini çağırmasını sağlar
Yapay zeka eğitmeniyle C# öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 93
- Dersler
- 346
Sıkça Sorulan Sorular
“Tekli ve Sunucu Akışlı RPC'ler” dersi ücretsiz mi?
Evet — “Tekli ve Sunucu Akışlı RPC'ler” 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 C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Tekli ve Sunucu Akışlı RPC'ler” dersinde ne öğreneceğim?
Tekli çağrıları ve verileri sunucudan istemciye gerçek zamanlı gönderen sunucu tarafı akışını uygulayın. C# Academy 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.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, 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 2. dersidir.
“Tekli ve Sunucu Akışlı RPC'ler” 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 C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy 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
- gRPC ve Protobuf Temelleri
- Tekli ve Sunucu Akışlı RPC'ler
- İstemci ve Çift Yönlü Akış
- Son Tarihler, İptal ve Araya Giriciler