gRPC para C# (.NET): bibliotecas e exemplos
gRPC é um framework moderno e de alto desempenho para chamada remota de procedimentos (RPC), desenvolvido pelo Google. Ele utiliza HTTP/2 para transporte e Protocol Buffers (protobuf) para serialização de dados. No ecossistema .NET, o gRPC tornou-se a principal ferramenta para construção de arquiteturas de microsserviços, oferecendo tipagem forte, transmissão bidirecional por streaming e baixa latência. Neste artigo, abordaremos as principais bibliotecas para trabalhar com gRPC em C# e apresentaremos exemplos práticos.
Principais bibliotecas para gRPC no .NET
Para trabalhar com gRPC no .NET, são utilizados os seguintes pacotes NuGet:
- Grpc.Net.Client — biblioteca cliente para criação de clientes gRPC. Funciona sobre o HttpClient e suporta todos os tipos de chamadas: unary, server streaming, client streaming e bidirectional streaming.
- Grpc.AspNetCore.Server — biblioteca servidora para integração do gRPC no ASP.NET Core. Permite hospedar serviços gRPC juntamente com APIs REST comuns.
- Google.Protobuf — biblioteca para trabalhar com Protocol Buffers, geração e desserialização de mensagens.
- Grpc.Tools — conjunto de ferramentas para geração automática de código C# a partir de arquivos .proto durante a compilação do projeto.
O processo de desenvolvimento inclui três etapas: descrição do serviço no arquivo .proto, geração de código e implementação do servidor/cliente.
Exemplo 1: Serviço unary simples (requisição-resposta)
Criaremos um serviço simples para obter informações de um usuário. Para isso, definimos o arquivo user.proto:
syntax = "proto3";
package user;
service UserService { rpc GetUser (UserRequest) returns (UserResponse);}
message UserRequest { int32 id = 1;}
message UserResponse { string name = 1; string email = 2; int32 age = 3;}Adicione ao projeto as referências aos pacotes e ao arquivo .proto. Após a compilação, serão geradas as classes UserRequest, UserResponse e a classe base UserServiceBase.
Implementação do servidor
using Grpc.Core;using User;
public class UserServiceImpl : UserService.UserServiceBase{ public override Task<UserResponse> GetUser(UserRequest request, ServerCallContext context) { var user = new UserResponse { Name = "Ivan Petrov", Email = "ivan@example.com", Age = 30 }; return Task.FromResult(user); }}Inicialização do servidor no ASP.NET Core:
var builder = WebApplication.CreateBuilder(args);builder.Services.AddGrpc();var app = builder.Build();app.MapGrpcService<UserServiceImpl>();app.Run();Implementação do cliente
using Grpc.Net.Client;using User;
var channel = GrpcChannel.ForAddress("https://localhost:5001");var client = new UserService.UserServiceClient(channel);
var response = await client.GetUserAsync(new UserRequest { Id = 1 });Console.WriteLine($"Usuário: {response.Name}, Email: {response.Email}");Exemplo 2: Transmissão por streaming do servidor (Server Streaming)
A transmissão por streaming do servidor é útil quando é necessário enviar muitos dados ao cliente, como uma lista de eventos ou logs. Vamos complementar nosso arquivo .proto:
service UserService { rpc GetUser (UserRequest) returns (UserResponse); rpc ListUsers (Empty) returns (stream UserResponse);}
message Empty {}Implementação do servidor:
public override async Task ListUsers(Empty request, IServerStreamWriter<UserResponse> responseStream, ServerCallContext context){ var users = new List<UserResponse> { new UserResponse { Name = "Ana", Email = "ana@teste.com" }, new UserResponse { Name = "Boris", Email = "boris@teste.com" } };
Também na biblioteca
Cliente HTTP para Go (Golang): as melhores bibliotecas para trabalhar com rede
Autorização e Autenticação em Java: Spring Security e JWT
Componente de Navegação para Kotlin: guia completo com exemplos