Middle
Kas yra gRPC?
sobes.tech AI
Atsakymas iš AI
gRPC – tai aukšto našumo, atviro kodo RPC (Remote Procedure Call) karkasas, kurį sukūrė Google, skirtas paskirstytoms programoms ir mikrosistemoms kurti. Jis pagrįstas HTTP/2 protokolu ir naudoja Protocol Buffers (Protobuf) kaip sąsajos aprašymo kalbą ir serializacijos mechanizmą:
gRPC pagrindinės savybės:
- HTTP/2: Naudoja HTTP/2 pranašumus, tokius kaip užklausų multiplikavimas, antraščių suspaudimas ir dvipusis srautinio perdavimo, užtikrinantį aukštesnį našumą nei įprasti klientas-serveris protokolai su HTTP/1.1:
- Protocol Buffers (Protobuf): Duomenų aprašymo kalba, leidžianti struktūrizuoti duomenis ir generuoti kodą serializacijai ir deserializacijai įvairiomis kalbomis. Protobuf yra efektyvus dydžio ir greičio požiūriu:
- Srautinio perdavimo (Streaming): Palaiko keturis srautinio perdavimo tipus:
- Unary: Klasikinis RPC (vienas užklausimas - vienas atsakymas):
- Server-side Streaming: Klientas siunčia užklausą, serveris atsako srautu:
- Client-side Streaming: Klientas siunčia srauto žinutes, serveris atsako viena žinute:
- Bidirectional Streaming: Klientas ir serveris keičiasi žinučių srautais vienu metu:
- Daugiakalbystė: Protobuf leidžia gauti klientų ir serverių kodą keliomis programavimo kalbomis:
- Kodo generavimas: Automatiškai generuoja kodą iš
.protofailo, sumažindamas rankinio kodo rašymo kiekį: - Metaduomenys: Palaiko metaduomenų perdavimą (raktas-reikšmė poros) kartu su užklausomis ir atsakymais:
- Interceptors: Leidžia įsikišti į užklausas ir atsakymus, įgyvendinant papildinę logiką (pvz., žurnalavimą, autentifikaciją):
Kaip veikia gRPC:
- Apibrėžiamas API naudojant Protocol Buffers kalbą
.protofaile: - Generuojamas klientų ir serverių kodas reikiama kalba naudojant
protockompiliatorių: - Serveris įgyvendina sugeneruotą paslaugos sąsają:
- Klientas naudoja sugeneruotą kodą, kad iškviestų serverio metodus:
.proto failo pavyzdys:
syntax = "proto3";
package greeting;
// Paslaugos apibrėžimas
service Greeter {
// Vieno užklausimo - vieno atsakymo RPC metodas
rpc SayHello (HelloRequest) returns (HelloReply) {}
// Serverio srauto metodas
rpc SayHelloStream (HelloRequest) returns (stream HelloReply) {}
}
// Žinučių apibrėžimai
message HelloRequest {
string name = 1; // Lauko numeris 1
}
message HelloReply {
string message = 1;
}
Palyginimas su REST (naudojant JSON/XML):
| Savybė | gRPC (Protobuf) | REST (JSON/XML) |
|---|---|---|
| Transporto protokolas | HTTP/2 | HTTP/1.1 arba HTTP/2 |
| Duomenų serializacija | Protobuf (dvivietis) | JSON, XML (teksto) |
| Našumas | Aukštas (dvivietis formatas, HTTP/2) | Žemesnis (teksto formatas, papildomi kaštai) |
| API aprašymo kalba | Protocol Buffers (.proto failai) |
OpenAPI/Swagger |
| API sutartis | Griežta, remiasi Protobuf | Mažiau griežta |
| Duomenų tipizacija | Griežta (nustatyta .proto) |
Silpna (vykdymo metu tikrinama) |
| Kodo generavimas | Integruotas (standartinis) | Reikalauja trečiųjų šalių įrankių |
| Srautinio perdavimo | Integruotas | Reikia papildomų mechanizmų (pvz., WebSockets) |
| ** Skaitymas** | Sunku skaityti be .proto |
Lengva žmogui skaityti |
gRPC gerai tinka tarpaslaugų sąveikai paskirstytose sistemose, mikrosistemose, didelių duomenų perdavimui, kur svarbus našumas ir griežtas API sutartis.