spring boot 2.2 to 2.3 メモ

## 概要

- SpringBoot2.3がGAとなった
- [Release Note](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes)を参考に2.2系から2.3系へのアップグレードで関わりのあるものをまとめてみた

## Changes to minimum requirements

対応するGradleのバージョンは以下の２パターン

- 5.6.x
- 6.3 or later

以下のコマンドでgradleをアップグレード

```bash:6.5へのアップグレードの例
./gradlew wrapper --gradle-version 6.5
```

対応していないバージョンでbuildを実行すると以下のようなエラーが発生する

> Spring Boot plugin requires Gradle 5 (5.6.x only) or Gradle 6 (6.3 or later). The current version is Gradle 6.0

## Build OCI images with Cloud Native Buildpacks

Docker imageを作成できるようになっている

特にカスタマイズが不要であれば以下のコマンドで作成可能！

```
./gradlew bootBuildImage
```

カスタマイズが必要な場合は[こちら](https://docs.spring.io/spring-boot/docs/2.3.0.RELEASE/maven-plugin/reference/html/#build-image)を参考に


## Validation Starter no longer included in web starters

- `javax.validation.*`がデフォルトでは使えなくなるとのこと。  
- →利用する場合は依存に追加が必要

```xml:pom.xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
```

```groovy:build.gradle
dependencies {
  ...
  implementation 'org.springframework.boot:spring-boot-starter-validation'
}
```

## Configuration properties

- property名がいくつか変わっているとのこと
- `spring-boot-properties-migrator`を入れておくと起動時に非推奨なプロパティを見つけてくれて、かつ一時的に読み替えも行ってくれるらしい
- ただし、「プロパティの移行が完了したら依存から削除してね」とのこと

```xml:pom.xml
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-properties-migrator</artifactId>
	<scope>runtime</scope>
</dependency>
```

```build.gradle
runtime("org.springframework.boot:spring-boot-properties-migrator")
```

## Graceful shutdown

- デフォルトで対応するようになったらしい…！
- 設定するプロパティは以下の２つ

プロパティ | サンプル | 説明
------- | ------- | ---
server.shutdown | graceful | gracefulを指定するとシャットダウン時に以下の動作をする<br>- 新規リクエストを受け付けない<br>- 受け付け中のリクエストの処理が終わるまで待機
spring.lifecycle.timeout-per-shutdown-phase | 20s | 最大待機時間

本家ドキュメントは[こちら](https://docs.spring.io/spring-boot/docs/2.3.0.RELEASE/reference/html/spring-boot-features.html#boot-features-graceful-shutdown)

## Liveness and Readiness probes

- `management.health.probes.enabled=true`を設定することで以下の２エンドポイントが有効になる
  - `/actuator/health/liveness`：アプリケーションが正常稼働しているかどうか
  - `/actuator/health/readiness`：リクエスト受付可能な状態かどうか
- kubernetesで稼働している場合にはデフォルトで有効

Kubernetesでのliveness,readinessの動作は以下の通り

- liveness: 一定時間DOWNが続いた場合、podが再起動される
- readiness: UPの状態になるとingressからリクエストが割り振られるようになる

参考

- [Spring Blog](https://spring.io/blog/2020/03/25/liveness-and-readiness-probes-with-spring-boot)
- [Baeldung](https://www.baeldung.com/spring-liveness-readiness-probes)

### 状態を取得する

ApplicationAvailabilityから取得する。

```Java
@RequiredArgsConstructor
public class Sample {
    private final ApplicationAvailability applicationAvailability;
    
    // livenessの状態を取得（CORRECT/BROKEN）
    public LivenessState getLivenessState() {
        return applicationAvailability.getLivenessState();
    }

    // readinessの状態を取得（ACCEPTING_TRAFFIC/REFUSING_TRAFFIC）
    public ReadinessState getReadinessState() {
        return applicationAvailability.getReadinessState();
    }
}
```

### 状態を変更する

AvailabilityChangeEventで変更する

```Java
@RequiredArgsConstructor
public class Sample {
    private final ApplicationEventPublisher eventPublisher;
    
    // livenessの状態を変更（CORRECT/BROKEN）
    public void changeLivenessState() {
        // UPに
        AvailabilityChangeEvent.publish(eventPublisher, "event source.", LivenessState.CORRECT);
        // DOWNに
        AvailabilityChangeEvent.publish(eventPublisher, "event source.", LivenessState.BROKEN);
    }

    // readinessの状態を変更（ACCEPTING_TRAFFIC/REFUSING_TRAFFIC）
    public void getReadinessState() {
        // UPに
        AvailabilityChangeEvent.publish(eventPublisher, "event source.", ReadinessState.ACCEPTING_TRAFFIC);
        // DOWNに
        AvailabilityChangeEvent.publish(eventPublisher, "event source.", ReadinessState.REFUSING_TRAFFIC);
    }
}
```

- `"event source."`には任意のオブジェクトを設定する

## SpringBoot 2.2のメモ

2.1 to 2.2を整理していないので、直面した課題ベースでこちらに🙇‍♂️

#### Tomcat’s MBean Registry

Tomcatのスレッド数等のメトリクス出力がデフォルトで無効になったようです。
有効にするためには以下のようにpropertyの設定が必要です。

```yaml:application.yml
server:
  tomcat:
    mbeanregistry:
      enabled: true
```

なぜ、デフォルトで無効になったかというと
2MBほどのヒープ節約が見込まれるようです