kagamihogeの日記

kagamihogeの日記です。

Spring Cloud Config + Spring Cloud Busでプロパティ自動更新

http://kagamihoge.hatenablog.com/entry/2020/02/14/091501 ではSpring Cloud Configを試した。問題点としてプロパティの更新がある。/actuator/refreshで1つのclientのリフレッシュは出来るが、100個あったら100回送信しなければならない。その解決方法について。

なおソースコードhttp://kagamihoge.hatenablog.com/entry/2020/02/14/091501 をベースにしているので、適宜参照のこと。

RabbitMQ経由でclientからclientに更新通知

あるclientにPOSTでリフレッシュ要求を送信すると、RabbigMQを介して別のclientに対してリフレッシュ要求が送信される。これを実現するためにSpring Cloud Busを使用する。

clientのbuild.gradleに依存性を追加する。

   implementation 'org.springframework.cloud:spring-cloud-starter-bus-amqp'

clientのプロパティファイルを修正する。RabbitMQの接続設定を追加。actuatorのエンドポイントを全部開放しておく。

management.endpoints.web.exposure.include=*

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

RabbigMQを起動する。

docker pull rabbitmq:3-management
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

この状態で、gitにプロパティファイルを適当に編集してpushしたあと、http://localhost:8080/actuator/bus-refresh にPOSTする。なお、動作を確認するにはclientを2つ以上立ち上げておくと良い。片方のclientの/actuator/bus-refreshをすると、もう片方のclientでも更新後のプロパティが参照できる。

RabbitMQ経由でserverからclientに更新通知

次に、serverの変更をRabbitMQ経由でclientに通知する方法。serverのリフレッシュ通知エンドポイントを叩くと、RabbitMQを介してclientに更新通知が行く、という仕組み。これの実現には、6. Push Notifications and Spring Cloud Busという、spring-cloud-config-monitorとSpring Cloud Busの組み合わせで行う。

severに依存性を追加する。

   implementation 'org.springframework.cloud:spring-cloud-config-monitor'
    implementation 'org.springframework.cloud:spring-cloud-starter-stream-rabbit'

severのプロパティファイルにRabbigMQの設定を追加する。

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

この状態で、gitにプロパティファイルを適当に編集してpushしたあと、http://localhost:8888/monitor に以下のJSONをPOSTする。

{"path": "sample"}

とりあえず動かしたいならpath*でも良い。デフォルトではアプリケーション名(spring.application.name)にマッチするみたい。

以上で、git push後にserverの http://localhost:8888/monitor にPOSTすればclientに更新が行く仕組みができる。

webhookで/monitorを叩く

これは実際に試してないけど。webhookでプロパティファイル更新をフックして/monitorを叩けば、gitをトリガーにしたプロパティ更新が可能になる、という仕組みらしい。

参考