Spring Boot 2.5についてメモ

はじめに

今週(2020/5/20)にSpring Boot 2.5が出ましたが、どんなのが出たのかまとめて、なんとなく違いを把握おこうと思います。 基本的にはRelease Notesの内容を個人的に気になったところを少し深ぼって、自分の理解をまとめようと思うので、正確な情報は本家のブログやそれに付随する記事等をご参照ください(なるべく、情報ソースのリンクはつけます)。 ちなみに、ドキュメントに書かれた変更点を自分の理解でまとめたものなので、基本的に機能に対しては動作検証などは行っておりません。

2.4からの変更点

このブログでは以下のような変更点についてまとめます。

  • DataSourceの初期化スクリプトに対するサポートの変更
  • Actuator /infoエンドポイントがよりセキュアに
  • 環境変数のプリフィクス
  • HTTP/2 over TCP (h2c)
  • R2DBCを用いたデータ初期化
  • Docker Imageバインディングサポート
  • ActuatorのPrometheusエンドポイントでOpenMetrics形式でのリソース公開

DataSourceの初期化スクリプトに対するサポートの変更

全体を眺めていると1番メインの変更っぽいです。
schema.sqldata.sqlに関するサポートがリデザインされています。
まず1つ目としてspring.datasource.*は非推奨になりspring.sql.init.*プロパティが新しく用意されました。
SqlInitializationProperties.javaでいろいろと定義されているみたいですね。
主なものをいかにまとめようと思います。spring.sql.init.のプリフィクスの部分は省略します。

プロパティ名 説明
schemaLocations スキーマDDLスクリプトのロケーション
dataLocations データ(DMLスクリプトのロケーション
username 初期化スクリプトを事項するユーザ名。もし別途設定が必要な場合
password 初期化スクリプトを事項するパスワード。もし別途設定が必要な場合
continueOnError エラーが発生してもスクリプト継続するか否か(デフォルトfalse)

spring.datasource.*から初期化スクリプトに関わるプロパティが切り出された感じっぽいですね。
また、usernamepasswordに関しては専用のものが用意されたみたいです。

Actuator /infoエンドポイントがよりセキュアに

デフォルトではActuatorの/infoエンドポイントがデフォルトでは公開されないようになりました。
しかし、Spring Securityがクラスパスにある場合は認証が求められるようになります。

2.5からの新しい機能

環境変数のプリフィクス

この機能で、同じ環境で複数のSpring Bootアプリケーションを実行、設定を行なうことができます。
SpringApplication.setEnvironmentPrefix(…​)を利用することで、この機能を利用できます。
例えばmyappというプリフィクスを付けてアプリケーションを起動する場合は以下のようにすれば可能になります。

SpringApplication application = new SpringApplication(MyApp.class);
application.setEnvironmentPrefix("myapp");
application.run(args);

この設定を行なうことで、すべてのプロパティを環境変数で変更するためにプリフィクスをつける必要があります。
例えば、ポートを変更したい場合はMYAPP_SERVER_PORTを設定する必要があります。
ちょっと動かしてみましたが、上記の設定が行われている場合SERVER_PORTではポートの変更を行なうことはできませんでした。

HTTP/2 over TCP (h2c)

マニュアル設定は無しで、HTTP/2 over TCP (h2c)、TSLではないHTTPでのHTTP/2の利用が可能となりました。
この機能を利用するためにはserver.http2.enabled=trueを設定して、かつserver.ssl.enabled=falseに設定する必要があります。
実際の実行結果は以下のようになります。

$ curl http://localhost:8080/hello -v --http2
*   Trying 127.0.0.1:8080...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /hello HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.68.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 101 
< Connection: Upgrade
< Upgrade: h2c
< Date: Sun, 23 May 2021 08:59:28 GMT
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200 
< content-type: text/plain;charset=UTF-8
< content-length: 10
< date: Sun, 23 May 2021 08:59:28 GMT
< 
* Connection #0 to host localhost left intact
Hello, 2.5

R2DBCを用いたデータ初期化

R2DBCを通して、スクリプトベースの初期化が可能になりました。
クラスパスにschema.sqldata.sqlというスクリプトファイルがある場合は自動的に実行されるようになります。
また、JDBC同様にspring.sql.init.*プロパティを通して設定が可能です。

Docker Imageバインディングサポート

Custom Buildpacksのサポート

Custom BuildpacksがMavenでもGradleでもサポートされるようになりました。
buildpacksプロパティにディレクトリ、tar.gz、ビルダー、Dockerイメージを指定することができます。

バインディング

Mavanでも、GradleでもVolumeバインディングがサポートされました。
この機能のおかげでBuildpacksnがローカルのパスやDocker Volumeをバインドすることができます。

ActuatorのPrometheusエンドポイントでOpenMetrics形式でのリソース公開

Actuatorの/actuator/prometheusエンドポイントで通常のPrometheusの形式とOpenMetricsの形式でレスポンスを返すことが可能になってます。
application/openmetrics-text;version=1.0.0のようなヘッダーをつけることで、OpenMetricsのレスポンスを受け取ることが可能です。

Dependency Upgrades

ここに書かれるように複数の依存がアップグレードされています。