gRPC hizmetlerini HTTP API’leriyle karşılaştırma
James Newton-King
Bu makalede gRPC hizmetlerinin JSON ile HTTP API'leriyle karşılaştırması (web API'ASP.NET Core dahil) açıklanmıştır. Uygulamanıza API sağlamak için kullanılan teknoloji önemli bir seçimdir ve gRPC, HTTP API'lere kıyasla benzersiz avantajlar sunar. Bu makalede gRPC'nin güçlü ve zayıf yanları açıklanmıştır ve gRPC'yi diğer teknolojilere göre kullanma senaryoları önermektedir.
Üst düzey karşılaştırma
Aşağıdaki tabloda, gRPC ile HTTP API'leri arasındaki özelliklerin JSON ile üst düzey bir karşılaştırması yer alır.
| Özellik | gRPC | JSON ile HTTP API'leri |
|---|---|---|
| Anlaşma | Gerekli (.proto) | İsteğe bağlı (OpenAPI) |
| Protokol | HTTP/2 | HTTP |
| Yükü | Protobuf (küçük, ikili) | JSON (büyük, insanlar tarafından okunabilir) |
| Önsertiflik | Katı belirtim | Gevşek. Tüm HTTP'ler geçerlidir. |
| Akış | İstemci, sunucu, çift yönlü | İstemci, sunucu |
| Tarayıcı desteği | Hayır (grpc-web gerektirir) | Yes |
| Güvenlik | Aktarım (TLS) | Aktarım (TLS) |
| İstemci kodu oluşturma | Evet | OpenAPI + üçüncü taraf aracı |
gRPC güçlü yönleri
Performans
gRPC iletileri, verimli bir ikili ileti biçimi olan Protobufkullanılarak seri hale getirilecek. Protobuf, sunucu ve istemcide çok hızlı bir şekilde seri hale getiri. Protobuf serileştirme, mobil uygulamalar gibi sınırlı bant genişliği senaryolarında önemli olan küçük ileti yüklerini sağlar.
gRPC, HTTP 1.x'e göre önemli performans avantajları sağlayan önemli bir HTTP düzeltmesi olan HTTP/2 için tasarlanmıştır:
- İkili çerçeve ve sıkıştırma. HTTP/2 protokolü hem gönderme hem de alma açısından küçük ve verimlidir.
- Tek bir TCP bağlantısı üzerinden birden çok HTTP/2 çağrısının birden çok kez katlama. Çoklu katlama, satır baş engellemesini ortadan kaldırıyor.
HTTP/2, gRPC'ye özel değildir. JSON içeren HTTP API'leri de dahil olmak üzere birçok istek türü HTTP/2 kullanabilir ve performans geliştirmelerinden yararlanabilir.
Kod oluşturma
Tüm gRPC çerçeveleri, kod oluşturma için birinci sınıf destek sağlar. gRPC geliştirme için çekirdek .proto dosya, gRPC hizmetlerinin ve iletilerinin sözleşmesini tanımlayan dosyasıdır. Bu dosyadan, gRPC çerçeveleri bir hizmet temel sınıfı, iletiler ve tam bir istemci üretir.
.proto dosyası sunucu ve istemci arasında paylaştırarak, iletiler ve istemci kodu uzarak oluşturulabilir. İstemcinin kod oluşturması, istemci ve sunucuda iletilerin çoğaltılmasına izin verir ve sizin için kesin olarak türü kesin olarak belirtilen bir istemci oluşturur. İstemci yazmak zorunda kalmadan, birçok hizmetli uygulamalarda geliştirme süresi önemli ölçüde tasarruf sağlar.
Katı belirtim
JSON ile HTTP API'si için resmi bir belirtim yoktur. Geliştiriciler URL'lerin, HTTP fiillerinin ve yanıt kodlarının en iyi biçimini tartıştı.
gRPC belirtimi, bir gRPC hizmetinin izlemesi gereken biçime bağlıdır. gRPC, platformlar ve uygulamalar arasında tutarlı olduğundan, gRPC tartışmaları ortadan kaldırıyor ve geliştirici süresi tasarrufu sağlar.
Akış
HTTP/2, uzun süreli, gerçek zamanlı iletişim akışları için bir temel sağlar. gRPC, HTTP/2 üzerinden akış için birinci sınıf destek sağlar.
gRPC hizmeti tüm akış birleşimlerini destekler:
- Birli (akış yok)
- Sunucudan istemciye akış
- İstemciden sunucuya akış
- Çift yönlü akış
Son tarih/zaman aşımı ve iptal
gRPC, istemcilerin bir RPC'nin tamamlanması için ne kadar süre beklemeye istekli olduklarını belirtmelerine olanak sağlar. Son tarih sunucuya gönderilir ve sunucu, son tarihi aşarsa hangi eylemin atılır olduğuna karar verir. Örneğin, sunucu zaman aşımında devam eden gRPC/HTTP/veritabanı isteklerini iptal edebilir.
Alt gRPC çağrıları aracılığıyla son tarih ve iptali yayma, kaynak kullanım sınırlarının uygulanmasına yardımcı olur.
gRPC önerilen senaryolar
gRPC aşağıdaki senaryolar için çok uygun:
- Mikro hizmetler: gRPC, düşük gecikme süresi ve yüksek aktarım hızı iletişimi için tasarlanmıştır. gRPC, verimliliğin kritik olduğu basit mikro hizmetler için mükemmeldir.
- Noktadan noktaya gerçek zamanlı iletişim: gRPC, çift yönlü akış için mükemmel destek sağlar. gRPC hizmetleri, yoklama olmadan gerçek zamanlı iletiler gönderebilirsiniz.
- Çok teknolojili ortamlar: gRPC aracı tüm popüler geliştirme dillerini destekler ve bu da gRPC'yi çok dilli ortamlar için iyi bir seçenektir.
- Ağ kısıtlanmış ortamlar: gRPC iletileri basit bir ileti biçimi olan Protobuf ile seri hale getirilecek. gRPC iletisi her zaman eşdeğer bir JSON iletiden küçüktür.
- İşlemler arası iletişim (IPC): Unix etki alanı yuvaları ve adlandırılmış kanallar gibi IPC taşımaları, aynı makinede uygulamalar arasında iletişim kurmak için gRPC ile kullanılabilir. Daha fazla bilgi için bkz. gRPC ile işlemler arası iletişim.
gRPC zayıflıkları
Sınırlı tarayıcı desteği
Bugün bir tarayıcıdan doğrudan bir gRPC hizmetine çağrı yapmak mümkün değildir. gRPC, HTTP/2 özelliklerini yoğun bir şekilde kullanır ve hiçbir tarayıcı gRPC istemcisini desteklemek için web istekleri üzerinde gereken denetim düzeyini sağlar. Örneğin tarayıcılar, çağıranın HTTP/2'nin gerekli olmasına veya temel HTTP/2 çerçevelerine erişim izni vermesine izin vermez.
gRPC'yi tarayıcı uygulamalarına getirmek için iki yaygın yaklaşım vardır:
gRPC-Web, tarayıcıda gRPC desteği sağlayan gRPC ekibinin ek bir teknolojisidir. gRPC-Web, tarayıcı uygulamalarının gRPC'nin yüksek performanslı ve düşük ağ kullanımından yararlanmasını sağlar. gRPC'nin tüm özellikleri gRPC-Web tarafından desteklanmaz. İstemci ve çift yönlü akış desteklenmiyor ve sunucu akışı için sınırlı destek vardır.
.NET Core, gRPC-Web desteğine sahip. Daha fazla bilgi için bkz. Tarayıcı uygulamalarında gRPC kullanma.
RESTful JSON Web API'leri, HTTP meta verileriyle .proto dosyasına ek açıklama ek olarak gRPC hizmetlerinden otomatik olarak oluşturulabilir. Bu, bir uygulamanın her ikisi için ayrı hizmetler inşa etmek için çabayı yinelemeden hem gRPC hem de JSON web API'lerini desteklemesini sağlar.
.NET Core, gRPC hizmetlerinden JSON web API'leri oluşturmak için deneysel destek sunar. Daha fazla bilgi için bkz. gRPC'den JSON Web API'leri oluşturma.
İnsan tarafından okunamaz
HTTP API istekleri metin olarak gönderilir ve insanlar tarafından okunabilir ve oluşturulabilir.
gRPC iletileri varsayılan olarak Protobuf ile kodlanmış. Protobuf gönderme ve alma açısından verimlidir ancak ikili biçimi insanlar tarafından okunamaz. Protobuf, .proto dosyasında belirtilen iletinin arabirim açıklamasının düzgün bir şekilde deserialize için gerekli olması gerekir. Kablo üzerinde Protobuf yüklerini analiz etmek ve istekleri el ile oluşturmak için ek araç gerekir.
İkili Protobuf iletilerine yardımcı olmak için sunucu yansıma ve gRPC komut satırı aracı gibi özellikler vardır. Ayrıca, Protobuf iletileri JSON'a ve JSON'dan dönüştürmeyi destekler. Yerleşik JSON dönüştürmesi, hata ayıklama sırasında Protobuf iletilerini insanlar tarafından okunabilir biçime ve forma dönüştürmenin verimli bir yolunu sağlar.
Alternatif çerçeve senaryoları
Aşağıdaki senaryolarda diğer çerçeveler gRPC üzerinden önerilir:
- Tarayıcı tarafından erişilebilen API'ler: gRPC, tarayıcıda tam olarak desteklenmiyor. gRPC-Web, tarayıcı desteği sunsa da sınırlamaları vardır ve bir sunucu ara sunucusu sağlar.
- Gerçek zamanlı iletişim yayınlama: gRPC, akış aracılığıyla gerçek zamanlı iletişimi destekler, ancak kayıtlı bağlantılara ileti yayınlama kavramı mevcut değildir. Örneğin, sohbet odasındaki tüm istemcilere yeni sohbet iletilerinin gönderildiği bir sohbet odası senaryosunda, istemciye tek tek yeni sohbet iletileri akışı yapmak için her gRPC çağrısı gereklidir. SignalR , bu senaryo için kullanışlı bir çerçevedir. SignalR kalıcı bağlantılar kavramına ve ileti yayınlamaya yerleşik destek içerir.