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
- 2015 – Google udostępnia gRPC jako projekt open source pod licencją Apache 2.0.
- 2016 – pierwsza stabilna wersja 1.0, wsparcie dla języków: C++, Java, Go, Python.
- 2018 – wprowadzenie wsparcia dla Protocol Buffers v3 oraz integracja z Kubernetes.
- 2020 – gRPC zyskuje popularność w ekosystemie cloud computing, m.in. w Google Cloud Platform oraz Microsoft Azure.
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
.protometody 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ń:
- Unary RPC – klasyczne wywołanie jednego żądania i jednej odpowiedzi.
- Server‑streaming RPC – klient wysyła pojedyncze żądanie, serwer zwraca strumień odpowiedzi.
- Client‑streaming RPC – klient wysyła strumień żądań, a serwer zwraca jedną odpowiedź po zakończeniu transmisji.
- 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 –
.protogeneruje 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
- Google, gRPC: A High Performance, Open Source Universal RPC Framework, 2015.
- Josuttis, N., gRPC: Modern Remote Procedure Calls, O'Reilly Media, 2021.
- 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.