Sobes.tech
Middle

Czym jest gRPC?

sobes.tech AI

Odpowiedź od AI

gRPC to wysokowydajne, open-source'owe ramy RPC (Remote Procedure Call), opracowane przez Google, do tworzenia rozproszonych aplikacji i mikroserwisów. Opiera się na protokole HTTP/2 do transportu i używa Protocol Buffers (Protobuf) jako języka opisu interfejsów i mechanizmu serializacji.

Kluczowe cechy gRPC:

  • HTTP/2: Wykorzystuje zalety HTTP/2, takie jak multipleksowanie żądań, kompresja nagłówków i dwukierunkowe strumieniowanie, co zapewnia wyższą wydajność w porównaniu z tradycyjnymi protokołami klient-serwer na HTTP/1.1.
  • Protocol Buffers (Protobuf): Język opisu danych, który pozwala na strukturyzację danych i generowanie kodu do serializacji i deserializacji w różnych językach. Protobuf jest efektywny pod względem rozmiaru wiadomości i szybkości przetwarzania.
  • Strumieniowanie: Obsługuje cztery typy strumieniowania:
    • Unary: Klasyczne RPC (jeden żądanie - jedna odpowiedź).
    • Server-side Streaming: Klient wysyła żądanie, serwer odpowiada strumieniem wiadomości.
    • Client-side Streaming: Klient wysyła strumień wiadomości, serwer odpowiada jednym komunikatem.
    • Bidirectional Streaming: Klient i serwer wymieniają strumienie wiadomości jednocześnie.
  • Wielojęzyczność: Dzięki Protobuf gRPC generuje kod klienta i serwera dla wielu języków programowania.
  • Generacja kodu: Automatyczne tworzenie kodu dla klienta i serwera na podstawie plików .proto, co zmniejsza ręczne kodowanie.
  • Metadane: Obsługa przesyłania metadanych (par klucz-wartość) wraz z żądaniami i odpowiedziami.
  • Interceptors: Możliwość przechwytywania żądań i odpowiedzi w celu wykonania dodatkowej logiki (np. logowanie, uwierzytelnianie).

Jak działa gRPC:

  1. Definiuje się usługę API za pomocą języka Protocol Buffers w pliku .proto.
  2. Generuje się kod klienta i serwera w wybranym języku za pomocą kompilatora protoc.
  3. Serwer implementuje wygenerowany interfejs usługi.
  4. Klient korzysta z wygenerowanego kodu do wywoływania metod usługi na serwerze.

Przykład pliku .proto:

syntax = "proto3";

package greeting;

// Definicja usługi
service Greeter {
  // Metoda RPC unitarna
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Metoda strumieniowa po stronie serwera
  rpc SayHelloStream (HelloRequest) returns (stream HelloReply) {}
}

// Definicja wiadomości
message HelloRequest {
  string name = 1; // Pole z numerem pozycji 1
}

message HelloReply {
  string message = 1;
}

Porównanie z REST (używającym JSON/XML):

Cecha gRPC (Protobuf) REST (JSON/XML)
Protokół transportu HTTP/2 HTTP/1.1 lub HTTP/2
Serializacja danych Protobuf (binarny) JSON, XML (tekstowy)
Wydajność Wysoka (format binarny, HTTP/2) Niższa (format tekstowy, narzut)
Język opisu API Protocol Buffers (.proto) OpenAPI/Swagger
Kontrakt API Ścisły, oparty na Protobuf Mniej ścisły
Typowanie danych Ścisłe (określane w .proto) Słabe (weryfikacja w czasie działania)
Generacja kodu Wbudowana Wymaga narzędzi zewnętrznych
Strumieniowanie Wbudowane Wymaga dodatkowych mechanizmów (np. WebSockets)
Czytelność Trudne do czytania bez .proto Łatwe do czytania przez ludzi

gRPC jest bardzo odpowiedni do komunikacji między usługami w rozproszonych systemach, mikroserwisach, przesyłania dużych ilości danych, gdzie ważna jest wydajność i ścisły kontrakt API.