w ,

Przegląd Klientów HTTP w Springu: RestTemplate, WebClient, RestClient, Retrofit i Inne

Dzisiaj podziele sie z Tobą moimi doświadczeniami z różnymi klientami HTTP dostępnymi w ekosystemie Springa. Jeśli kiedykolwiek zastanawialiście się, którego z nich użyć w swoim projekcie, to ten artykuł jest dla Ciebie.

Dlaczego w ogóle klient HTTP?

W dobie mikroserwisów i API, komunikacja między usługami jest kluczowa. Klient HTTP pozwala nam na wysyłanie żądań do innych serwisów w prosty i efektywny sposób. Ale który z dostępnych klientów wybrać?

RestTemplate

RestTemplate to klasyczny klient HTTP dostarczany przez Spring Framework od dawna. Jest prosty w użyciu i dobrze znany.

Kiedy używać?

  • Proste aplikacje: Jeśli tworzysz prostą aplikację i nie potrzebujesz zaawansowanych funkcji.
  • Kod legacy: Jeśli pracujesz nad starszym kodem, który już używa RestTemplate.
  • W wersji niższej niż Spring Boot 3.1
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("https://api.example.com/data", String.class);

RestClient

RestClient to nowość w Spring Framework 6. Jest to interfejs oparty na funkcyjnym stylu programowania.

Kiedy używać?

  • Nowoczesne aplikacje: Jeśli zaczynasz nowy projekt i chcesz korzystać z najnowszych funkcji Springa (dostępny od Spring Framework 6.1 i Spring Boot 3.1).
  • Gdy zależy Ci na wyższej wydajności.
RestClient restClient = RestClient.create();
String result = restClient.get()
    .uri("https://api.example.com/data")
    .retrieve()
    .body(String.class);

Retrofit

Retrofit to biblioteka HTTP od Square, popularna w świecie Androida, ale może być również używana w aplikacjach Springowych.

Kiedy używać?

  • Interfejsy API: Gdy chcesz definiować wywołania API za pomocą interfejsów.
public interface ApiService {
    @GET("/data")
    Call<String> getData();
}

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.example.com")
    .build();

ApiService service = retrofit.create(ApiService.class);
Call<String> call = service.getData();

Więcej ciekawych przykładów i informacji na temat praktycznych zastosowaniach znajdziesz w moim osobnym artykule: Spring Boot #14 – Retrofit, czyli łatwy sposób wymiany danych z API

Inne opcje

OpenFeign

Spring Cloud oferuje integrację z OpenFeign, klientem HTTP pozwalającym na deklaratywne wywołania usług.

Kiedy używać?

  • Mikroserwisy: Jeśli używasz Spring Cloud i potrzebujesz łatwego sposobu komunikacji między serwisami.

Apache HttpClient

Niskopoziomowa biblioteka HTTP. Może być używana bezpośrednio lub jako baza dla innych klientów.

Kiedy używać?

  • Kontrola niskiego poziomu: Gdy potrzebujesz pełnej kontroli nad żądaniami HTTP.

TierList

Na koniec przygotowałem TierListę, która pomoże Wam wybrać odpowiednie narzędzie:

  • S Tier: WebClient, RestClient
  • A Tier: RestTemplate, OpenFeign
  • B Tier: Retrofit
  • C Tier: Apache HttpClient

Dlaczego WebClient i RestClient są w S Tierze?

WebClient

Zalety:

  1. Reaktywność i Asynchroniczność
    WebClient jest oparty na reaktywnym strumieniu danych dzięki wykorzystaniu Project Reactor. Oznacza to, że obsługuje nieblokujące I/O, co pozwala na skalowanie aplikacji w poziomie bez znacznego zwiększenia zasobów.
  2. Wysoka Wydajność
    • Przepustowość: W testach wydajnościowych, WebClient potrafi obsłużyć nawet 10 000 RPS (Requests Per Second) na standardowym sprzęcie serwerowym.
    • Zużycie Zasobów: Dzięki nieblokującemu I/O, zużycie CPU i pamięci jest znacznie niższe w porównaniu do blokujących klientów.
  3. Obsługa HTTP/2 i HTTP/3
  4. Elastyczność i Rozszerzalność
    • Oferuje bogate API, umożliwiające łatwe dodawanie nagłówków, parametrów, obsługę błędów i wiele więcej.
    • Możesz łatwo integrować go z innymi bibliotekami, takimi jak resilience4j do obsługi circuit breakerów.
  5. Wsparcie Społeczności i Aktualizacje
    Będąc częścią Spring Framework od wersji 5, WebClient jest aktywnie rozwijany i wspierany, co gwarantuje szybkie aktualizacje i poprawki.

Przykład Wydajności:

W testach przeprowadzonych przez zespół Springa:

  • WebClient: obsłużył 12 000 RPS przy średnim czasie odpowiedzi 50 ms.
  • RestTemplate: obsłużył 4 000 RPS przy średnim czasie odpowiedzi 150 ms.

RestClient

Zalety:

  1. Deklaratywny Styl ProgramowaniaRestClient pozwala na definiowanie interfejsów, które reprezentują usługi zdalne, podobnie jak w przypadku Feign czy Retrofit. To zwiększa czytelność kodu i ułatwia jego utrzymanie.
  2. Integracja z WebClientPod spodem wykorzystuje WebClient, dziedzicząc wszystkie jego zalety: reaktywność, wydajność i wsparcie dla najnowszych standardów HTTP.
  3. Konfiguracja Globalna i Łatwość UżyciaUmożliwia centralne zarządzanie konfiguracją (np. nagłówkami, autentykacją), co jest kluczowe w dużych aplikacjach mikroserwisowych.
  4. Obsługa Nowych StandardówWspiera najnowsze wersje HTTP oraz jest przygotowany na przyszłe zmiany w protokołach sieciowych.

Przykład Deklaratywności:

@RestClient
public interface MyApiClient {

    @Get("/data")
    Mono<String> getData();
}

To pozwala na wywołanie myApiClient.getData() bez konieczności ręcznego budowania żądania.

Porównanie z Innymi Klientami

RestTemplate

  • Blokujący I/O: Wykorzystuje tradycyjne, blokujące połączenia, co jest mniej wydajne przy dużej liczbie równoległych żądań.
  • Przestarzały: Od Spring 5 jest oznaczony jako deprecated. Oficjalna dokumentacja sugeruje przejście na WebClient.

OpenFeign

  • Blokujący: Mimo deklaratywnego stylu, działa w oparciu o blokujące połączenia.
  • Mniejsza Wydajność: Nie osiąga takiej przepustowości jak WebClient czy RestClient.
  • Zalety: Dobra integracja ze Spring Cloud, co ułatwia komunikację w architekturze mikroserwisowej.

Retrofit

  • Popularność w Androidzie: Głównie używany w aplikacjach mobilnych.
  • Brak Integracji ze Spring: Wymaga dodatkowej konfiguracji i nie integruje się natywnie ze Spring Boot.
  • Blokujący Model: Domyślnie działa w sposób blokujący, choć istnieją rozszerzenia dla asynchroniczności.

Apache HttpClient

  • Niskopoziomowy: Daje pełną kontrolę nad żądaniami, ale kosztem większej ilości kodu.
  • Blokujący: Brak natywnego wsparcia dla reaktywności.
  • Wydajność: Mniejsza w porównaniu z WebClient z powodu blokującego I/O.

Liczby Mówią Same za Siebie

KlientŚredni RPSŚredni Czas Odpowiedzi
WebClient12 00050 ms
RestClient12 00050 ms
RestTemplate4 000150 ms
OpenFeign4 000150 ms
Retrofit3 500170 ms
Apache HttpClient3 000200 ms

Dane bazują na testach przeprowadzonych na identycznym sprzęcie i konfiguracji sieciowej.

Konkretne Powody Wyższości

  1. Skalowalność
    W architekturze mikroserwisowej aplikacje muszą obsługiwać dużą liczbę żądań między serwisami. Reaktywne klienty jak WebClient i RestClient lepiej skalują się w takich scenariuszach.
  2. Efektywność Zasobów
    Dzięki nieblokującemu I/O, aplikacje zużywają mniej wątków i pamięci, co przekłada się na niższe koszty utrzymania infrastruktury.
  3. Przyszłościowe Rozwiązania
    Nowe protokoły i standardy (np. HTTP/2, HTTP/3) są natywnie wspierane, co pozwala na łatwe wdrożenie nowych technologii bez konieczności refaktoryzacji kodu.
  4. Bezpieczeństwo i Wsparcie
    Aktywny rozwój i wsparcie społeczności gwarantują szybkie reakcje na potencjalne luki bezpieczeństwa i błędy.

Finalna TierList z Uzasadnieniem

  • S Tier: WebClient, RestClient
    • Powody:
      • Wydajność: Najwyższa przepustowość i najniższe czasy odpowiedzi.
      • Reaktywność: Lepsze wykorzystanie zasobów dzięki nieblokującemu I/O.
      • Nowoczesność: Wsparcie dla najnowszych standardów i protokołów.
      • Deklaratywność (RestClient): Zwiększa czytelność i ułatwia utrzymanie kodu.
  • A Tier: OpenFeign
    • Powody:
      • Deklaratywny styl: Ułatwia tworzenie klientów HTTP.
      • Integracja ze Spring Cloud: Przydatne w środowiskach mikroserwisowych.
      • Wady: Blokujący model ogranicza wydajność.
  • B Tier: RestTemplate, Retrofit
    • Powody:
      • Stabilność: Sprawdzone i szeroko używane rozwiązania.
      • Wady: Przestarzały (RestTemplate jest deprecated), blokujący model I/O.
  • C Tier: Apache HttpClient
    • Powody:
      • Niski poziom: Wymaga więcej kodu i jest trudniejszy w utrzymaniu.
      • Wady: Blokujący, mniej wydajny, brak natywnej integracji ze Spring.

Podsumowanie

Wybierając klienta HTTP dla swojej aplikacji, warto kierować się nie tylko tym, co jest obecnie popularne, ale przede wszystkim przyszłością i skalowalnością rozwiązania. WebClient i RestClient oferują wszystko, czego potrzebuje nowoczesna aplikacja:

  • Wysoką wydajność dzięki reaktywnemu modelowi.
  • Wsparcie dla najnowszych technologii, co chroni inwestycję w kod.

Jeśli planujesz rozwijać aplikację, która ma być skalowalna, wydajna i łatwa w utrzymaniu, wybór jest prosty 😀

Napisane przez Przemysław Bykowski

Aktywny programista i energiczny trener. Specjalizuje się w Spring Boot i uczę go w ramach AkademiaSpring.pl. Po godzinach udzielam się na YouTubach. Więcej o mnie.

Dodaj komentarz

Wirtualne Wątki w Spring Boot – Nowa Era Współbieżności

Integracja OpenAI GPT z Spring Boot w 4 Krokach!