Spring Boot 2系のOSS版サポート終了を、モダンなアプリ開発環境を手に入れる“絶好のチャンス”とするための選択肢とは:「最高の開発者体験」の実現に向けて
JavaとSpring Bootの進化は止まらない。Spring Boot 2系のOSS版サポート終了を、モダンなアプリケーション開発・運用を加速する“絶好のチャンス”として生かすにはどうすればよいのか。その決断をするのは今だ。
人気開発フレームワークのOSS版サポートが終了、その後はどうする?
Javaアプリケーションの開発フレームワークである「Spring Boot」の2.7.x(2系の最終マイナーバージョン)が、2023年11月24日にOSS(オープンソースソフトウェア)版サポートを終了する。ユーザーは、3.1.xあるいは(2023年11月23日リリース予定の)3.2.xにバージョンアップするか、商用サポートサービス「VMware Spring Runtime」で約2年間の延長サポートを受けるか、早急に決断する必要がある。
Javaは1996年に登場してから現在に至るまで、不動の人気を誇る開発言語だ。「時代遅れなのでは」というイメージを持つ人もいるようだが、各種の人気開発言語ランキングを見れば、そうした考えが間違いであることはすぐに分かる。
エンタープライズ企業のみならず、ネット系企業においても、先進的な取り組みを続ける数多くの企業で、Javaは積極的に採用されている。もちろん、大規模システムの開発に向いているという側面もあるが、既存資産を生かしつつ、最先端技術を取り入れた開発が容易にできるSpring Bootの存在も大きい(Spring BootはJavaの開発フレームワーク「Spring Framework」をさらに使いやすくしたものなので、前提としてSpring Frameworkの人気がある)。
なぜ、Spring Bootは愛され、広く使われているのか。どこまで進化しているのか。最新バージョンにアップデートすることで、どんなメリットが期待できるのか。
こうした疑問について、Spring BootとSpring Frameworkの長年の愛用者であるヴイエムウェアの槙 俊明氏(VMware Tanzu Labs シニアスタッフクラウドネイティブアーキテクト)と、渡辺 隆氏(マーケティング本部 チーフストラテジスト)に話を伺った。
過去の積み重ねを継承しながら新技術にも対応
Spring Frameworkが登場したのは20年以上前で、Javaはまだ1.4だったころだ。その後、メジャーバージョンアップを重ね、2023年11月15日には6.1.xがリリースされる。
アプリケーション開発シーンが変遷し、新興の開発フレームワークが出ては消えていく中、今でもJavaコミュニティーから愛されるSpring Frameworkの魅力は何なのか。
約15年前からSpring Frameworkを使い続け、現在も熱烈なユーザーである槙氏は、その魅力を「メジャーバージョンアップを重ねても互換性を大切にしつつ、開発者がロジックに集中できることを哲学に、インフラストラクチャの抽象化などを進めてきたこと」と断言する。事実、機能は当初より大幅に追加、拡充されているが、コアとなるプログラミングモデルは変わらない。古いバージョンでの開発経験があれば、最新バージョンも問題なく使いこなせるという。
常に最新の技術動向に追従し、ユーザーの声に耳を傾けながら着々と対応しているところが、Spring Frameworkの特に大きな魅力だと槙氏は言う。REST、WebSocket、NoSQL、HTTP/2に始まり、クラウド、マイクロサービス、関数型プログラミングモデル、リアクティブプログラミング、Docker、Kubernetes、GraphQL、オブザーバビリティ、ネイティブイメージ化と、「Springの新機能を学ぶだけで、WebあるいはITのモダンな技術やニーズを学ぶことができる」(槙氏)。
急速に注目を集めている生成AI(人工知能)についても、「Spring AI」というプロジェクトが始動している。「LangChain」や「LlamaIndex」などのフレームワークにインスパイアされた同プロジェクトは、各種の大規模言語モデル(LLM)をHTTP経由で活用、組み合わせながらアプリケーションを開発できる。「AIアプリケーション開発が一気に身近になってワクワクしている」と槙氏は述べる。
Spring Bootが変えたJavaアプリケーション開発
ただし、Spring Frameworkは高機能ゆえの複雑さがあり、とっつきにくいという印象があった。アプリケーションサーバをセットアップして、IDE(統合開発環境)連携後に起動、アプリケーションをデプロイするといった流れの中で、最低限動かすためにやるべき設定が多い。どのライブラリの、どのバージョンを組み合わせて、どの設定を書けば動くのかについては試行錯誤を繰り返す必要もある。
「エンタープライズ開発では“儀式”と割り切る開発者がほとんどだが、新規ユーザーやライトな言語ユーザーにとっては苦痛で、最初のセットアップで挫折する人も多かった」(槙氏)
そうしたユーザーの声に応えて2014年に登場したのがSpring Bootだ。アプリケーションにWebサーバが組み込まれているため、Javaのプログラムを起動するだけでWebアプリケーションが立ち上がる。ライブラリについても、フレームワーク側で使用しているものを検知し、自動で推奨設定を有効にするため、その機能を使うためのセットアップも不要だ。
堅牢(けんろう)なJavaアプリケーションを手軽に開発できる、というメリットにいち早く気付いた先進企業は、次々とSpring Bootを採用した。
渡辺氏によると、VMwareが2021年春に実施した調査では、2021年11月の単月のSpring Bootダウンロード数は2億4000万で、Spring Bootを自社の主要な開発プラットフォームとして採用していると回答した組織は61%。また、62%はSpring環境でKubernetesを利用していると回答したという。
「Javaが人気のプログラミング言語の上位にランクインし続けているのは、開発者がアプリケーションロジックに集中できるようにするSpring Bootの功績によるところが大きいと思われる」(槙氏)
OSS版サポート終了後はVMware Spring Runtimeで商用サポート可能
Spring Bootは、2023年11月24日にバージョン2.7.x/3.0.xのOSS版サポートが終了する。その後は、コミュニティーによるセキュリティアップデートやバグフィックスが提供されなくなる。最も導入されているバージョン2.7.xは、当初よりもサポート期間が延長されてはいるものの、2023年11月にサポートが終了することに変わりはない。
そうはいっても、即座にバージョンアップするということにはならないのが現実だ。VMwareでも、簡単にバージョンアップできない状況は理解していると渡辺氏は述べる。
2022年の同社調査によると、バージョンアップしない理由で最も多かったのは「現在の環境が問題なく機能しているから」だった。これまで大きな脆弱(ぜいじゃく)性が見つかっていないことも、こうした判断の背景にあるかもしれないと渡辺氏は言う。
槙氏は予算の都合もあると推測する。
「一度リリースしたプロジェクトはメンテナンスモードに入るので、追加開発には新規予算を確保しなければならない場合がある。アプリケーションを新バージョンにそのまま移行しても動くが、それでも本番環境であることを考えると多少の変更や調整は必須。その予算で腰が上がらないのかもしれない」(槙氏)
だが、脆弱な状態のまま運用するのは問題が多い。それ以上に、全てのJavaアプリケーション開発者が注目すべき新機能(後述)を搭載した「Java 21」への対応も考えると、生成AIなど新しい技術を取り込んだ、モダンなJavaアプリケーションを開発する機会をみすみす逃すことになる。
その点を理解し、“時間稼ぎしつつバージョンアップを進めるため”か、「従来のSpring Bootのサポート終了のタイミングと比べて、システムインテグレーターからの商用サポートに関する問い合わせも非常に多い」と渡辺氏は明かす。「アジア太平洋地域の中でも、日本での問い合わせが圧倒的に多い。バージョンアップを見据えて各方面が動き出しているのを感じる」(渡辺氏)
「VMware Spring Runtime」という名称でVMwareが提供する商用サポートは、Spring Boot 2.7.xの場合2025年8月24日、Spring Boot 3.0.xは2025年2月24日までが適用期間。新バージョンで何ができるのか、バージョンアップでどのような調整が必要なのかを検証するには十分な期間だ。
余談だが、Spring FrameworkはもともとSpringSourceが開発していたが、同社をVMwareが買収。その後一度はPivotal Softwareとして独立したが、再度VMwareが買収したといういきさつがある。つまり、Springを現在開発しているのはVMwareであり、VMware Spring Runtimeでは“本家”によるサポートが受けられるという安心感がある。
Spring Boot 3.2.xとJava 21で得られる2大メリットとは
Spring Bootの最新版である3.2.xでは、2023年9月にリリースされたJava 21を正式にサポートする。この2つを組み合わせることで、全てのJavaアプリケーション開発者にとってうれしい最新機能を活用できる。特にインパクトが大きい機能が2つある。
1つ目は「仮想スレッド」(Project Loom)だ。「ゲームチェンジャーになり得る」と槙氏が断言する同機能は、JVM(Java仮想マシン)レベルで管理される軽量なスレッドで、スループットを大幅に改善し、1つのアプリケーションが処理できる数を数千あるいは数百万単位に増やすことができる。
通常、JavaのスレッドはOSのスレッドとひも付けられるため、スレッドの生成コストは大きく、メモリ使用量も大きくなる。同時に処理できるリクエスト数もOSのリソースに依存し、200〜300程度が一般的と槙氏は説明する。「Tomcat」のようなアプリケーションサーバの場合は、1つのHTTPリクエストを1つのスレッドで処理するため、ブロッキングAPIではI/O待ち時間が発生すると、CPUはその間、何もせずに無駄な時間を過ごすことになる。
「この課題は、『Netty』のような非同期イベント駆動型ネットワーキングフレームワークを使ってノンブロッキングコードを書くことで解決できる。Spring Bootの2.xでも、Nettyをベースとした『Spring WebFlux』が導入され、従来のSpringコードと同様にノンブロッキングコードが扱えるようになっている」(槙氏)
だが、この考え方を理解し、実践するにはリアクティブプログラミングを使いこなすなどの相当なエンジニアスキルが求められる。そのため、スケールアウトしたり、リソースを増やしたりすることで対処するケースが多々あった。
この問題がJava 21で正式に導入された仮想スレッドで解消される。Spring Boot 3.2でJava 21を有効にすれば、プロパティを1つ設定するだけで、下回りで仮想スレッドのオン/オフが指定できるようになる。開発者が仮想スレッドのAPIの使い方を意識することなく、簡単にスループットの改善が期待できる。
2つ目は「CheckPoint Restore」機能だ。Java/Springアプリケーションでよく指摘されるのが、他言語と比べてアプリケーションの起動時間が遅くなりがちな点。その解決のため、ネイティブイメージ化という対応策が生まれた。多言語対応の実行環境である「GraalVM」を使い、Javaアプリケーションを実行可能なバイナリにコンパイルして、起動時間をミリ秒オーダーに改善できる。Spring Framework 6およびSpring Boot 3ではこれに対応したものの、今度は数秒程度だったコンパイル時間が数分単位に延びてしまうという課題が生じた。
そこで救世主となるのが、OpenJDK Projectの「Coordinated Restore at Checkpoint」(CRaC)だ。CRaCはJava 21の機能ではないが、起動中のアプリケーションのスナップショット(チェックポイント)を取っておき、次の起動時はそのスナップショットを使うことで、ミリ秒単位での立ち上げを実現する。
「現状では一部のJDKでしか使えず、Linux限定という課題はあるが、スナップショットを取ってシリアライズ化するときのルールを開発者側で意識することなく、フレームワークレベルで対応するだけで、起動時間を大幅に短縮できるのは、この課題に悩んできた開発者にとってうれしいアップデートになる。Spring Boot 3.2では初期サポートという位置付けであるが、今後改善されることは間違いない。また、現在実験段階ではあるが、JVMの起動時間などを速めるOpenJDK ProjectであるProject LeydenとSpring AOT(事前コンパイル)の機能を活用し、起動時間を短縮する取り組みも行っている。これが進めば将来的にはCRaCさえ使用せず、制約の少ないJVMでの高速な起動が期待できる」(槙氏)
脆弱性対応をトリガーにバージョンアップするのは、Spring Bootに限ってはもったいない選択肢だ。むしろ、先進的な技術を取り入れたモダンなJavaアプリケーション開発環境を構築して、どんどん使い倒したい。商用サポートをうまく活用しながら、より多くの開発者に最高の開発体験を手に入れてほしい。槙氏と渡辺氏はそう口をそろえた。
提供:ヴイエムウェア株式会社
アイティメディア営業企画/制作:@IT 編集部/掲載内容有効期限:2023年11月10日
Copyright © ITmedia, Inc. All Rights Reserved.