1概要

この記事では、新しいSpring Cloud Busプロジェクトについて見ていきます。 Spring Cloud Busは、ライトウェイトメッセージブローカーを使用して分散システムノードをリンクします。主な用途は、設定変更やその他の管理情報をブロードキャストすることです。私たちはそれを分散リンクとして考えることができます:/spring-boot-actuators[アクチュエーター]。

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

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


2前提条件

始める前に、「

Spring Cloud設定のクイックイントロ

」を完了しておくことをお勧めします。既存のクラウド設定サーバーとクライアントを拡張して設定変更に関する自動通知を追加する予定です。


2.1. RabbitMQ


docker imageとしてのRabbitMQ

として実行することをお勧めするRabbitMQから始めましょう。これはセットアップがとても簡単です – RabbitMQをローカルで実行するには、https://www.docker.com/get-docker[install Docker]を実行し、Dockerが正常にインストールされたら以下のコマンドを実行する必要があります。

docker pull rabbitmq:3-management

このコマンドは、デフォルトでインストールされ有効になっている管理プラグインと一緒にRabbitMQ dockerイメージを取得します。

次に、RabbitMQを実行します。

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

コマンドを実行したら、Webブラウザにアクセスしてhttp://localhost:15672を開くと、管理コンソールのログインフォームが表示されます。デフォルトのユーザー名は

‘ゲスト’

です。パスワード:

「ゲスト」

RabbitMQもポート5672で待機します。


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

クラウド構成サーバーとクラウド構成クライアントの両方が稼働しているはずです。

設定の変更を更新するには、毎回クライアントの再起動が必要です。

configクライアントを停止し、

ConfigClient

コントローラークラスに

@ RefreshScope

のアノテーションを付けます。

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

最後に、

pom.xml

ファイルを更新してActuatorを追加しましょう。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-actuator</artifactId>
    <version>1.5.5.RELEASE</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.springframework.boot%22%20AND%20a%3A%22spring-boot-actuator%22にあります。[ここに]。

デフォルトでは、アクチュエータによって追加されたすべての機密エンドポイントは保護されています。これには、エンドポイントが含まれます。簡単にするために、

bootstrap.properties

を更新してセキュリティを無効にします。

management.security.enabled=false

まずクライアントを起動し、GitHubのプロパティファイルでユーザーの役割を既存の「開発者」から「プログラマー」に更新します。設定サーバーは更新された値をすぐに表示します。しかし、クライアントは勝ちました。クライアントに新しいファイルを表示させるには、アクチュエーターによって追加された空の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交換を購読できるようにクラウド設定クライアントを更新する必要があります。

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

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.springframework.cloud%22%20AND%20a%3A%22spring-cloud-starter-busにあります。 -amqp%22[ここ]。

設定クライアントの変更を完了するには、RabbitMQの詳細を

application.yml

ファイルに追加するだけです。

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

デフォルトのユーザー名とパスワードを使用しています。これは実生活の本番アプリケーション用に更新する必要があります。このチュートリアルではこれで問題ありません。

これで、クライアントは別のエンドポイント

‘/bus/refresh’

を持つようになります。このエンドポイントを呼び出すと、次のことが起こります。

  • 設定サーバーから最新の設定を取得して更新する


@ RefreshScope

によって注釈が付けられた構成
** AMQP交換にリフレッシュイベントについて知らせるメッセージを送る

  • 購読しているすべてのノードも設定を更新します

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


4.2. サーバ

最後に、設定変更を完全に自動化するために設定サーバーに2つの依存関係を追加しましょう。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-monitor</artifactId>
    <version>1.3.1.RELEASE</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.springframework.cloud%22%20AND%20a%3A%22spring-cloud-config-monitorにあります%22[ここ]

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    <version>1.2.1.RELEASE</version>
</dependency>

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.springframework.cloud%22%20AND%20a%3A%22spring-cloud-starter-にあります。 stream-rabbit%22[ここ]。

トランスポートとしてRabbitMQを使用して設定の変更を監視し、イベントをブロードキャストするために

spring-cloud-config-monitor

を使用します。


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に行き、設定プロパティを保持しているリポジトリを開きましょう。それでは、

Settings



Webhook

を選択しましょう。[ウェブフックを追加]ボタンをクリックしましょう。

ペイロードURLは、設定サーバー

‘/monitor’

エンドポイントのURLです。私たちの場合、URLは次のようになります。


http://root:s3cr3t

@ REMOTE

IP:8888/monitor[

http://root

:

IP:8888/monitor]

ドロップダウンメニューの

Content type



application/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.role



Developer

に戻して変更をプッシュします。

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つだけがあるでしょう)、設定サーバーに送られたJSONを調べます。

configとserverのログをチェックすることもできます。エントリが表示されます。

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

===  **  6. 結論**

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

いつものように、議論の間に使用されたコードはhttps://github.com/eugenp/tutorials/tree/master/spring-cloud-bus[over GitHub]で見つけることができます。