PHP Academy · Ders

Hizmet İletişimi: REST ve gRPC

Hizmetleri eşzamanlı ve verimli şekilde bağlayın.

2. ders / 413 adım

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:

  • 2xx baş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çin 422, hız sınırları için 429 kullanın (Retry-After değ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)); // false

gRPC: Ö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.proto

gRPC İ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ı reserved olarak 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.

Başlamak ücretsiz

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

  1. Monolitten Mikro Hizmetlere
  2. Hizmet İletişimi: REST ve gRPC
  3. API Ağ Geçitleri ve Hizmet Keşfi
  4. Dayanıklılık: Devre Kesiciler ve Yeniden Denemeler
← PHP Academy Sayfasına Dön