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をトリガーにしたプロパティ更新が可能になる、という仕組みらしい。