SpringBoot 2.4 to 2.5 メモ

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

jarwarタスクがデフォルトで有効になります。

そして、bootJarの生成したjarファイルと衝突しないようjarwarタスクで生成されるファイルに「-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アノテーションを使用すると、任意のメソッドでメトリクス計測ができる…!

使い方は

  1. spring-boot-starter-aopを依存に加えて
  2. TimedAspectをBean登録し
  3. メトリクスを取りたいメソッドに@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がそれぞれサポートされています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です