概要
springboot 2.5がGAとなりました
Release Noteを参考に2.4系から2.5系への移行方法をまとめてみます
自分が移行するときに関係のあるものや興味があるものが中心となりますがご容赦ください🙇♂️
過去の記事はこちら
Minimum Requirements Changes
対応するGradleのバージョンが6.8以降
となりました。
投稿時点の最新バージョン7.0.2
へのアップデートコマンドは以下のようになります。
./gradlew wrapper --gradle-version 7.0.2
Gradle Default jar and war Tasks
jar
, war
タスクがデフォルトで有効になります。
そして、bootJarの生成したjarファイルと衝突しないようjar
, war
タスクで生成されるファイルに「-plain」が付与されます。
以下Tipsです
-plain
を取り除く
archiveClassifier
で空文字を指定してあげればOK
※Release noteではclassifier
が紹介されていますが、非推奨となっていました…
archivesBaseName = 'sample'
bootJar {
archiveClassifier = 'boot'
}
jar {
archiveClassifier = ''
}
このような設定だと、以下のように2つのjarファイルが生成されます。
build
...
├── libs
│ ├── sample-boot.jar
│ └── sample.jar
...
enabled
で無効化する
enabled = false
を設定するとjarの生成を無効化することができます
jar {
enabled = false
}
Environment Variable Prefixes
環境変数にprefixを付与することができるようになるようです。
prefixを付与するにはmainクラスを以下のように記述します。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.setEnvironmentPrefix("prefix");
application.run(args);
}
}
この状態で、以下のようにするとserver.port
を変更してアプリケーションを起動できます
PREFIX_SERVER_PORT=8081 ./gradlew bootRun
当然
SERVER_PORT
では変更ができなくなるので、既存システムにこの変更を入れるメリットはないかなぁ
OpenMetrics for Prometheus
/actuator/prometheus
を叩くときにHeaderを設定することでOpenMetrics形式のレスポンスが返るようになりました。
デフォルトはprometheus形式で、Acceptヘッダーにapplication/openmetrics-text
を載せるとOpenMetrics形式になります。
curl http://localhost:8080/actuator/prometheus -H 'Accept: application/openmetrics-text'
Metrics for Spring Data Repositories
Spring Data repositoriesのメトリクスがデフォルトで収集されるようになります!✨
以下のJPAだと
public interface UserRepository extends CrudRepository<User, String> {
Optional<User> findById(String id);
}
こんなメトリクスが取得できます。
# HELP spring_data_repository_invocations_seconds_max
# TYPE spring_data_repository_invocations_seconds_max gauge
spring_data_repository_invocations_seconds_max{exception="None",method="findById",repository="UserRepository",state="SUCCESS",} 0.03175074
# HELP spring_data_repository_invocations_seconds
# TYPE spring_data_repository_invocations_seconds summary
spring_data_repository_invocations_seconds_count{exception="None",method="findById",repository="UserRepository",state="SUCCESS",} 1.0
spring_data_repository_invocations_seconds_sum{exception="None",method="findById",repository="UserRepository",state="SUCCESS",} 0.03175074
application.yml
で以下の設定が可能。
management:
endpoints:
web:
exposure:
include: "prometheus"
metrics:
data:
repository:
autotime:
# 自動でメトリクスを収集するかどうか?
# falseを指定すると個別に「@Timed」アノテーションの付与が必要
enabled: true
# パーセンタイルも取得する
percentiles: 0.5,0.99
# メトリクス名を指定する
metric-name: "spring.data.repository.invocations"
補足: @Timed
アノテーション
@Timed
アノテーションを使用すると、任意のメソッドでメトリクス計測ができる…!
使い方は
- spring-boot-starter-aopを依存に加えて
-
TimedAspect
をBean登録し - メトリクスを取りたいメソッドに
@Timed
を付与する
だけ!便利すぎ!
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-aop'
...
}
import io.micrometer.core.aop.TimedAspect;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfiguration {
@Bean
public TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
}
import io.micrometer.core.annotation.Timed;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.Optional;
@Mapper
public interface UserRepository {
@Timed(value = "sql.time")
@Select("SELECT * FROM USER WHERE id = #{id}")
Optional<User> findById(String id);
}
こんな感じでJPAを使用していなくても、例えばMybatisのMapperの実行時間をメトリクスに落とすことができます
参考:
Java 16 / Gradle 7 Support
Java 16とGradle 7がそれぞれサポートされています。
その他参考リンク
▼Spring Boot 2.5 Configuration Changelog
▼非推奨なpropertyを使用していたらビルドを失敗させる