Hizmet İletişimi: REST ve gRPC
Hizmetleri eşzamanlı ve verimli şekilde bağlayın.
Hizmet İletişimi: REST ve gRPC, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
REST ve gRPC
Hizmetlerin eşzamanlı olarak iletişim kurması gerekir: bir istek gönderilir, bir yanıt geri gelir. En yaygın iki seçenek HTTP/JSON üzerinden REST ve HTTP/2 + Protokol Arabellekleri üzerinden gRPC kullanmaktır. Bunlar farklı amaçlar için iyileştirilmiştir — REST erişilebilirlik ve insan dostu kullanım, gRPC ise hız ve katı sözleşmeler içindir.
Bu derste her ikisi de PHP açısından ele alınır ve hangisinin ne zaman seçileceği açıklanır.
REST: Ortak İletişim Dili
REST, kaynakları URL'lerin arkasında modeller ve anlamı belirtmek için HTTP fiillerini ve durum kodlarını kullanır. Güçlü yönleri: evrensel araç desteği, önbelleğe alınabilirlik, curl ile hata ayıklama ve özel istemci gerektirmemesi. Zayıf yönleri: ayrıntılı JSON, zorunlu bir şemanın olmaması ve yalnızca istek/yanıt iletişimini desteklemesidir.
Herkese açık API'ler ve tarayıcıya yönelik uç noktalar için REST neredeyse her zaman doğru tercihtir.
REST Hizmetini Çağırma
Bir PSR-18 HTTP istemcisi (burada Guzzle) kullanın. Her zaman bir bağlantı ve istek zaman aşımı belirleyin — yavaş bir eş hizmete yapılan sınırsız bir çağrı PHP-FPM çalışanlarınızı tüketebilir ve kesintinin yayılmasına neden olabilir.
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$http = new Client([
'base_uri' => 'http://customers-svc/',
'connect_timeout' => 1.0, // never block forever on connect
'timeout' => 3.0, // total request budget
'http_errors' => false,
]);
$res = $http->get('customers/42', ['headers' => ['Accept' => 'application/json']]);
if ($res->getStatusCode() === 200) {
$customer = json_decode((string) $res->getBody(), true);
echo $customer['email'] . "\n";
}Durum Kodları Sözleşmedir
Hizmetler arası REST iletişiminde HTTP durum kodları sizin hata protokolünüzdür. Onları bilinçli şekilde ele alın:
2xxbaşarıdır;4xxçağrıyı yapan tarafın hatasıdır (körü körüne yeniden denemeyin);5xx/zaman aşımları yeniden denenebilir.- Çakışmalar için
409, doğrulama için422, hız sınırları için429kullanın (Retry-Afterdeğerine uyun).
400 yanıtını yeniden denemek yalnızca çağrıları boşa harcar; 503 yanıtını bekleme aralığını artırarak yeniden denemek doğrudur.
<?php
function isRetryable(int $status): bool {
return $status === 0 // timeout/connection error
|| $status === 429
|| ($status >= 500 && $status !== 501);
}
var_dump(isRetryable(503)); // true
var_dump(isRetryable(400)); // falsegRPC: Önce Sözleşme, Hızlı
gRPC, Protokol Arabelleklerini kullanır: hizmetleri ve iletileri bir .proto dosyasında tanımlarsınız, ardından güçlü tür denetimine sahip istemci/sunucu iskeletleri oluşturursunuz. HTTP/2 üzerinde ikili Protokol Arabellekleri kullanıldığında JSON'dan çok daha küçük ve düşük gecikmelidir; ayrıca akışı destekler.
syntax = "proto3";
package customers;
service Customers {
rpc GetCustomer (GetCustomerRequest) returns (Customer);
}
message GetCustomerRequest { string id = 1; }
message Customer {
string id = 1;
string email = 2;
int32 loyalty_points = 3;
}PHP İskeletlerini Oluşturma
gRPC PHP uzantısını ve protoc eklentisini kurun, ardından .proto dosyasından istemci sınıflarını oluşturun. PHP, ext-grpc aracılığıyla tam özellikli bir gRPC istemcisi olarak çalışabilir; yerel bir PHP gRPC sunucusu çalıştırmak için genellikle Roadrunner veya Swoole gerekir.
pecl install grpc
composer require grpc/grpc google/protobuf
protoc --proto_path=. \
--php_out=./generated \
--grpc_out=./generated \
--plugin=protoc-gen-grpc=$(which grpc_php_plugin) \
customers.protogRPC İstemci Çağrısı
Oluşturulan iskeletler size tür denetimli istekler ve yanıtlar sunar. Bir gRPC çağrısı iletiyi ve bir status nesnesini döndürür — yanıta güvenmeden önce her zaman durum kodunu denetleyin.
<?php
require 'vendor/autoload.php';
use Customers\CustomersClient;
use Customers\GetCustomerRequest;
use Grpc\ChannelCredentials;
$client = new CustomersClient('customers-svc:50051', [
'credentials' => ChannelCredentials::createInsecure(),
]);
$req = (new GetCustomerRequest())->setId('42');
[$reply, $status] = $client->GetCustomer($req)->wait();
if ($status->code === \Grpc\STATUS_OK) {
echo $reply->getEmail(), "\n";
} else {
fwrite(STDERR, "gRPC error: {$status->details}\n");
}Şema Evrimi
Kurallarına uyarsanız Protokol Arabellekleri ileriye ve geriye dönük uyumluluk için tasarlanmıştır:
- Bir alan numarasını asla yeniden kullanmayın veya değiştirmeyin. Yeni alanları yeni numaralarla ekleyin.
- Kaldırılan alanları
reservedolarak işaretleyin; böylece numara yeniden kullanılamaz. - Eski istemciler bilinmeyen alanları yok sayar; eksik alanlar türlerinin varsayılan değerlerini alır.
JSON/REST bunların hiçbirini kendiliğinden sağlamaz — uyumluluğu kurallarla (ve ideal olarak sözleşme testleri içeren ortak bir OpenAPI şemasıyla) uygulamanız gerekir.
message Customer {
string id = 1;
string email = 2;
reserved 3; // old 'loyalty_points', never reuse 3
reserved "loyalty_points";
string display_name = 4; // new field, safe additive change
}Akış
gRPC dört çağrı türünü destekler; REST yerel olarak yalnızca ilkini destekler:
- Tekli — bir istek, bir yanıt.
- Sunucu akışı — bir istek, bir yanıt akışı (ör. canlı güncellemeler).
- İstemci akışı — bir istek akışı, bir yanıt (ör. toplu yükleme).
- Çift yönlü — her iki taraf da eşzamanlı olarak akış gönderir.
Kullanım durumunuz anlık gönderim veya uzun süreli veri akışı gerektiriyorsa gRPC akışı, bir REST uç noktasını yoklamaktan daha iyi sonuç verir.
Bağlamı ve Zaman Sınırlarını Yayma
Eşzamanlı çağrılar zincirler oluşturur; bu nedenle her istekle birlikte iki şey taşınmalıdır: uçtan uca izleme için bir ilişkilendirme/izleme kimliği ve yavaş bir uç hizmetin tüm zinciri asılı bırakmasını önlemek için bir zaman sınırı. gRPC zaman sınırlarını doğrudan destekler; REST'te bunları aşağı akışa aktarılan ve giderek daralan bir zaman aşımı bütçesiyle taklit edersiniz.
<?php
// REST: shrink the remaining budget as the call chain deepens
function forwardHeaders(array $incoming, float $remainingMs): array {
return [
'X-Correlation-Id' => $incoming['X-Correlation-Id'] ?? bin2hex(random_bytes(8)),
// downstream must finish within what's left of our budget
'X-Timeout-Ms' => (string) max(0, (int) $remainingMs),
];
}
print_r(forwardHeaders(['X-Correlation-Id' => 'trace-9'], 1500));İkisi Arasında Seçim
Uygulamaya dönük bir karar kılavuzu:
- REST; herkese açık/iş ortağı API'leri, tarayıcı istemcileri, basit CRUD işlemleri, kolay hata ayıklama ve geniş önbellek desteği için uygundur.
- gRPC; kurum içi, yüksek hacimli ve düşük gecikmeli hizmetler arası çağrılar, katı tür denetimli sözleşmeler ve akış için uygundur.
Birçok sistem her ikisini de çalıştırır: hizmetler arasında ağ geçidinin arkasında gRPC, dış dünya için sınırda REST. Bir aracı diğerinin işini yapmaya zorlamayın.
Hızlı Kontrol
Protokolü kullanım durumuyla eşleştirme.
Özet
Eşzamanlı hizmet iletişimi:
- REST/JSON — evrensel, hata ayıklanabilir ve önbelleğe alınabilir; durum kodları sözleşmedir; her zaman zaman aşımı belirleyin.
- gRPC/Protokol Arabellekleri — önce sözleşme yaklaşımı, küçük boyut, hız ve akış; tür denetimli PHP iskeletleri oluşturun.
- Yeniden denenebilirliği durum/gRPC kodlarından belirleyin; istemci hatalarını asla yeniden denemeyin.
- Şemaları eklemeli biçimde geliştirin — Protokol Arabellekleri alan numaralarını asla yeniden kullanmayın.
- Sınırda REST, kurum içi hizmetler arasında gRPC kullanmak yaygın ve sağlam bir ayrımdır.
Sırada: Tüm bu hizmetleri ağ geçitleri ve keşif mekanizmalarıyla yönlendirme ve bulma.
Yapay zeka eğitmeniyle PHP öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 49
- Dersler
- 195
Sıkça Sorulan Sorular
“Hizmet İletişimi: REST ve gRPC” dersi ücretsiz mi?
Evet — “Hizmet İletişimi: REST ve gRPC” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“Hizmet İletişimi: REST ve gRPC” dersinde ne öğreneceğim?
Hizmetleri eşzamanlı ve verimli şekilde bağlayın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Hizmet İletişimi: REST ve gRPC” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Monolitten Mikro Hizmetlere
- Hizmet İletişimi: REST ve gRPC
- API Ağ Geçitleri ve Hizmet Keşfi
- Dayanıklılık: Devre Kesiciler ve Yeniden Denemeler