Jak gRPC wprowadza porządek w komunikacji mikrousług
Wyobraź sobie, że budujesz złożony system, w którym tuzin usług w różnych językach musi ciągle wymieniać dane. Zazwyczaj bierzemy znajomy REST, piszemy masę schematów JSON, a potem zmagamy się z typowaniem i wydajnością. W pewnym momencie uświadamiasz sobie: wydawanie zasobów CPU na pakowanie i rozpakowywanie tekstu to wątpliwa przyjemność. Tutaj właśnie pojawia się gRPC.
Co to w ogóle jest
W skrócie, gRPC to nowoczesny framework do zdalnego wywoływania procedur. Został stworzony przez Google, aby rozwiązać problem efektywnej interakcji między tysiącami wewnętrznych usług. Główna cecha polega na tym, że dla twojego kodu wywołanie funkcji na innym serwerze wygląda prawie tak samo jak wywołanie metody lokalnej.
Projekt znajduje się w repozytorium grpc/grpc i łączy implementacje dla C++, Pythona, Rubiego i innych języków, które są zbudowane wokół wspólnego rdzenia C.
Dlaczego warto na niego przejść
Kiedy pierwszy raz wypróbowałem gRPC w prawdziwym projekcie, to co najbardziej zwróciło moją uwagę, nie była prędkość, ale ścisły kontrakt.
Kontrakt ponad wszystkim
W gRPC zaczynasz nie od kodu, ale od opisu interfejsu w plikach .proto. Jasno opisujesz struktury danych i metody. Z tego pliku specjalny kompilator generuje kod klienta i serwera w potrzebnym ci języku. Koniec z dyskusjami o tym, czy przekazywać datę jako string czy liczbę — wszystko jest określone w schemacie.
Szybkość i format binarny
Zamiast przesyłać rozbudowany JSON przez sieć, gRPC wykorzystuje Protocol Buffers (Protobuf). To format binarny, który jest znacznie bardziej zwięzły i szybciej się parsuje. W przypadku aplikacji mobilnych lub backendów o wysokim obciążeniu różnica w zużyciu ruchu i CPU staje się dość szybko zauważalna.
Strumieniowanie od razu
REST to zawsze „żądanie-odpowiedź". gRPC pozwala robić fajne rzeczy:
- Strumieniowanie klienta (wysyłanie strumienia danych do serwera).
- Strumieniowanie serwera (serwer wysyła strumień aktualizacji).
- Strumieniowanie dwukierunkowe (pełny dupleks).
To idealnie sprawdza się w czatach, systemach monitoringu czy przesyłaniu dużych plików partiami.
Jak to działa pod maską
Repozytorium jest zbudowane na src/core — współdzielonej bibliotece C. Wrappery dla konkretnych języków są wokół niej opakowane. Co ciekawe, niektóre implementacje, jak dla Go czy Javy, znajdują się w osobnych repozytoriach, aby lepiej pasowały do ekosystemów tych języków.
gRPC działa na bazie HTTP/2. Zapewnia to możliwość multipleksowania (wiele żądań w jednym połączeniu) i kompresję nagłówków. Jeśli jesteś przyzwyczajony do debugowania żądań przez curl, będziesz musiał się trochę przestawić, ponieważ dane w kanale są nieczytelne dla ludzi bez specjalnych narzędzi.
Gdzie to wykorzystać
Nie zalecałbym ciągnięcia gRPC wszędzie. Na przykład jeśli tworzysz publiczne API dla zewnętrznych deweloperów, REST jest nadal de facto standardem ze względu na swoją prostotę.
Ale gRPC jest niezastąpiony w dwóch przypadkach:
- Wewnętrzna kuchnia mikrousług. Kiedy jest dużo usług i ciągle ze sobą komunikują. Typowanie i generowanie kodu oszczędzają tygodnie developmentu.
- Architektura wielojęzyczna. Jeśli masz analitykę w Pythonie, główny backend w Go, a krytyczne pod względem pamięci części w C++, gRPC bezproblemowo je połączy.
Od czego zacząć naukę
W repozytorium jest świetny folder examples. Zawiera przykłady od klasycznego „Hello World" po złożone scenariusze strumieniowania.
Aby uruchomić prosty serwer w Pythonie, wystarczy kilka poleceń:
pip install grpcio
pip install grpcio-tools
Następnie opisujesz swoją usługę w .proto, generujesz kod i implementujesz logikę.
gRPC nie jest „zabójcą REST", ale potężnym narzędziem do konkretnych zadań. Wymaga nieco więcej wysiłku na początku z powodu konfiguracji generowania kodu, ale zwraca się stabilnością i wydajnością w przyszłości. Jeśli masz dość łapania błędów, bo ktoś zmienił pole w JSON po drugiej stronie, koniecznie rzuć okiem na ten projekt. To przypadek, gdy dyscyplina w architekturze naprawdę upraszcza życie.
Powiązane projekty