Kurs Java

Spring Framework 6 już jest!

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:
@HttpExchange(url = "/workers")
public interface PersonService {

    @HttpExchange(url = "/first", method = "GET")
    void firstPerson();

    @GetExchange("/person/{name}")
    Person personByName(@PathVariable String name);

    @GetExchange("/person")
    List<Person> personList();
}
Takie rozwiązanie zadziała, o ile wcześniej stworzymy beana usługi:
@Bean
PersonService () {
    WebClient client = WebClient.builder().baseUrl("http://localhost:8080/").build();
    HttpServiceProxyFactory proxyFactory =
            HttpServiceProxyFactory.builder(new WebClientAdapter(client)).build();

    return proxyFactory.createClient(PersonService.class);
}
Samo wywołanie jest banalnie proste. Wystarczy wstrzyknąć personService tam, gdzie chcemy go użyć, a następnie...wybrać metodę:
Person person = personService.personByName("Jarek");

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 swoje przemyślenia na temat artykułu? Podziel się nimi!
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!

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE