春のクラウドバス

春のクラウドバス

1. 概要

この記事では、新しいSpring CloudBusプロジェクトについて説明します。 Spring Cloud Busは軽量メッセージブローカーを使用して分散システムノードをリンクします。 主な用途は、構成の変更またはその他の管理情報をブロードキャストすることです。 分散されたActuatorと考えることができます。

このプロジェクトではAMQPブローカーをトランスポートとして使用していますが、RabbitMQの代わりにApache KafkaまたはRedisを使用できます。 他のトランスポートはまだサポートされていません。

このチュートリアルでは、RabbitMQをメインのトランスポートとして使用します。これは当然のことながらすでに実行されています。

2. 前提条件

始める前に、「Quick Intro to Spring Cloud Configuration」をすでに完了していることをお勧めします。 既存のクラウド構成サーバーとクライアントを使用してそれらを拡張し、構成の変更に関する自動通知を追加します。

2.1. うさぎのMQ

RabbitMQ as a docker imageとして実行することをお勧めするRabbitMQから始めましょう。 これはセットアップが非常に簡単です。RabbitMQをローカルで実行するには、install Dockerを実行し、Dockerが正常にインストールされたら次のコマンドを実行する必要があります。

docker pull rabbitmq:3-management

このコマンドは、デフォルトでインストールおよび有効化された管理プラグインとともにRabbitMQドッカーイメージをプルします。

次に、RabbitMQを実行できます。

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

コマンドを実行したら、Webブラウザーに移動して、http://localhost:15672を開くと、管理コンソールのログインフォームが表示されます。 デフォルトのユーザー名は次のとおりです。‘guest';パスワード:‘guest'。 RabbitMQはポート5672でもリッスンします。

3. CloudConfigクライアントへのアクチュエータの追加

クラウド構成サーバーとクラウド構成クライアントの両方が実行されている必要があります。 構成の変更を更新するには、毎回クライアントの再起動が必要です-これは理想的ではありません。

構成クライアントを停止し、ConfigClientコントローラークラスに@RefreshScopeで注釈を付けましょう。

@SpringBootApplication
@RestController
@RefreshScope
public class SpringCloudConfigClientApplication {
    // Code here...
}

最後に、pom.xmlファイルを更新して、アクチュエータを追加しましょう。


    org.springframework.boot
    spring-boot-actuator
    1.5.5.RELEASE

最新バージョンはhereで見つけることができます。

デフォルトでは、アクチュエータによって追加されたすべての敏感なエンドポイントが保護されます。 これには、‘/refresh'のエンドポイントが含まれます。 簡単にするために、bootstrap.propertiesを更新してセキュリティをオフにします。

management.security.enabled=false

最初にクライアントを起動し、GitHubのプロパティファイルで既存の‘Developer'から‘Programmer'にユーザーロールを更新しましょう。 構成サーバーは、更新された値をすぐに表示します。ただし、クライアントはそうしません。 クライアントに新しいファイルを表示させるには、アクチュエータによって追加された空のPOSTリクエストを‘/refresh'エンドポイントに送信する必要があります。

$> curl -X POST http://localhost:8080/refresh

更新されたプロパティを示すJSONファイルを取得します。

[
  "user.role"
]

最後に、ユーザーロールが更新されたかどうかを確認できます。

$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

ユーザーロールは、‘/refresh'エンドポイントを呼び出すことによって正常に更新されました。 クライアントは再起動せずに構成を更新しました。

4. 春のクラウドバス

アクチュエータを使用することにより、クライアントを更新できます。 ただし、クラウド環境では、すべてのクライアントにアクセスし、アクチュエータエンドポイントにアクセスして設定を再ロードする必要があります。

この問題を解決するために、Spring Cloud Busを使用できます。

4.1. クライアント

RabbitMQ交換にサブスクライブできるように、クラウド構成クライアントを更新する必要があります。


    org.springframework.cloud
    spring-cloud-starter-bus-amqp
    1.3.1.RELEASE

最新バージョンはhereで見つけることができます。

構成クライアントの変更を完了するには、RabbitMQの詳細をapplication.ymlファイルに追加する必要があります。

---
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

デフォルトのユーザー名とパスワードを使用していることに注意してください。 これは、実際の実稼働アプリケーション用に更新する必要があります。 このチュートリアルではこれで問題ありません。

これで、クライアントには別のエンドポイント‘/bus/refresh'があります。 このエンドポイントを呼び出すと:

  • 構成サーバーから最新の構成を取得し、@RefreshScopeで注釈が付けられた構成を更新します

  • リフレッシュイベントについて通知するメッセージをAMQP交換に送信する

  • サブスクライブされたすべてのノードも構成を更新します

このように、個々のノードに移動して構成の更新をトリガーする必要はありません。

4.2. サーバ

最後に、構成サーバーに2つの依存関係を追加して、構成の変更を完全に自動化します。


    org.springframework.cloud
    spring-cloud-config-monitor
    1.3.1.RELEASE

最新バージョンはhereで見つけることができます。


    org.springframework.cloud
    spring-cloud-starter-stream-rabbit
    1.2.1.RELEASE

最新バージョンはhereで見つけることができます。

spring-cloud-config-monitorを使用して、構成の変更を監視し、RabbitMQをトランスポートとして使用してイベントをブロードキャストします。

application.propertiesを更新し、RabbitMQの詳細を提供する必要があります。

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

4.3. GitHub Webhook

すべてが設定されました。 サーバーは、構成の変更について通知されると、これをメッセージとしてRabbitMQにブロードキャストします。 クライアントは、構成変更イベントが送信されるとメッセージをリッスンし、構成を更新します。 しかし、サーバーはどのように変更を行うのでしょうか?

GitHub Webhookを設定する必要があります。 GitHubに移動して、構成プロパティを保持しているリポジトリを開きます。 それでは、SettingsWebhookを選択しましょう。 Add webhookボタンをクリックしてみましょう。

ペイロードURLは、構成サーバーの‘/monitor'エンドポイントのURLです。 この場合、URLは次のようになります。

http://root:[.cf_email#[メール保護] #_ IP:8888 /モニター]

ドロップダウンメニューのContent typeapplication/json.に変更する必要があります。次に、Secretを空のままにして、Add webhookボタンをクリックします。その後、すべて設定されます。

5. テスト

すべてのアプリケーションが実行されていることを確認しましょう。 戻ってクライアントを確認すると、user.role‘Programmer'として表示され、user.passwordは ‘d3v3L‘として表示されます。

$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

以前は、構成の変更を再ロードするために‘/refresh'エンドポイントを使用する必要がありました。 プロパティファイルを開き、user.roleDeveloperに戻し、変更をプッシュしてみましょう。

user.role=Programmer

ここでクライアントを確認すると、次のように表示されます。

$> curl http://localhost:8080/whoami/Mr_Pink
Hello Mr_Pink! You are a(n) Developer and your password is 'd3v3L'.

構成クライアントは、ほぼ同時に再起動せずに明示的に更新することなく、構成を更新しました。 GitHubに戻り、最近作成したWebhookを開くことができます。 一番下には、最近の配信があります。 リストの一番上で1つを選択し(これが最初の変更であると仮定して-とにかく1つだけになると仮定します)、構成サーバーに送信されたJSONを調べます。

構成とサーバーのログを確認することもできます。エントリが表示されます。

o.s.cloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed []

6. 結論

この記事では、既存のSpring Cloud構成サーバーとクライアントを使用し、アクチュエーターエンドポイントを追加してクライアント構成を更新しました。 次に、Spring Cloud Busを使用して構成の変更をブロードキャストし、クライアントの更新を自動化しました。 また、GitHub Webhookを構成し、セットアップ全体をテストしました。

いつものように、議論中に使用されたコードはover on GitHubで見つけることができます。