Servisler Arası Yüksek Performanslı İletişim için .Net 6 ile gRPC Örneği

Enes Aysan
roofstacks-tech
Published in
3 min readJul 4, 2022

Merhaba arkadaşlar,bugün sizlerle servisler arasında stream tabanlı yüksek performanslı bir iletişim sağlayan gRPC den bahsedeceğiz.

grpc-basics-dotnetcurry
grpc-basics-dotnetcurry
  • gRPC, HTTP/2 protokolünde çalışan bir RPC (Remote Procedure Call) frameworküdür.
  • CNCF (Cloud Native Computing Foundation) tarafından yürütülen popüler bir açık kaynaklı kütüphanedir.
  • Verileri json yada xml yerine Google tarafından geliştirilen protobuf(.proto) ile binary formatında yüksek performanslı bir şekilde serileştirir. Proto hakkında daha detaylı bilgi için;
    https://developers.google.com/protocol-buffers/docs/proto3
  • .Net 6 ile beraber gRPC tarafında performans, yük dengeleme, retry patternler ve en önemlisi HTTP/3 protokolünün(MSQUIC) desteklenmesi gibi konularda geliştirmeler yapılmıştır.
serialization_speed_large
serialization_speed_large-emreyalvac
restvsgrpc
restvsgrpc-emreyalvac

İsterseniz örneğimize başlayalım. Yapmak istediğimiz işlem şu olsun verilen öğrenci listesini kaydedelim. Her kayıt işleminde de consol ekranına bilgi verelim. Bunu gRPC client streaming yöntemiyle yapacağız.

Öncelikle gRPC servisimiz ile yani server tarafı ile başlayalım.

dotnet new grpc -n StudentServiceGRPC

Şimdi “protos” klasörü altına “student.proto” dosyamızı ekleyelim ve csproj içerisinde bunu belirtelim.

<ItemGroup> 
<Protobuf Include=”Protos\student.proto” GrpcServices=”Server” /> </ItemGroup>

Artık servisimizi oluşturma zamanı geldi. Servisimizi oluşturmadan önce projemizi build edelim ve belirttiğimiz proto dosyasınıa göre gerekli code generationların yapılmasını sağlayalım.

dotnet build

Servisimizi tanımlarken kalıtım aldığımız sınıfa dikkat edelim ve proto da belirttiğimiz RPC methodu override ederek içini dolduralım.

Şimdi program.cs içerisine servisimizi register edelim.

app.MapGrpcService<StudentService>();

Artık öğrenci listesini alacağımız api projemizi oluşturabiliriz.

dotnet new webapi -n StudentClientApi

Öncelikle kullanacağımız nuget paketlerini ekleyelim.

dotnet add package Grpc.Net.Client 
dotnet add package Google.Protobuf
dotnet add package Grpc.Tools
dotnet add package Grpc.Net.ClientFactory

Oluşturduğumuz proto dosyasını bu projeye kopyalayarak, namespacemizi güncelleyelim.

option csharp_namespace = “StudentClientApi”;

Daha sonrasında csproj altında tanımlamamızı yapalım. Bu sefer tanımlama yaparken “GrpcServices” attribute değerinin “Client” olmasına dikkat edelim ve projemizi yine build edelim.

<ItemGroup> 
<Protobuf Include=”Protos\student.proto” GrpcServices=”Client” /> </ItemGroup>

Gelen isteği karşılayacak endpointimizi, modelimizi ve endpointten gelen istekleri işleyeceğimiz servisimizi yazalım.

Servislerimizi program.cs içerisine register etmeyi unutmayalım.

builder.Services.AddScoped<IStudentService, StudentService>(); builder.Services.AddGrpcClient<StudentGRPCService.StudentGRPCServiceClient>(o => { o.Address = new Uri(“https://localhost:7026"); //StudentServiceGRPC port });

gRPC kendi içerisinde Resiliency için farklı konfigurasyonlar ve retry patternler barındırır. Örnek bir config;

Daha detaylı retry optionları için;

“dotnet run” komutu ile iki projemizi de ayağa kaldıralım ve swagger/postman aracılığı ile uygulamamızı test edelim.

studentapi-response
grpc-service-console-logs
grpc-service-console-logs

Kaynak Kod: https://github.com/EnesAys/Net6gRPC

Umarım faydalı olmuştur arkadaşlar, kalın sağlıcakla… 😀

Kaynaklar

https://grpc.io/
https://docs.microsoft.com/en-us/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-6.0&tabs=visual-studio
https://docs.microsoft.com/en-us/aspnet/core/grpc/?view=aspnetcore-6.0
https://docs.microsoft.com/en-us/aspnet/core/grpc/clientfactory?view=aspnetcore-6.0
https://emreyalvac.com/grpc/
https://www.aydinwebs.com/blog/grpc-ve-net-6-kullanarak-yuksek-performansli-mikro-hizmetler-olusturma
https://www.gokhan-gokalp.com/high-performance-stream-based-communication-between-services-with-net-5-and-grpc/

--

--