Po tygodniu przerwy, dzisiaj skupimy się głównie na Spring I/O, po drodze zahaczając o interesujący temat zkonteneryzowanej Javy.
1. Java może dostać dedykowany profil wydajnościowy na potrzeby konteneryzacji
Wielokrotnie spotykam się z pewnym sceptycyzmem jeśli chodzi o raporty branżowe, prezentujące statystyki poszczególnych wersji. „A po co to komu”, „zła metodyka”, „grupa niereprezentatywna” to tylko część z komentarzy, które można znaleźć w sieci. Jednocześnie jednak warto czasem poświęcić tego typu badaniom trochę więcej miejsca. Parę tygodni temu miałem okazję podzielić się z Wami dwoma raportami, odpowiednio od Vaadina oraz New Relica. O ile o pierwszym chyba już wszyscy zapomnieli (Enterprise Java, której był poświęcony, nie jest najbardziej „sexy” tematem na świecie), to publikacja „The State of Java Ecosystem 2023” okazuje się mieć szanse na nieco szersze reperkusje, niż ktokolwiek mógł się spodziewać.
Ludzie odpowiadający za Javę w Microsofcie poinformowali ostatnio, że pracują nad JEP-em mającym wprowadzić Profile Ergonomiki do Java Virtual Machine (JVM). Ta funkcja umożliwiłaby posiadanie w Javie dwóch różnych konfiguracji: profilu 'współdzielonego’, zaprojektowany z założeniem, że JVM musi dzielić zasoby z innymi procesami, oraz profil 'dedykowany’ dla systemów, które dedykują zasoby wyłącznie dla procesu JVM i ta może brać tyle, ile fabryka dała. Ten ruch jest motywowany wspomnianymi danymi od New Relic, które pokazują, że ponad 70% monitorowanych przez nich JVM działa w dedykowanych środowiskach, takich jak kontenery, bardzo często bez żadnej konfiguracji, a więc bardzo niewydajnie.
Proponowany profil 'dedykowany’ ma na celu umożliwienie JVM bardziej efektywnego wykorzystania dostępnych zasobów, szczególnie w dedykowanych środowiskach. Na przykład, w przeciwieństwie do obecnych „defaultów”, gdzie maksymalny rozmiar sterty JVM waha się między 25% a 50% w zależności od dostępnego rozmiaru pamięci, nowy profil mógłby zwiększyć domyślne przydzielanie rozmiaru sterty do 60%-70%. Ponadto zawierałby również inne heurystyki co do wyboru GC, liczenia aktywnych procesorów i rozmiarów wewnętrznych pul wątków JVM. Poza wprowadzeniem dwóch pierwszych, wspomnianych profili, JEP ma wprowadzić struktury umożliwiające rozszerzanie OpenJDK o więcej profili. Teraz na razie jednak czekamy na więcej, ponieważ prace dopiero zostały zapowiedziane szerszej społeczności.
Ale „Ergonomic Profiles” były tylko dodatkiem (choć od tematu konteneryzacji nie uciekniemy, jeszcze wróci). Przejdźmy do prawdziwego mięska.
Zainstaluj teraz i czytaj tylko dobre teksty!
2. Wirtualne Wątki, CRaC, GraalVM, Spring Boot 3.1 – co ciekawego przyniósł Spring I/O 2023
Ja wiem, że już wszyscy pewnie zapomnieli, ale w połowie maja odbył się Spring I/O 2023. Dla tych którzy (tak jak ja, niestety) nie mieli okazji odwiedzić słonecznej Barcelony, na oficjalnym kanale konferencji pojawiły się nagrania talków. Dlatego też wreszcie teraz, gdy już każdy może oglądnąć sobie konferencje nie z ze swojego pokoju, możemy się skupić na przyglądnięciu tego, co zostało pokazane.
Zacznijmy od Keynote, którego można potraktować jako Spis Treści. Podczas niego Juergen Hoeller – project lead Spring Frameworku – zapowiedział nadchodzące wydania Spring Framework 6.1 i Spring Boot 3.2 oraz nowości, które przyjdą ze zbliżającym się wydaniem, takie jak wirtualne wątkach (min. przez prace nad modernizacją stosu servletów). Na scenie pojawiła się też pracujący nad Springiem Sébastien Deleuze oraz Alina Yurenko, Developer Advocate GraalVM, którzy opowiadali o tym, jak wielką rewolucją dla projektu było Spring Boot Native Image w celu szybszego uruchamiania i mniejszego zużycia zasobów. Na scenie pokazano nam Spring Cloud Function, czyli próbę wejścia Springa w rynek Serverless. Sébastien dodatkowo opowiedział też o CRaC-u i przychodzącymi z nim nowych możliwościach. Na scenie nie mogło zabraknąć też Josha Longa, Spring Developer Advocate, który pokazywał nowe możliwości Spring Boot 3.1.
A teraz rozpakujemy sobie te tematy, właściwie bowiem każdy z poruszonych na Keynote dostał swój followup.
Przykładowo, podczas Spring Framework 6.1: Infrastructure Revisited (moja ulubiona sesja) przedstawił plany na integracje Wirtualnych Wątków w Spring Framework, ze sporą ilością detali. Mnóstwo miejsca poświęcono Jakarta EE 11 i Tomcatowi 10 i w jaki sposób te projekty pozwolą na szybszą integracje w Springu. Juergen Hoeller pochylił się również nad współistnieniem Virtual Threads i Spring WebFlux. Po raz kolejny dostajemy potwierdzenie, że Reactive Programming i Wirtualne Wątki (choć mają elementy przecięcia) będą raczej stanowiły dla siebie równoległą alternatywę. Nie należy się spodziewać, że Wirtualne Wątki zastąpią Reactora – Spring MVC pozwoli za to na integracje obu podejść, jeżeli ktoś będzie miał taką fantazję. Ogólnie, bardzo dobra sesja jeśli jesteście ciekawi, jakie zalety przyniesie wprowadzenie Wirtualnych Wątków do Springa, na nieco głębszym poziomie niż „będzie szybciej”.
To jednak nie koniec o Spring Framework 6.1: Infrastructure Revisited, ponieważ drugą połowę sesji poświęcono integracji CRaC (Coordinated restore at Checkpoint) w Spring Framework. W samego CRaC-a nie będę Was już wprowadzał (mam wrażenie, że robię to w co drugiej edycji, więc zapraszam choćby do poprzedniej). Juergen Hoeller pokazał jakie dodatkowe wyzwania niesie ze sobą wdrożenie CRaC-a do Springa, zwłaszcza z punktu widzenia cyklu życia Beanów. To jednak informacja bardziej dla osób, które interesuje co dzieje się pod maską, gdyż z punktu widzenia użytkownika Springa w większości aplikacji dodatkowe działania nie powinny być potrzebne, a całość ma trafić do naszych rąk już na etapie Spring Boot 3.2, integrującego Spring Framework 6.1.
Finalne wersje obu projektów powinny pojawić się jeszcze w listopadzie tego roku. Nowe funkcjonalności będą wymagały pewnych aktualizacji (JDK 21 dla Wirtualnych Wątków, CRaC jest obecnie wspierany wyłącznie przez OpenJDK Azul), ale sam Spring Framework 6.x ma pozostać kompatybilny z JDK 17+.
CRaC jest już dzisiaj dostępny również jako silnik Amazon Lambda SnapStart – całemu projektowi została poświęcona dedykowana sesja AWS Lambda SnapStart: Dramatically reduce cold starts for your Java functions.
Ciekawym rozwinięciem Keynote było również Going Native: Fast and Lightweight Spring Boot Applications with GraalVM Aliny Yurenko. Prezentacja jest świetnym wprowadzeniem w różnice między JIT i AOT, podobnie jak w wypadku Spring Framework 6.1: Infrastructure Revisited wchodzącą nieco głębiej w specyfiki projektów. Przykładowo, w czasie prezentacji poświęcono sporo czasu zaletom GraalVM, o których nie mówi się za wiele, jak przykładowo uodpornienie aplikacji na różne potencjalne wektory ataku. Spora część prezentacji poświęcona została na Live Demo prezentujące, jak realnie wygląda praca z Native Images w Spring Boot. Znalazło się nawet miejsce na przedstawienie planów na przyszłość i kierunków, w którym rozwijać się am GraalVM wraz z całą platformą. A że rozpoczęliśmy całość od pokazania potencjalnego wpływu researchu w community na przyszłość Javy, podrzucę też link do wyniku ankiety przeprowadzonej wśród społeczności GraalVM. Alina wspomniała o niej podczas Keynote, co po raz kolejny pokazuje, że wasz głos ma znaczenie.
To tak żeby całość ładnie zakończyć, przyglądnijmy się również temu, co w nasze ręce trafiło już w tym momencie – nowych wersjach springowych projektów.
Głównym daniem jest z pewnością jest Spring Boot 3.1. Kluczową tematyką nowego wydania jest konteneryzacja, i to z różnych perspektyw.
Pierwszym, olbrzymim dodatkiem jest wsparcie dla TestContainers. Pewnie wszyscy używający projektu w swoich Spring Bootowych testach mocno się na to ogłoszenie zdziwili, ale tak naprawdę mówimy tutaj o zupełnie innym poziomem wsparcia. AtomicJar we współpracy ze Springiem wprowadziło bowiem możliwość używania TestContainers również do developmentu. Wygląda to trochę jak praca z Docker Compose, z wyjątkiem tego, że konfiguracja kontenera jest w Javie, a nie w YAML. Całość ma oprzeć się na koncepcie obiektów ConnectionDetails
– beanach zapewniających połączenie do zewnętrznych serwisów. Jeśli zostaną zdefiniowane w projekcie, będą miały pierwszeństwo przed połączeniami „na zewnątrz”, dzięki czemu możliwe będzie np. przekierowanie połączeń do lokalnej wersji Postgresa, postawionej w tle za pomocą TestContainers.
Po drugie, wprowadzono nową bibliotekę spring-boot-docker-compose
, która zajmuje się obsługą plików Docker Compose w projekcie. Kiedy aplikacja się uruchamia, szuka pliku Docker Compose i jego konfiguracji, a następnie tworzy dla nas kontener w oparciu o TestContainers (dla tych którzy jednak preferują używanie YAML-a a nie Javy). Dodatkowo, dołącza te konfiguracje do naszej lokalnej aplikacji. Oznacza to, że możemy uruchomić plik docker-compose.yaml
w naszym projekcie bez konieczności konfigurowania go w application.yaml
.
Dodatkowo pojawiła się masa aktualizacji zależności, takich jak Hibernate 6.2, Mockito 5 czy Jackson 2.15.
Oprócz tego, drobne aktualizacje otrzymały również projekty takie jak:
- Spring Data (2023.0.0)
- Spring for GraphQL (wersja 1.2.0)
- Spring Security (wersja 6.1)
- Spring Authorization Server (wersja 1.1)
Zmiany zachodzące w nich są jednak nieco mniejsze, dlatego zachęcam do zerknięcia do oryginalnych Release Notes.