Wszystko wskazuje na to, że już w listopadzie bieżącego roku można spodziewać się Springa 6 i Spring Boot-a 3!
Formalnie zostaną one zaprezentowane na wydarzeniu Spring One, które odbędzie się 6-8 grudnia w San Francisco.
W najnowszej wersji frameworków szczególną uwagę poświęcono dwóm nadrzędnym tematom: natywnym plikom wykonywalnym i obserwowalności (
observability).
Spring Framework wprowadza w tym celu podstawowe abstrakcje, a projekty z jego portfolio, w tym Spring Boot, konsekwentnie się z nimi integrują.
Część rozwiązań opisywaliśmy już kilka miesięcy temu w artykule
Spring Framework 6 - Pierwszy raport!
Dziś przyjrzymy się kolejnym nowościom.
Obserwowalność
Wraz z nowym Springiem powstała inicjatywa obserwacji i rejestracji,
która zakończyła się stworzeniem nowego interfejsu API
Micrometer Observation
oraz migracją poprzedniego projektu
Spring Cloud Sleuth do
Micrometer Tracing.
Rozwiązanie to służy do wydajnego rejestrowania metryk aplikacji za pomocą
Micrometer Tracing
i wdrażania śledzenia za pośrednictwem dostawców, takich jak
OpenZipkin lub
OpenTelemetry.
Appa Notka.
Zipkin to rozproszony system śledzenia. Pomaga gromadzić dane w czasie
potrzebne do rozwiązywania problemów z opóźnieniami w ramach realizacji usług.
Funkcje obejmują zarówno zbieranie, jak i wyszukiwanie tych danych.
Posiadając identyfikator śledzenia w pliku dziennika, możemy przejść bezpośrednio do tego dziennika.
Możemy również wysyłać zapytania na podstawie atrybutów, takich jak usługa, nazwa operacji, tagi i czas trwania.
OpenTelemetry
to zbiór narzędzi, interfejsów API i zestawów SDK służacych do instrumentowania, generowania, zbierania i eksportowania danych telemetrycznych (metryki, dzienniki i ślady).
Nowe interfejsy HTTP
Warto podkreślić znaczący postęp w zakresie komunikacji HTTP na poziomie kodu, szczególnie gdy chodzi o wysyłanie żądań do innych usług. Dotychczas powszechnie stosowaliśmy
RestTemplate, nie uwzględniając kwestii rejestracji usług w Eurece czy wykorzystania
FeignClient.
Jednakże, jak wielu z nas doświadczyło, to rozwiązanie nie zawsze było komfortowe.
Spring Framework w wersji 6 wraz ze Spring Boot w wersji 3 wprowadza możliwość korzystania
z API HTTP w sposób deklaratywny przy użyciu interfejsów. Ta funkcja przypomina sposób
pisania repozytoriów Spring Data, gdzie po prostu tworzymy interfejs i deklarujemy,
jakie metody powinien on posiadać, a Spring Data utworzy proxy, implementując wszystkie zapytania SQL.
Metody interfejsu opisujemy za pomocą ogólnej adnotacji
@HttpExchange
lub adnotacji dedykowanych do konkretnych metod HTTP, np.
@GetExchange:
Takie rozwiązanie zadziała, o ile wcześniej stworzymy beana usługi:
Samo wywołanie jest banalnie proste. Wystarczy wstrzyknąć
personService
tam, gdzie chcemy go użyć, a następnie...wybrać metodę:
AOT i natywne pliki wykonywalne
Inicjatywa
Spring Native przenosi się do właściwego projektu Springa.
Rozwiązanie zapewnia obsługę kompilacji aplikacji Spring do natywnych plików wykonywalnych przy użyciu kompilatora obrazów natywnych
GraalVM.
Projekt jest dedykowany Spring 5 i Spring Boot 2, natomiast Spring Boot 3 i Spring Framework 6 będą miały wbudowaną obsługę natywnej Javy.
Obrazy natywne zapewniają różne korzyści, takie jak natychmiastowe uruchamianie i mniejsze zużycie pamięci.
Tak więc warto rozważyć, czy nie zbudować natywnego obrazu naszej aplikacji Java.
Appa Notka.
Ahead-Of-Time Processing, czyli AOT, to w skrócie przetwarzanie kontekstu aplikacji z wyprzedzeniem, co pozwala na zoptymalizowanie aplikacji.
W zależności od kontekstu możemy zmniejszyć ilość dostarczanej infrastruktury oraz
wstępnie oszacować funkcje, które zadeklarowaliśmy w swoich komponentach.
Prowadzi to do szybszego uruchamiania aplikacji. Możemy także zidentyfikować rzeczy,
które są być problematyczne w limitowanych środowiskach, przez co możemy zapewnić im właściwą alternatywę.
Kiedy typowa aplikacja Springa działa, kontekst aplikacji wywołuje szereg postprocesorów,
które przygotowują fabrykę beanów: parsowanie klas konfiguracyjnych, skanowanie ścieżek klas i inne,
które ostatecznie mogą wyzwolić rozwiązania automatycznej konfiguracji.
Po uruchomieniu w większości przypadków nie są one już potrzebne w czasie wykonywania.
W dobrze zdefiniowanym środowisku (ścieżka klas itp.) można to zrobić w całości w czasie kompilacji,
tak aby tylko odpowiednie definicje beanów, dla bieżącego środowiska,
były wprowadzane do fabryki beanów. Postprocesory, które zostały uruchomione w czasie kompilacji,
są odrzucane i zastępowane kodem, który dostarczyły.
Java Platform Module System
JPMS, czyli
Java Platform Module System pozwala podzielić kod Java na komponenty (moduły)
na poziomie wyższym niż podział pakietowy. Moduł jest grupą powiązanych pakietów i zasobów o
unikalnej nazwie. Posiada on deskryptor definiujący między innymi zależności do innych modułów.
W przypadku Springa 5 jary są deklarowane jako automatyczne moduły. W Springu 6 planowane jest wykorzystanie
pliku deskryptora, co pozwoli na konfigurowanie zależności między modułami frameworka.
Obsługa standardu RFC7807
Jedną z ważniejszych nowych funkcji jest
obsługa standardu RFC7807 (Problem Details Standard).
Nie będzie potrzeby dołączania osobnych bibliotek, takich jak
Zalando Problem.
Podsumowanie
Kolejna wersja Springa zapowiada się ciekawie. Poza wspomnianymi tu nowościami nie należy zapominać o tym, co już było
przedstawiane wcześniej, a więc użycie
Jakarty EE oraz oparcie kodu a Javę 17.
Tak więc sumarycznie liczba kluczowych zmian jest spora, ale nie jest to rewolucja i wygląda na to,
że nowa wersja będzie w miarę prosta do zaadaptowania w większości projektów.
Autor: Jarek Klimas
Data: 04 października 2022
Labele:Backend, Poziom średniozaawansowany, Java
Linki:
https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga
Masz pytanie odnośnie zagadnienia omawianego w artykule?
Coś, co napisaliśmy, nie zaspokoiło Twojego głodu wiedzy?
Daj nam znać co myślisz i skomentuj artykuł na facebooku!