【Spring Cloud】bootstrap機能を使ってみた

Spring Cloudにbootstrapなる機能があることに気づいたので使ってみました!

モチベーション

もともとspring-cloud-configやspring-cloud-vaultといったプロパティを外部から読み込む仕組みがあることは知っていたのですが、spring-cloudが提供するソース以外の任意の外部リソースから情報が取れたらいいなと思いました。

そこでspring-cloud-configの仕組みを(読み解けないなりに)読み解くとbootstrapという機能を使っていそうだったので、bootstrapをベースに実装すれば実現できるのではないか?と思いました。

bootstrap機能とは?

実装をしながらこうではないか?と思った内容なので正確性には欠けますが、、、

Spring Bootアプリケーションの起動前に、アプリケーションの構成情報を読み込み、構成を変更することのできる機能です。

通常のSpring Bootアプリケーションでは「property読み込み」→「Bean登録」というような順でアプリケーションが起動していきますが、「property読み込み」の前の動作を変えられるということです。

bootstrap機能を使ってみる

依存を追加

bootstrap機能を使うにはspring-cloud-starterを依存に追加する必要があります。

ext {
  set('springCloudVersion', "2022.0.1")
}

dependencies {
  ...
  implementation 'org.springframework.cloud:spring-cloud-starter'
  ...
}

dependencyManagement {
  imports {
    mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
  }
}

Configurationクラスを実装

実装方法は通常のSpringBootアプリケーションと同じです。

ここではサンプルとして、systemプロパティにsample.password=12345678を登録するような実装にしてみます。

package hirabay.bootstrap;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;

@Slf4j
@Configuration
public class SystemPropertyBootstrapAutoConfiguration {
    public SystemPropertyBootstrapAutoConfiguration() {
        System.setProperty("sample.password", "12345678");
        log.info("set sample.password");
    }
}

メモ
おそらくこの実装はspring-cloudの利用方法としてベストな方法ではないです。
(spring-cloud-configとかもっと複雑な仕組みでconfig設定していますからね。。。)
ただ、誰でもある程度動作を追えるという意味でこの記事ではコンストラクタ内でプロパティを設定する実装例を紹介しています。

通常のアプリケーションと違うのは、このConfigurationクラスを「spring.factories」ファイルに設定をする必要がある点です。以下のように設定します。

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
hirabay.bootstrap.SystemPropertyBootstrapAutoConfiguration

動作確認

この状態でSpringBootアプリケーションを起動すると、、、

バナーよりも先に先ほど仕込んだログが表示されています!

2023-03-12T23:55:20.887+09:00  INFO 67112 --- [           main] SystemPropertyBootstrapAutoConfiguration : set sample.password

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.0.2)

つまり、application.yamlや環境変数を設定せずとも以下のプロパティを設定したのと同じ状態でアプリケーションの起動ができるということです!

sample:
  password: 12345678

bootstrap用のプロパティを用意する

bootstrap機能では通常application.yamlやapplication.propertiesで定義するプロパティをbootstrap.yamlbootstrap.propertiesに記載します。

例えば、こんなConfigurationPropertiesクラスに情報を詰めたい場合は、

@Data
@ConfigurationProperties("boostrap.sample")
public class SampleProperties {
    private String key;
}

bootstrap.yamlの以下のように記述します(記述方法は一緒。ファイル名が違うだけ。)

boostrap:
  sample:
    key: value

コメントを残す

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