Backend ve Front-End takımları arasında servislerin isteği ve servislerin cevap olarak verdiği verilerin iki tarafında bilmesi ve güncel kalması en büyük problemlerden birisi. Bu makale de değineceğim gRPC çerçevesi sayesinde bu problemi çözmekle kalmayıp, birçok avantaj kazanıyor olacağız.
Makalede değineceğim başlıklar.
- RPC Nedir?
- gRPC Nedir?
- ProtoBuf Nedir?
- gRPC Avantajları Nelerdir?
Makalede sadece yukarıdaki başlıklara değineceğim, eğer bir örnek üzerinde görmek isterseniz aşağıdaki makaleden devam edebilirsiniz.
RPC (Remote Procedure Call) Nedir?
Uzak yordam çağrısı üzerinde programcı açıkça bu uzaktan etkileşim detayları kodlama olmadan çalıştırmak için bir alt yordam veya prosedürü sağlayan bilgisayar programına izin veren süreçler arası iletişim teknolojisidir. Sunucu üzerindeki servisleri kontrol ettiğimizde karşımıza çıkan RPC, arka plânda birçok şeyi gerçekleştiren bir servistir.
Daha basite indirgemek gerekirse; İstemci sunucuya istek yaptığında sunucudan gelen cevapta ki yapıyı önceden sunucudan öğrenmek ve istemci tarafında ki yapıya uyarlamakla yükümlü. Sunucu tarafında ki değişiklikten istemci haberdar olup kendi yapısını sunucu yapısına uyarlamakla yükümlüdür.
Örneğin Rest servisi ele almamız gerekirse, bir liste istiyoruz ve içerisindeki anahtarlara göre verileri işliyoruz. Sunucu tarafında bu servisi sağlayan yapıda bir değişiklik olduğunda, eğer istemci haberdar olmaz ise farklı anahtar-veri geldiğinde istemci çalışmayacaktır. RPC ile ortak yordamlar belirleyip, bu senkron problemlerini ekstra olarak Swagger veya Postman kütüphanesini güncellemeye gerek kalmadan çözebiliyoruz.
gRPC Nedir?
gRPC açık kaynak ve ücretsiz olarak Google’ın geliştirdiği bir frameworktür
gRPC’de, bir istemci uygulaması, yerel bir nesneymiş gibi farklı bir makinedeki bir sunucu uygulamasındaki bir yöntemi doğrudan çağırabilir, bunun sayesinde her bir client için sunucudan gelen cevaplara model oluşturmanıza gerek kalmıyor. Aynı şekilde sunucuda dönülecek cevapları daha güvenli belirleyebiliyoruz ve ortak modeller(proto dosyaları) ile devam ediyoruz.
Birçok RPC sisteminde olduğu gibi gRPC, bir hizmet tanımlama, parametreleri ve dönüş türleri ile uzaktan çağrılabilecek yöntemleri belirtme fikri üzerine kuruludur.
ProtoBuf Nedir?
Protobuf, gRPC framework’ü için kullanılan Interface Definition dilidir. Protobuf ile verileri nasıl depolayacağını, bağlantı tiplerini (unary, bidi vb.) belirtiyoruz. Bunun sayesinde client ve server senkron olup, bu . proto dosyalarına göre hangi requestleri, hangi methodlar çağırarak göndereceğini bilmiş oluyor. Aynı zamanda proto dosyaları ile gRPC frameworkü bir çok dile serializer Method’lar ve interface sınıfları üretiyor.
ProtoBuf Tanımlaması:
repeated: Belirtilen type list olarak tanımlanması için kullanıyoruz.
Yukarıdaki protobuf ile yapılan contract’a göre serializer ve deserializer üretilip, sunucu-istemci iletişimi byte’ler ile sağlanıyor. Bu şekilde daha performanslı bir iletişim ve aynı zamanda daha az bandwidth kullanımı sağlanıyor. Ayrıca çalışan kodumuzda ekleme yapıldığında, sunucu çalışmasında ve iletişiminde bir problem oluşmuyor.
ProtoBuf ile servis örneği ile detaylandıralım:
service: Kullanılabilecek bir servis oluşturur. Bu servis altından ilgili işlemleri yürütebilirsiniz.
rpc: Servise ait endpointleri oluşturmak için kullandığımız keyword.
message: Request ve Response’ler için kullanacağımız yapıları belirttiğimiz keyword.
ProtoBuf ile desteklenen veri tiplerini buradan görebilirsiniz.
gRPC tarafından desteklenen 4 farklı servis tipi vardır.
- Unary: Tekli RPC, REST API’lerine benzer şekilde çalışır. İstemci tek bir istek gönderir ve tek bir yanıt alır.
Bu serviste istemci istek gönderir, sunucu isteğe göre belirlenen protokellere göre cevap döner.
- Client Streaming: İstemci, sunucuya tek bir mesaj yerine akış mesajı gönderir.
- Server-Steaming: İstemci, sunucuya tek bir mesaj gönderir ve akış yanıtı alır.
- Bi-Directional Streaming: İstemci ile sunucu arasında çift taraflı akış başlatılmasıdır. Örneğin canlı sohbet yapısı.
gRPC Avantajları Neledir?
Hız: gRPC, gRPC sunucuları ve istemcileri ile iletişim kurmak için binary (01) protokolleri kullanır. Rest API’de ki gibi JSON(String) veriler göndererek ağda ki bandwidth yükünü artırmaz.
Servisler Sürekli Güncel: gRPC, protokol yaklaşımına sahip olduğu için backend ve front-end geliştiricileri arasında sağlanacak protokolleri kesin olmasını garanti eder.
Dilden Bağımsız: Sunucu go dili ile yazıldığı halde sıfırdan modeller ve Endpoint’ler farklı bir dilde kurgulamaya gerek kalmadan proto modelleri ile örneğin JavaScript diline servis kod üretimi yapılabilir.
Zaman Tasarrufu Sağlar: Sunucu go dili, istemci Javascript ile yazılmasına rağmen iki taraf içinde ayı ayrı modeller oluşturma yükünü kaldırır.
Stream Desteği: gRPC, http/2 kullandığı için tek satırla stream servisleri oluşturulabiliyor.
gRPC ile ilgili genel kavramları anlatmaya çalıştım. Eğer anlamadığınız veya benim yanlış bir kelamda bulunduğum bir konu var ise lütfen yorum bırakın veya aşağıdaki bağlantılar üzerinden bana ulaşmayı ihmal etmeyin. Okuduğunuz için teşekkürler 🙏 👋
Kaynakça: