gRPC para C# (.NET): bibliotecas, configuração e exemplos de código

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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" }    };

Recommendations