단항 및 서버 스트리밍 RPC
단항 호출과 서버 측 스트리밍을 구현해 서버에서 클라이언트로 데이터를 실시간 푸시합니다.
단항 및 서버 스트리밍 RPC은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
gRPC RPC 형식
gRPC는 네 가지 RPC 패턴을 지원합니다. 단항(요청/응답), 서버 스트리밍(클라이언트가 하나를 보내고 서버가 여러 개를 보냄), 클라이언트 스트리밍, 양방향 스트리밍입니다. 이 강의에서는 처음 두 가지를 다룹니다.
단항 RPC: 기본 패턴
단항은 가장 간단한 패턴으로, 요청 하나와 응답 하나로 구성됩니다. 일반 함수 호출처럼 보이지만 프로토콜 버퍼 인코딩을 사용하여 HTTP/2를 통해 전송됩니다.
// .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; }단항 RPC 구현하기
생성된 기본 메서드를 재정의합니다. ServerCallContext는 메타데이터, 취소 토큰, 기한 및 피어 정보를 제공합니다.
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
};
}
}Client에서 단항 RPC 호출하기
생성된 client는 동기 방식처럼 보이는 메서드와 진정한 비동기 메서드를 모두 제공합니다. 프로덕션에서는 항상 Async 변형을 사용하십시오.
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}");서버 스트리밍: 프로토콜 정의
서버 스트리밍에서는 응답 형식 앞에 stream 키워드를 추가합니다. 서버는 스트림을 닫기 전에 동일한 connection에서 여러 메시지를 보냅니다.
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; }서버 스트리밍 구현하기
메시지를 보내려면 IServerStreamWriter<T>를 사용하십시오. 메서드는 Task를 반환합니다. 작업이 끝날 때까지 작성한 다음 반환하십시오.
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);
}
}Client에서 서버 스트림 소비하기
각 메시지가 도착하는 대로 처리하려면 ResponseStream.ReadAllAsync()에서 await foreach를 사용하십시오.
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 cancels서버 스트림 취소하기
스트림을 client 측에서 중지하려면 호출을 열 때 CancellationToken을 전달하십시오. 서버는 자체 토큰을 통해 취소를 받습니다.
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.");
}메타데이터: 요청 헤더와 트레일러
gRPC는 메타데이터(키-값 쌍)를 지원합니다. 메타데이터는 응답 전에 헤더로, 응답 후에 트레일러로 전송됩니다. 인증 토큰, 추적 ID 또는 페이지 매김 커서에 사용하십시오.
// 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");브라우저 Clients용 gRPC-Web
브라우저에서는 원시 gRPC를 사용할 수 없습니다(HTTP/2 트레일러가 지원되지 않음). Grpc.AspNetCore.Web과 grpc-web JavaScript client 또는 Blazor의 Grpc.Net.Client.Web을 사용하십시오.
// 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 });실전: log 스트리밍 서비스
log 집계 서비스는 서버 스트리밍을 사용하여 애플리케이션 log 항목을 연결된 모니터링 클라이언트에 실시간으로 스트리밍합니다.
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)
});
}
}
}빠른 확인
.proto 파일에서 서버 스트리밍 RPC를 나타내는 키워드는 무엇입니까?
복습: 단항 및 서버 스트리밍 RPC
핵심 요점:
- 단항 RPC: 요청 하나, 응답 하나 — 가장 일반적인 패턴입니다
- 서버 스트리밍: 하나의 요청에 대해 시간에 따라 여러 응답 메시지를 보냅니다
IServerStreamWriter<T>에 작성하여 서버 스트리밍을 구현합니다ReadAllAsync()에서await foreach를 사용하여 서버 스트림을 소비합니다- CancellationToken을 사용하여 어느 쪽에서든 스트림을 깔끔하게 중지합니다
- gRPC-Web를 사용하면 브라우저 client가 gRPC 서비스를 호출할 수 있습니다
AI 튜터와 함께 C#을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 93
- 레슨
- 346
자주 묻는 질문
“단항 및 서버 스트리밍 RPC” 강의는 무료인가요?
네 — “단항 및 서버 스트리밍 RPC” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“단항 및 서버 스트리밍 RPC”에서 뭘 배우나요?
단항 호출과 서버 측 스트리밍을 구현해 서버에서 클라이언트로 데이터를 실시간 푸시합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“단항 및 서버 스트리밍 RPC” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- gRPC와 Protobuf 기초
- 단항 및 서버 스트리밍 RPC
- 클라이언트와 양방향 스트리밍
- 기한, 취소와 인터셉터