Komunikasi Layanan: REST dan gRPC
Hubungkan layanan secara sinkron dan efisien.
Komunikasi Layanan: REST dan gRPC adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.
REST dan gRPC
Layanan perlu berkomunikasi secara sinkron: sebuah permintaan dikirim, lalu jawaban dikembalikan. Dua pilihan utama adalah REST melalui HTTP/JSON dan gRPC melalui HTTP/2 + Protobuf. Keduanya dioptimalkan untuk hal yang berbeda — REST untuk jangkauan dan kemudahan bagi manusia, sedangkan gRPC untuk kecepatan dan kontrak yang ketat.
Pelajaran ini menunjukkan keduanya dari perspektif PHP dan menjelaskan kapan masing-masing sebaiknya dipilih.
REST: Bahasa Umum
REST memodelkan sumber daya di balik URL dan menggunakan verba HTTP serta kode status untuk menyatakan makna. Kelebihannya: alat yang tersedia luas, kemampuan penyimpanan dalam cache, kemudahan penelusuran masalah dengan curl, dan tidak memerlukan klien khusus. Kekurangannya: JSON yang bertele-tele, tidak ada skema yang dipaksakan, serta hanya mendukung permintaan dan tanggapan.
Untuk API publik dan titik akhir yang diakses peramban, REST hampir selalu merupakan pilihan yang tepat.
Memanggil Layanan REST
Gunakan klien HTTP PSR-18 (Guzzle di sini). Selalu tetapkan batas waktu koneksi dan permintaan — panggilan tanpa batas waktu ke layanan lain yang lambat dapat menghabiskan pekerja PHP-FPM Anda dan menyebabkan gangguan berantai.
<?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";
}Kode Status Adalah Kontraknya
Dalam REST antarlayanan, kode status HTTP merupakan protokol kesalahan Anda. Perlakukan kode tersebut secara sengaja:
2xxberarti berhasil;4xxberarti kesalahan pemanggil (jangan mencoba ulang secara membabi buta);5xx/batas waktu dapat dicoba ulang.- Gunakan
409untuk konflik,422untuk validasi, dan429untuk batas laju (patuhiRetry-After).
Mencoba ulang 400 hanya membuang panggilan; mencoba ulang 503 dengan penundaan bertahap merupakan tindakan yang tepat.
<?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: Berbasis Kontrak & Cepat
gRPC menggunakan Protocol Buffers: Anda mendefinisikan layanan dan pesan dalam berkas .proto, lalu menghasilkan stub klien/server yang bertipe kuat. Melalui HTTP/2 dengan Protobuf biner, ukurannya jauh lebih ringkas dan latensinya lebih rendah daripada JSON, serta mendukung aliran data.
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;
}Menghasilkan Stub PHP
Pasang ekstensi gRPC PHP dan plugin protoc, lalu hasilkan kelas klien dari .proto. PHP dapat bertindak sebagai klien gRPC dengan kemampuan penuh melalui ext-grpc; menjalankan server gRPC PHP asli biasanya memerlukan Roadrunner atau Swoole.
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.protoPanggilan Klien gRPC
Stub yang dihasilkan menyediakan permintaan dan tanggapan bertipe. Panggilan gRPC mengembalikan pesan dan objek status — selalu periksa kode status sebelum mempercayai tanggapannya.
<?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");
}Evolusi Skema
Protobuf dirancang untuk kompatibilitas maju/mundur — jika Anda mematuhi aturannya:
- Jangan pernah menggunakan ulang atau mengubah nomor kolom. Tambahkan kolom baru dengan nomor baru.
- Tandai kolom yang dihapus sebagai
reservedagar nomornya tidak dapat digunakan kembali. - Klien lama mengabaikan kolom yang tidak dikenal; kolom yang tidak ada menggunakan nilai bawaan tipenya.
JSON/REST tidak memberikan semua ini secara otomatis — Anda menegakkan kompatibilitas berdasarkan konvensi (dan idealnya menggunakan skema OpenAPI bersama dengan pengujian kontrak).
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
}Aliran Data
gRPC mendukung empat jenis panggilan; REST secara bawaan hanya mendukung jenis pertama:
- Satu kali — satu permintaan, satu tanggapan.
- Aliran data dari server — satu permintaan, serangkaian tanggapan (misalnya pembaruan langsung).
- Aliran data dari klien — serangkaian permintaan, satu tanggapan (misalnya pengunggahan massal).
- Dua arah — keduanya mengalir secara bersamaan.
Jika kasus penggunaan Anda melibatkan dorongan data atau aliran data yang berlangsung lama, aliran data gRPC lebih baik daripada menanyai titik akhir REST secara berkala.
Meneruskan Konteks & Tenggat Waktu
Panggilan sinkron membentuk rantai, jadi dua hal harus ikut dikirim bersama setiap permintaan: ID korelasi/pelacakan untuk pelacakan menyeluruh, dan tenggat waktu agar layanan ujung yang lambat tidak membuat seluruh rantai terhenti. gRPC memiliki tenggat waktu bawaan; dalam REST, Anda menirunya dengan anggaran batas waktu yang semakin kecil dan diteruskan ke layanan hilir.
<?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));Memilih di Antara Keduanya
Panduan keputusan praktis:
- REST untuk API publik/mitra, klien peramban, CRUD sederhana, penelusuran masalah yang mudah, dan dukungan cache yang luas.
- gRPC untuk panggilan antarlayanan internal bervolume tinggi dan berlatensi rendah, kontrak bertipe ketat, serta aliran data.
Banyak sistem menjalankan keduanya: gRPC di balik gerbang untuk komunikasi antarlayanan, dan REST di sisi luar untuk dunia luar. Jangan memaksa satu alat menjalankan tugas alat lainnya.
Pemeriksaan Singkat
Menyesuaikan protokol dengan kasus penggunaan.
Ringkasan
Komunikasi layanan secara sinkron:
- REST/JSON — tersedia secara universal, mudah ditelusuri masalahnya, dan dapat disimpan dalam cache; kode status adalah kontraknya; selalu tetapkan batas waktu.
- gRPC/Protobuf — berbasis kontrak, ringkas, cepat, dan mendukung aliran data; hasilkan stub PHP bertipe.
- Tentukan kemampuan untuk dicoba ulang dari kode status/gRPC; jangan pernah mencoba ulang kesalahan klien.
- Kembangkan skema dengan menambahkan elemen — jangan pernah menggunakan ulang nomor kolom Protobuf.
- REST di sisi luar dan gRPC di antara layanan internal merupakan pemisahan yang umum dan tepat.
Berikutnya: merutekan dan menemukan semua layanan ini dengan gerbang dan penemuan layanan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Komunikasi Layanan: REST dan gRPC” gratis?
Ya — teks lengkap “Komunikasi Layanan: REST dan gRPC” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Komunikasi Layanan: REST dan gRPC”?
Hubungkan layanan secara sinkron dan efisien. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai PHP Academy?
Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Komunikasi Layanan: REST dan gRPC” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dari Monolit ke Layanan Mikro
- Komunikasi Layanan: REST dan gRPC
- Gerbang API dan Penemuan Layanan
- Ketahanan: Pemutus Sirkuit dan Percobaan Ulang