springboot 2.5がGAとなりました
Release Noteを参考に2.4系から2.5系への移行方法をまとめてみます
自分が移行するときに関係のあるものや興味があるものが中心となりますがご容赦ください🙇♂️
関連記事はこちら
SpringBoot Updateまとめ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の生成を無効化したい場合
jar {
enabled = false
}
// bootJarの生成を無効化したい場合
bootJar {
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 {
...
// 1. spring-boot-starter-aopを依存に追加
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 {
// TimedAspectをBean登録
@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を付与
@Timed(value = "sql.time")
@Select("SELECT * FROM USER WHERE id = #{id}")
Optional<User> findById(String id);
}
Java 16 / Gradle 7 Support
Java 16とGradle 7がそれぞれサポートされています。