SIerだけど技術やりたいブログ

5年目のSIerのブログです

SpringCloudBusで簡単にConfigの更新をアプリにブロードキャストする

以下のエントリの続き。
kimulla.hatenablog.com

SpringCloudBusとは?

メッセージングサービス(AMQP)を利用して、アプリケーション内に色々な情報をブロードキャストするためのプロダクト。

具体例

SpringCloudConfigを利用しているときを例にとって説明すると…

導入前

gitサーバの設定ファイルの変化を各アプリに反映するためには、各appの/refreshにPOSTしてrefreshScopeのBeanを作り直す必要がある。
ということは、アプリのインスタンスが100コあった場合は、それぞれのサーバに対して100回POSTする必要がある。

導入後

SpringCloudBusを利用すると、どっかのサーバに1回だけ/bus/refreshにPOSTすればrefreshScopeのBeanを作り直すように各アプリへブロードキャストされる。
アプリのインスタンスが100コあったとしても楽。

https://www.slideshare.net/mobile/tsuyo/ss-47021186/15

実装方法

依存性をpom.xmlに設定する。
(SpringCloudConfig使う場合はspring-cloud-starter-configも追加する)

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>


AMQPの設定をapplicaiton.propertiesに設定する。
(spring.rabbitmq.hostは、rabbitMQが動いているホスト名orIPアドレスに変更する。)

spring.rabbitmq.host=mybroker.com
spring.rabbitmq.port=5672
spring.rabbitmq.username=user
spring.rabbitmq.password=secret


AMQPを起動する。(自分はdockerで起動した。)

docker run -p 5672:5672 -e RABBITMQ_DEFAULT_USER=user -e RABBVITMQ_DEFAULT_PASS=secret rabbitmq:3


/bus/refreshにPOSTすれば各appにもrefreshScopeのBeanを再度生成するようにメッセージがブロードキャストされて、configサーバの設定が反映される。

サービスを絞りたい場合

今のままだと同じAMQPにつながっている全てのサービスにブロードキャストされてしまう。
ブロードキャストするサービスを絞りたい場合は、"/bus/refresh?destination=xxx:**"
とPOSTするときにdestinationパラメータを付ければいいらしい。destinationに設定できるApplicationContext IDのルールはリファレンス参照。http://cloud.spring.io/spring-cloud-static/docs/1.0.x/spring-cloud.html#_spring_cloud_bus

終わり

恐ろしいほど簡単だけどAMQPトラブったら呆然とする自信ある。