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-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.yaml
やbootstrap.properties
に記載します。
例えば、こんなConfigurationPropertiesクラスに情報を詰めたい場合は、
@Data
@ConfigurationProperties("boostrap.sample")
public class SampleProperties {
private String key;
}
bootstrap.yaml
の以下のように記述します(記述方法は一緒。ファイル名が違うだけ。)
boostrap:
sample:
key: value