SpringBootユーザー必見!各バージョンのサポート期限まとめ
サーバ OS やミドルウェアに比べると、影響範囲が大きいのがアプリケーションサーバのバージョンアップ。
もちろん前者も大きいのですが、動作検証のしやすさの意味ではハードルが低いのかなと思っています。
例えば、JVM 言語系のアプリケーション(kotlin, scala など)だと、実行環境が揃った docker イメージがたくさんありますしね。
しかし自前のアプリケーションは、フレームワークバージョンに依存して各種ライブラリのバージョンも限定されたりする傾向が・・・。
今回は、SpringBoot のアップグレードに向けて各バージョンの特徴を調べてみたので紹介します。
SpringBootのロードマップ
SpringBoot のロードマップは以下のページで紹介されています。
2023 年 9 月現在の最新バージョンは 3.1.4 で、各サポートのバージョン範囲は以下の通り。
2023 年中には 3.x 系へのメジャーバージョンアップが催促されているような状況です。
有償サポートで逃げる手段もありますが、それでも有効期限があることに変わりありません。
OSS support: 2.7.x, 3.0.x, 3.1.x
Commercial support: 2.6.x, 2.7.x, 3.0.x, 3.1.x
Future release: 3.2.x
SpringBootのアップグレードでハマったこと
これまでに何度か、SpringBoot のアップグレード対応に携わりましたが、できれば片手間にはやりたくないところ。
利用しているライブラリに大きく依存しますが、アプリケーションの大きな改修を迫られるケースももちろんあります。
ちなみに、各バージョンのリリースノートは以下のページを参考にしておくといいですね。
既にサポートが終了しているバージョンのリリースノートも残されているので助かります。
サポートされなくなったMediaType
コントローラ周りで使う機会の多い「org.springframework.http.MediaType」
MediaType で deprecated になったものを使っていると変更を余儀なくされます。
deprecated だからまだ経過措置がありますが、影響度が小さいなら早めに対処しておきたいですね。
‘APPLICATION_JSON_UTF8: MediaType’ is deprecated. Deprecated in Java
MediaType のソースコードも確認しておきますか。
1@Deprecated
2public static final MediaType APPLICATION_JSON_UTF8;
3
4@Deprecated
5public static final String APPLICATION_JSON_UTF8_VALUE = "application/json;charset=UTF-8";
6
7public static final MediaType APPLICATION_JSON;
8
9public static final String APPLICATION_JSON_VALUE = "application/json";
スレッド周りの設定
Tomcat のスレッド周りの設定が移動したようです。
The configuration properties for configuring the threads used by embedded Servlet web servers (Jetty, Tomcat, and Undertow) have moved to dedicated threads groups.
組み込みサーブレット Web サーバー (Jetty、Tomcat、および Undertow) によって使用されるスレッドを構成するための構成プロパティは、専用のスレッドグループに移動されました。
ワーカースレッドの最大量や最小量を明示的に指定している場合は調整が必要ですね。
Tomcat の場合はこの辺りのパラメータでしょうか。
server.tomcat.threads.max
server.tomcat.threads.min-spare
必要に応じて application.yaml を調整しておきましょう。
1server:
2 tomcat:
3 max-threads: xx
Graceful shutdown
Graceful shutdown がサポートされたことにより、server.shutdown のプロパティ追加が必要になるケースがある。
application.yaml に追加しておく。
1server:
2 shutdown: graceful
UnitTest
JUnit の一部のテストコードに「NestedTestConfiguration」のアノテーションが必要になった。
1import org.springframework.test.context.NestedTestConfiguration
2
3@NestedTestConfiguration(NestedTestConfiguration.EnclosingConfiguration.OVERRIDE)
4inner class XXXXXX {
5 //
6}
Swaggerの生成ライブラリ
springfox-swagger から springdoc-openapi に乗り換えないといけない。
プロジェクトの規模が大きい場合や、マイクロサービス化していてプロジェクトの数が多い場合は大変。
また、swagger のファイルからモデルなどコード生成している場合は、そちらの影響範囲も確認する必要があります。
OpenAPI Generator とかね・・・
まとめ
SpringBoot のアップグレードについて紹介してきました。
最近はバージョン更新のライフサイクルが早く、バージョンに追従するのが大変なものも多いです。
AWS の EKS とかもそうですね。
ボタン 1 つで依存関係すべてをキレイにやってくれればいいのですが、サードパーティーのライブラリなどがあると簡単にはいかないのが現実。
アプリケーションエンジニアだと、コーディングに注力している機会が多いと思いますが、日頃から SRE 的な意識も強く持っておきたいですね。
(SprintBoot が SRE の領域なのかどうかは別として)