encyklopedia.run.place

gRPC

gRPC (ang. google Remote Procedure Call) – otwarto‑źródłowa platforma umożliwiająca wywoływanie zdalnych procedur (RPC) przy użyciu protokołu HTTP/2. Została opracowana przez firmę Google i udostępniona jako projekt open source w 2015 roku. Dzięki wysokiej wydajności i wsparciu wielu języków programowania gRPC stało się jednym z najpopularniejszych rozwiązań w architekturach mikroserwisowych oraz w systemach rozproszonych.

Historia

Architektura i komponenty

gRPC opiera się na kilku kluczowych elementach:

  • Protofile – plik z definicją interfejsu w formacie Protocol Buffers (.proto), w którym opisuje się usługi, metody i struktury danych.
  • Serwer – implementuje zdefiniowane w .proto metody i nasłuchuje na połączenia przychodzące.
  • Klient – generowany na podstawie tego samego .proto, umożliwia wywoływanie metod serwera tak, jakby były to wywołania lokalne.
  • Transport – wykorzystuje HTTP/2, co zapewnia multiplexing, kompresję nagłówków i mechanizmy flow‑control.
  • Interceptors – podobne do middleware, pozwalają wstrzykiwać logikę przed/po wywołaniu RPC (np. autoryzację, logowanie).

Model komunikacji

gRPC obsługuje cztery podstawowe style wywołań:

  1. Unary RPC – klasyczne wywołanie jednego żądania i jednej odpowiedzi.
  2. Server‑streaming RPC – klient wysyła pojedyncze żądanie, serwer zwraca strumień odpowiedzi.
  3. Client‑streaming RPC – klient wysyła strumień żądań, a serwer zwraca jedną odpowiedź po zakończeniu transmisji.
  4. Bidirectional streaming RPC – zarówno klient, jak i serwer mogą jednocześnie wymieniać strumień wiadomości.

Wsparcie językowe

gRPC posiada oficjalne implementacje dla następujących języków:

  • C++
  • Java
  • Go
  • Python
  • C#
  • Node.js
  • Ruby
  • PHP
  • Objective‑C
  • Rust (wspierane przez społeczność)

Dzięki generatorowi kodu (protoc) możliwe jest tworzenie zarówno klientów, jak i serwerów w dowolnym wspieranym języku.

Porównanie z innymi technologiami

Cecha gRPC REST/HTTP GraphQL
Protokół transportowy HTTP/2 HTTP/1.1 HTTP/1.1 lub HTTP/2
Format danych Binary – Protocol Buffers (alternatywnie JSON, Avro) JSON lub XML JSON
Wydajność Wysoka (niskie opóźnienia, mały rozmiar wiadomości) Średnia Średnia‑wysoka
Obsługa strumieniowania Wbudowane (wszystkie 4 typy) Ograniczona (WebSockets, Server‑Sent Events) Ograniczona (subskrypcje)
Wersjonowanie API Definicja w .proto (kompatybilność wsteczna) Ręczne (URL, nagłówki) Mechanizmy w schemacie

Zastosowania

gRPC znajduje szerokie zastosowanie w różnych obszarach:

  • Mikroserwisy – efektywna komunikacja między usługami.
  • Systemy czasu rzeczywistego – np. platformy streamingowe, gry online.
  • Rozproszone bazy danych i systemy magazynowania (np. Cassandra, Google Spanner).
  • IoT – niskie zużycie pasma dzięki binarnemu formatowi.
  • Obsługa interfejsów wewnętrznych w chmurze (GCP, Azure, AWS).

Zalety

  • Wysoka wydajność i niskie opóźnienia dzięki HTTP/2 i Protocol Buffers.
  • Jednolita definicja interfejsu – .proto generuje kod dla wielu języków.
  • Wsparcie natywnego strumieniowania dwukierunkowego.
  • Bezpieczna komunikacja – integracja z TLS jest wbudowana.
  • Łatwe testowanie – klienty i serwery można mockować na podstawie interfejsu.

Wady

  • Wymaga znajomości Protocol Buffers lub innego serializatora.
  • Mniej przyjazny dla przeglądarek internetowych – standardowo nie obsługuje się go w przeglądarce bez dodatkowych warstw.
  • Skupienie na komunikacji binarnej utrudnia bezpośrednie debugowanie w porównaniu do tekstowego JSON.

Implementacje i narzędzia

Oprócz oficjalnych bibliotek, istnieje szereg narzędzi powiązanych z gRPC:

  • protoc – kompilator Protocol Buffers generujący kod.
  • grpcurl – narzędzie linii poleceń do testowania endpointów gRPC (odpowiednik curl).
  • Envoy – proxy obsługujący gRPC i zapewniający routing, load balancing oraz TLS.
  • Istio – platforma serwisowa (service mesh) z natywną obsługą gRPC.

Przykładowa definicja usługi

syntax = "proto3";

package example;

// Definicja usługi
service Greeter {
  // Unary RPC
  rpc SayHello (HelloRequest) returns (HelloReply) {}

  // Server‑streaming RPC
  rpc ListGreetings (HelloRequest) returns (stream HelloReply) {}
}

// Wiadomość żądania
message HelloRequest {
  string name = 1;
}

// Wiadomość odpowiedzi
message HelloReply {
  string message = 1;
}

Przyszłość i rozwój

Projekt gRPC jest aktywnie rozwijany przez społeczność open source oraz inżynierów z Google. W najnowszych wersjach dodano wsparcie dla:

  • gRPC‑Web – umożliwiające wywołania gRPC z przeglądarki przy użyciu standardowego HTTP/1.1 lub HTTP/2.
  • Observability – integracja z OpenTelemetry oraz Prometheus.
  • Rozszerzone zabezpieczenia, m.in. mTLS i tokeny JWT.

Literatura

  1. Google, gRPC: A High Performance, Open Source Universal RPC Framework, 2015.
  2. Josuttis, N., gRPC: Modern Remote Procedure Calls, O'Reilly Media, 2021.
  3. Protobuf – dokumentacja Protocol Buffers, 2023.

gRPC stał się kluczowym elementem współczesnych systemów rozproszonych, oferując połączenie wysokiej wydajności, prostoty w definiowaniu interfejsów oraz szerokiego wsparcia językowego.