Komunikasi Perkhidmatan: REST dan gRPC
Sambungkan perkhidmatan secara segerak dan cekap.
Komunikasi Perkhidmatan: REST dan gRPC ialah pelajaran PHP Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran PHP Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
REST dan gRPC
Perkhidmatan perlu berkomunikasi secara segerak: permintaan dihantar dan jawapan diterima. Dua pilihan utama ialah REST melalui HTTP/JSON dan gRPC melalui HTTP/2 + Protobuf. Kedua-duanya mengoptimumkan perkara yang berbeza — REST untuk capaian luas dan mesra manusia, manakala gRPC untuk kelajuan dan kontrak yang ketat.
Pelajaran ini menunjukkan kedua-duanya dari perspektif PHP serta masa yang sesuai untuk memilih setiap satu.
REST: Bahasa Perantara Universal
REST memodelkan sumber melalui URL dan menggunakan kata kerja HTTP serta kod status untuk menyampaikan semantik. Kelebihannya: alat yang universal, kebolehan disimpan sementara, penyahpepijatan menggunakan curl dan tidak memerlukan klien khas. Kelemahannya: JSON yang berlebihan, skema yang tidak dikuatkuasakan dan hanya menyokong permintaan/tindak balas.
Untuk API awam dan titik akhir yang berhadapan dengan pelayar, REST hampir sentiasa merupakan pilihan yang tepat.
Memanggil Perkhidmatan REST
Gunakan klien HTTP PSR-18 (Guzzle di sini). Sentiasa tetapkan had masa sambungan dan permintaan — panggilan tanpa had kepada rakan yang perlahan boleh 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";
}Kod Status ialah Kontrak
Dalam REST antara perkhidmatan, kod status HTTP ialah protokol ralat anda. Kendalikan kod tersebut dengan sengaja:
2xxbermaksud berjaya;4xxialah kesilapan pemanggil (jangan cuba semula secara membuta tuli);5xx/had masa boleh dicuba semula.- Gunakan
409untuk konflik,422untuk pengesahan dan429untuk had kadar (patuhiRetry-After).
Mencuba semula 400 hanya membazirkan panggilan; mencuba semula 503 dengan jeda beransur ialah tindakan yang betul.
<?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: Utamakan Kontrak & Pantas
gRPC menggunakan Protobuf: anda mentakrifkan perkhidmatan dan mesej dalam fail .proto, kemudian menjana stub klien/pelayan yang ditaip kuat. Melalui HTTP/2 dengan Protobuf binari, ia jauh lebih padat dan mempunyai kependaman lebih rendah berbanding JSON, serta menyokong penstriman.
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;
}Menjana Stub PHP
Pasang sambungan gRPC PHP dan pemalam protoc, kemudian jana kelas klien daripada .proto. PHP boleh bertindak sebagai klien gRPC berciri lengkap melalui ext-grpc; menjalankan pelayan 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 dijana memberikan anda permintaan dan tindak balas yang ditaip. Panggilan gRPC mengembalikan mesej dan objek status — sentiasa semak kod status sebelum mempercayai tindak balas tersebut.
<?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 direka untuk keserasian ke hadapan/ke belakang — jika anda mematuhi peraturannya:
- Jangan sesekali menggunakan semula atau mengubah nombor medan. Tambahkan medan baharu dengan nombor baharu.
- Tandakan medan yang dibuang sebagai
reservedsupaya nombornya tidak boleh digunakan semula. - Klien lama mengabaikan medan yang tidak dikenali; medan yang tiada menggunakan nilai lalai jenisnya.
JSON/REST tidak memberikan semua ini secara percuma — anda perlu menguatkuasakan keserasian mengikut konvensyen (dan sebaik-baiknya menggunakan skema OpenAPI yang dikongsi bersama ujian 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
}Penstriman
gRPC menyokong empat jenis panggilan; REST secara asli hanya menyokong jenis pertama:
- Satu-ke-satu — satu permintaan, satu tindak balas.
- Penstriman pelayan — satu permintaan, aliran tindak balas (contohnya kemas kini langsung).
- Penstriman klien — aliran permintaan, satu tindak balas (contohnya muat naik pukal).
- Dua hala — kedua-duanya menstrim serentak.
Jika kes penggunaan anda melibatkan tolakan atau aliran data jangka panjang, penstriman gRPC lebih baik daripada mengundi titik akhir REST.
Menyebarkan Konteks & Had Akhir
Panggilan segerak membentuk rantaian, jadi dua perkara mesti bergerak bersama setiap permintaan: ID korelasi/penjejakan untuk penjejakan hujung ke hujung, dan had akhir supaya nod hujung yang perlahan tidak menyebabkan seluruh rantaian tergantung. gRPC menyokong had akhir secara terbina dalam; dalam REST, anda menirunya dengan belanjawan had masa yang semakin mengecil dan dihantar kepada perkhidmatan hiliran.
<?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 Antara Kedua-duanya
Panduan keputusan yang praktikal:
- REST untuk API awam/rakan kongsi, klien pelayar, CRUD mudah, penyahpepijatan mudah dan sokongan cache yang meluas.
- gRPC untuk panggilan dalaman antara perkhidmatan yang berjumlah tinggi dan berkependaman rendah, kontrak ditaip yang ketat serta penstriman.
Banyak sistem menjalankan kedua-duanya: gRPC di belakang get laluan antara perkhidmatan, dan REST di pinggir untuk dunia luar. Jangan paksa satu alat melakukan tugas alat yang lain.
Semakan Pantas
Memadankan protokol dengan kes penggunaan.
Rumusan
Komunikasi perkhidmatan segerak:
- REST/JSON — universal, mudah dinyahpepijat dan boleh disimpan sementara; kod status ialah kontrak; sentiasa tetapkan had masa.
- gRPC/Protobuf — mengutamakan kontrak, padat, pantas dan menyokong penstriman; jana stub PHP yang ditaip.
- Tentukan kebolehan untuk dicuba semula berdasarkan kod status/gRPC; jangan sesekali mencuba semula ralat klien.
- Kembangkan skema secara tambahan — jangan sesekali menggunakan semula nombor medan Protobuf.
- REST di pinggir dan gRPC antara perkhidmatan dalaman ialah pemisahan yang lazim serta kukuh.
Seterusnya: penghalaan dan pencarian lokasi semua perkhidmatan ini dengan get laluan dan penemuan.
Pelajari PHP dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 49
- Pelajaran
- 195
Soalan Lazim
Adakah pelajaran “Komunikasi Perkhidmatan: REST dan gRPC” percuma?
Ya — teks penuh “Komunikasi Perkhidmatan: REST dan gRPC” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus PHP Academy, tingkat taraf kepada CoddyKit PRO. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Komunikasi Perkhidmatan: REST dan gRPC”?
Sambungkan perkhidmatan secara segerak dan cekap. Anda berlatih PHP Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan PHP Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran PHP Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Komunikasi Perkhidmatan: REST dan gRPC” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Daripada Monolit kepada Perkhidmatan Mikro
- Komunikasi Perkhidmatan: REST dan gRPC
- Gerbang API dan Penemuan Perkhidmatan
- Ketahanan: Pemutus Litar dan Percubaan Semula