Praktyczny przewodnik po gRPC w Javie
Zaktualizowaliśmy ten tekst dla Ciebie!
Data aktualizacji: 26.12.2024
Autor aktualizacji: Adam Olszewski
gRPC to otwartoźródłowy, językowo niezależny framework RPC, opracowany przez Google w 2015 roku na podstawie ich wewnętrznego frameworka Stubby, który obsługuje miliardy żądań na sekundę. Od momentu jego powstania, gRPC przeszedł liczne usprawnienia, z istotnymi aktualizacjami zarówno funkcji, jak i wsparcia ekosystemu.
Porównanie z SOAP i REST
Chociaż gRPC ma pewne podobieństwa z SOAP (ze względu na podejście „contract-first” i obowiązkową definicję wiadomości), oferuje kilka kluczowych zalet w porównaniu zarówno do SOAP, jak i REST:
– Prostsze kontrakty: gRPC używa protokołów buforów (.proto), które są znacznie prostsze, szybsze i bardziej efektywne niż format XML używany w SOAP.
– Lepsza wydajność: Protokół Buffers (protobuf) jest formatem binarnym, który jest bardziej zwarty i szybszy niż JSON (używany w REST) oraz XML (używany w SOAP). Ma to szczególne znaczenie w aplikacjach o wysokiej wydajności.
– Wsparcie dla strumieniowania: gRPC natywnie obsługuje strumieniowanie, zarówno od klienta do serwera, jak i odwrotnie, podczas gdy REST wymaga dodatkowych warstw, aby osiągnąć podobne cele.
– Wbudowane terminy i anulowanie: gRPC pozwala deweloperom ustawiać terminy i anulować RPC, co jest trudniejsze do osiągnięcia w REST.
– Generowanie kodu: Narzędzia gRPC automatycznie generują kod klienta i serwera, zmniejszając ilość kodu szablonowego i zwiększając produktywność.
Protokół Buffers (protobuf) Pod Maską
Protocol Buffers (protobuf) to sposób serializacji danych strukturalnych, który gRPC wykorzystuje do efektywnej komunikacji między usługami. Protobuf jest znacznie mniejszy i szybszy niż JSON czy XML, dzięki swojemu formatowi binarnemu. Każda wiadomość w protobuf składa się z serii par klucz-wartość.
Oto zaktualizowany przykład definicji wiadomości Car:
message Car {
int32 id = 1;
string name = 2;
}
Protobuf został zaprojektowany, aby minimalizować obciążenie sieciowe i umożliwia szybkie serializowanie i deserializowanie danych.
Wartości Wymagane, Opcjonalne i Domyślne
IW składni proto3 wszystkie pola są traktowane jako opcjonalne, a słowo kluczowe required (obecne w proto2) zostało usunięte. Pola proto3 nigdy nie mają wartości null, ale są inicjowane wartościami domyślnymi. Oto domyślne wartości dla popularnych typów w proto3:
– 0 dla typów numerycznych
– false dla booleanów
– „” (pusty ciąg) dla ciągów
– null dla pól wiadomości zagnieżdżonych (ale protobuf zapewnia dla nich instancje domyślne, zapewniając bezpieczeństwo przed null w Javie).
Proto3 zapewnia kompatybilność, nawet gdy pola są usuwane lub zmieniane, o ile przestrzegasz najlepszych praktyk, takich jak unikanie ponownego używania tagów pól.
Kompatybilność Wsteczna Plików Proto
Główną zaletą protobuf jest kompatybilność wsteczna. Jeśli zaktualizujesz definicję protobuf w usłudze, gRPC zapewnia, że zmiany będą bezpieczne. Możesz dodać nowe pola lub zmienić nazwy istniejących (o ile tag pola pozostanie ten sam), nie łamiąc kompatybilności wstecznej. Oto zaktualizowany przykład wiadomości Car:
proto
message Car {
int32 id = 1;
string name = 2;
string description = 3;
Color color = 4;
}
enum Color {
UNSPECIFIED = 0;
BLACK = 1;
PINK = 2;
RED = 3;
}
Ta zmiana nie łamie kompatybilności wstecznej, ponieważ tagi pól (1, 2, 3, 5) pozostają takie same. Należy jednak unikać ponownego używania lub zmiany numeracji tych tagów.
Korzystanie z gRPC w Javie (Zaktualizowane na Nowoczesne Praktyki)
Generowanie kodu w gRPC w Javie pozostaje proste, a wprowadzenie nowych narzędzi i optymalizacji poprawiło wydajność. Główne cechy wygenerowanego kodu w Javie to:
– Niezmienność i bezpieczeństwo przed null: Generowane klasy są niezmienne i bezpieczne przed NullPointerException. Można łańcuchować wywołania getterów, nie martwiąc się o NullPointerException. Na przykład:
Car reply = Car.newBuilder().setName("Tesla").build();
Engine engine = reply.getEngine(); // Will return a default Engine if not set
int engineCapacity = engine.getCapacity(); // No NullPointerException, uses default value (0)
Ta funkcjonalność jest szczególnie użyteczna, aby uniknąć problemów w środowiskach wielowątkowych, ponieważ wygenerowany kod protobuf jest bezpieczny wątkowo.
– Obsługa wiadomości zagnieżdżonych: Jeśli wiadomość zagnieżdżoną nie zostanie ustawiona, zostanie zainicjowana domyślną wartością, a nie null, co ułatwia unikanie NullPointerExceptions. Możesz także sprawdzić, czy pole wiadomości jest ustawione, używając metod hasX():
if(response.hasEngine()) {
System.out.println("This car has an Engine");
}
Maski Pola (Zaktualizowane dla Operacji Patch)
Maski pól nadal pełnią istotną rolę w aktualizacjach częściowych, umożliwiając selektywne aktualizowanie pól, podobnie jak metoda PATCH w REST. Jednak w najnowszych aktualizacjach gRPC wsparcie dla Maski Pola zostało uproszczone dzięki lepszym narzędziom do pracy z podzbiorami pól.
Nowe narzędzie, FieldMaskUtil, upraszcza pracę z Maskami Pola, zapewniając, że tylko określone pola zostaną zmodyfikowane. Przy użyciu FieldMask należy określić zestaw nazw pól (a nie tagów), co zapobiega problemom, gdy pola są zmieniane lub dodawane.
Nowe Funkcje w gRPC (2024)
W najnowszych wersjach gRPC wprowadzono:
– gRPC-Web: gRPC teraz w pełni wspiera klientów Web, co ułatwia budowanie aplikacji internetowych z – – gRPC, z automatycznymi przejściami do REST, jeśli zajdzie taka potrzeba.
– gRPC z Spring Boot: Spring Boot teraz ma oficjalne wsparcie dla gRPC, umożliwiając integrację z ekosystemem Spring i czyniąc gRPC pierwszorzędnym wyborem w mikrousługach opartych na Springu.
Ulepszenia bezpieczeństwa: gRPC wprowadził ulepszenia w swoich mechanizmach bezpieczeństwa, w tym lepsze wsparcie dla mTLS (mutual TLS) i bardziej elastyczne wzorce autentykacji/autoryzacji.
Podsumowanie
gRPC w Javie nadal się rozwija, z usprawnieniami w wydajności, łatwości użycia i integracji z ekosystemem. Kluczowe cechy, takie jak rozwój oparty na kontrakcie, protokoły bufory, kompatybilność wsteczna oraz bezpieczeństwo przed null, pomagają deweloperom tworzyć niezawodne i efektywne systemy rozproszone. Niezależnie od tego, czy budujesz mikrousługi, systemy komunikacji w czasie rzeczywistym, czy współpracujesz z klientami webowymi, gRPC pozostaje potężnym wyborem dla nowoczesnych interfejsów API.
Aby dowiedzieć się więcej o zaawansowanych przypadkach użycia, takich jak używanie gRPC z Spring Boot czy implementacja złożonych mechanizmów bezpieczeństwa, zapoznaj się z zaktualizowaną dokumentacją i zasobami społecznościowymi.
Powodzenia w Twojej podróży kodowania!
Poznaj mageek of j‑labs i daj się zadziwić, jak może wyglądać praca z j‑People!
Skontaktuj się z nami


