Bir önceki yazımızda genel hatlarıyla gRPC nedir, nerelerde kullanılır bir microservice mimarilerinde nasıl implement edilir gibi konulara değinerek örnek bir case tasarlayıp bu case'e ait olan gRPC Service projemizi oluşturmuştuk. Kısaca gRPC'yi tekrar tanımlayacak olursak;gRPC open source olarak google tarafından geliştirlen ve ilk olarak 2015 yılında tanıtılan bir remote-procedure-call(RPC) kütüphanesidir.
Bu yazımızda ise bir önceki yazımızda yapmış olduğumuz RefundService uygulamasının Refund metodu için bir client projesi oluşturup Unary RPC tipinde iki uygulamanın birbirleri arasında nasıl iletişim kurduklarını gözlemleyeceğiz.
Unary RPC kısaca; client'ın tek bir request atıp karşılığında bir response aldığı server-client arası iletişim türlerinden biridir.
Creating gRPC Refund Client
RefundService'te bulunan Refund metodunu call edecek olan client'ı oluşturmaya başlayalım. Bunun için aynı solution'da RefundClient adında bir ConsoleApp oluşturalım ve proje referanslarına Grpc.Tools, Grpc.Net.Client, Google.Protobuf kütüphanelerini nuget üzerinden eklemiş olalım. Sonrasında RefundService projesinde bulunan refund.proto dosyasını client projesinde Protos adında folder oluşturduktan sonra buraya kopyalayalım. Bu client sadece Refund metodunu call edeceğinden notify ile ilgili tanımlamaları bu yeni .proto dosyasından silelim. Kopyaladıktan sonra client projesi csprj dosyasında refund.proto dosyasının refere edildiği GrpcServices değerini Client olarak değiştirelim. Alabileceği değerler; Both, Client, Default, None, Server.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<None Remove="Protos\refund.proto" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.11.4" />
<PackageReference Include="Grpc.Net.Client" Version="2.28.0" />
<PackageReference Include="Grpc.Tools" Version="2.28.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Protobuf Include="Protos\refund.proto" GrpcServices="Client" />
</ItemGroup>
</Project>
Sonrasında service ile iletişimi sağlayacak olan channel-client initialize ve Refund metodunu call ettiğimiz kod bloğunu aşağıdaki gibi program.cs içerisinde yazalım.
static async Task Main(string[] args)
{
//define a channel
var channel = GrpcChannel.ForAddress("https://localhost:5001");
//initialize the client
var refundClient = new RefundService.RefundService.RefundServiceClient(channel);
Console.WriteLine("gRPC client is up !");
//loop for dummy data creation
for (int i = 5; i < 8; i++)
{
var orderid = i + "43243546";
Console.WriteLine("Request started for orderid: " + orderid);
var reply = await refundClient.RefundAsync(new RefundRequest
{
OrderId = orderid,
Amount = 54.98,
Customerid = new Random().Next(10, 100).ToString()
});
Console.WriteLine(reply.Message);
await Task.Delay(1000);//delay for debug mode observation
}
}
İlk olarak url bilgisi vererek bir channel tanımlayıp RefundServiceClient'ı initialize ederken bu channel bilgisini parametre olarak geçerek conn kurmuş bulunuyoruz. Sonrasında ise Refund metodunu call ederek iade isteğini service'e iletiyoruz.
Refund işlemi için hem Service hemde Client geliştirmemiz hazır. Artık tek yapmamız gereken iki uygulamayıda run edip doğru çalıştığını gözlemlemek.
Görüldüğü üzre refundClient ve refundService uygulamaları 43243546 numaralı order için iade işlemini tamamladı ve her iki uygulamanında console'larına ilgili bilgileri yazdırmış olduklarını görmüş olduk. Bir önceki yazımızda çizmiş olduğumuz architecture'a bakacak olursak, tam olarak karşılık geldiği nokta aşağıdaki kısım.
gRPC serisinin bu yazısınında sonuna gelmiş olduk. Özetleyecek olursak; Unary RPC yöntemiyle one-to-one call işlemi olan case'lerini için kolaylıkla geliştirmeler yapabilir, projeleriniz için tıpkı bir Api endpoint hizmeti verir gibi yapılar tasarlayabilmeniz mümkün. Bir sonraki yazımızda NotifyCustomerClient service method'u için bir client uygulaması geliştirip serimize devam edeceğiz.
Source