Spring Framework 6: Infrastructure Themes
キーノートのレポートで言及した、Juergen Hoeller氏の個別セッションの内容を紹介します。
本セッションでは始めにJDKとSpringのリリースタイミングが改めて示されました。
これによればSpring 6.1は、具体的にはJDKの次のLTSリリースであるJDK 21のリリースの後、2023年11月にリリース予定のようです。
次に、Spring 6におけるJDK 17+、JakaraEE 9+というベースラインにも改めて触れつつ、本セッションで時間を割いて述べられた、Ahead-Of-Time(AOT)とVirtual Threadsに話題が移っていきます。
AOTに関しては、起動時間の短縮やメモリフットプリントの削減といった、昨今のJavaアプリケーションの実行の際に考慮されることが多い課題に対して、Springが取り組んでいるGraalVM上でのNative Image実行に関する内容や、OpenJDKで同様の課題を扱いStatic Imageでの実行を目指すProject Leyden、GraalVMとOpenJDKの技術的合流を目指すProject Galahadなどが紹介されました。一方で、これらとは異なり、JVMのスナップショットの作成と、スナップショットからリストアして実行できるようにすることを目的とするOpenJDKのProject CRaCにも言及がありました。これが実現すれば、ウォームアップされたHotspots JVMのスナップショットを作成し、そこから起動することによって、起動時間の短縮が見込まれます。これらはいずれも活動中のものですが、Javaアプリケーションの共通課題に対して、Javaプラットフォームが一丸となって取り組んでいることが分かる、印象深い内容でした。
OpenJDKのProject Loomで議論されているVirtual Threadsについては、現在はプレビュー段階であるものの、これを利用することで、Spring MVCにおいても高いスケーラビリティを得られる見通しであることが語られました。Virtual Threadsの出現によって、高いスケーラビリティが必要な際の選択肢には、Reactive Programmingだけではなく、Virtual Threadsを使用した命令的なプログラミングスタイルが加わることになります。これについてReactive Programmingのメリットはスケーラビリティよりはむしろ、ストリームベースで記述できることにある、との見解が示されました。
Juergen Hoeller氏は最後に、本セッションで紹介したJVMを含む今後のインフラ改善の恩恵を受けるため、各自のペースでSpring Framework 6.0へのアップグレードを行ってほしいと述べ、セッションを締めくくりました。
Interface Client in Spring
Spring Framework 6に関するテーマの多くはJuergen Hoeller氏のセッションで取り上げられた一方で、Spring Framework 6.0で導入された新しいインタフェースクライアント機能については個別のセッションが用意されていました。
ここでいうインタフェースクライアント、あるいは宣言的クライアントとは、専用のアノテーションを付与したJavaのインタフェースから自動的に生成される、サービスに対するクライアントを指します。セッション中で紹介された例を挙げると、Spring Framework 6.0で導入された@PostExchangeアノテーションを使用することで、以下のインタフェースからHTTPクライアントを自動的に生成することができます。
こうしたインタフェースクライアント機能は、SpringユーザにとってはSpring Cloud OpenFeignを介して利用することの多い、OpenFeignが備えているものと同種のものです。
Spring Cloud OpenFeignの開発に携わるOlga Maciaszek-Sharma氏はセッションの中で、同プロダクトの強力さと人気について述べた一方、問題点も指摘しました。特にノンブロッキングAPIをサポートしていないことを最大の問題として挙げ、これを解消するためにSpring Cloud Squareという実験的なプロジェクトにも取り組んできたと言います。
そのような状況の中、Rossen Stoyanchev氏らSpring Frameworkチームはブロッキング・ノンブロッキングの両方に対応する新たなインタフェースクライアント機能をコアのフレームワークに取り込むことに決めたそうです。
その上でAPIについて再考した結果、サーバとクライアントのリクエストの扱い方の違いから、@RequestMappingを再利用するのではなく@HttpExchangeや@RSocketExchangeという別のアノテーションを新規に導入するという結論に至ったとのことでした。
セッションの終盤には簡単なデモが披露され、その中でSpring Cloud LoadBalancerとの連携についても紹介されていました。実際の利用方法に興味がある方は動画を見てみると良いと思います。