Spring Cloud Consulのクイックガイド

Spring Cloud Consulのクイックガイド

1. 概要

Spring Cloud Consulプロジェクトは、SpringBootアプリケーションのConsulとの簡単な統合を提供します。

Consulは、マイクロサービスアーキテクチャで最も一般的な課題のいくつかを解決するためのコンポーネントを提供するツールです。

  • サービス検出–サービスインスタンスのネットワークロケーションを自動的に登録および登録解除します

  • ヘルスチェック-サービスインスタンスが稼働していることを検出する

  • 分散構成-すべてのサービスインスタンスが同じ構成を使用するようにします

この記事では、これらの機能を使用するようにSpringBootアプリケーションを構成する方法を説明します。

2. 前提条件

まず、Consulとそのすべての機能を簡単に確認することをお勧めします。

この記事では、localhost:8500で実行されているConsulエージェントを使用します。 Consulをインストールしてエージェントを実行する方法の詳細については、このlinkを参照してください。

まず、spring-cloud-starter-consul-allの依存関係をpom.xmlに追加する必要があります。


    org.springframework.cloud
    spring-cloud-starter-consul-all
    1.3.0.RELEASE

3. サービス発見

最初のSpringBootアプリケーションを作成し、実行中のConsulエージェントと接続しましょう。

@SpringBootApplication
public class ServiceDiscoveryApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(ServiceDiscoveryApplication.class)
          .web(true).run(args);
    }
}

By default, Spring Boot will try to connect to the Consul agent at localhost:8500.他の設定を使用するには、application.ymlファイルを更新する必要があります。

spring:
  cloud:
    consul:
      host: localhost
      port: 8500

次に、ブラウザでhttp://localhost:8500にあるConsulエージェントのサイトにアクセスすると、アプリケーションが“$\{spring.application.name}:$\{profiles separated by comma}:$\{server.port}”の識別子でConsulに正しく登録されていることがわかります。

この識別子をカスタマイズするには、プロパティspring.cloud.discovery.instanceIdを別の式で更新する必要があります。

spring:
  application:
    name: myApp
  cloud:
    consul:
      discovery:
        instanceId: ${spring.application.name}:${random.value}

アプリケーションを再度実行すると、識別子“MyApp”とランダムな値を使用して登録されたことがわかります。 これは、ローカルマシンでアプリケーションの複数のインスタンスを実行するために必要です。

最後に、to disable Service Discovery, we need to set the property spring.cloud.consul.discovery.enabled to false.

3.1. サービスの検索

Consulに既にアプリケーションを登録していますが、クライアントはどのようにしてサービスエンドポイントを見つけることができますか? Consulから実行中の利用可能なサービスを取得するには、検出クライアントサービスが必要です。

Spring provides a DiscoveryClient API for this。これは@EnableDiscoveryClientアノテーションで有効にできます。

@SpringBootApplication
@EnableDiscoveryClient
public class DiscoveryClientApplication {
    // ...
}

次に、DiscoveryClient Beanをコントローラーに挿入し、インスタンスにアクセスできます。

@RestController
public class DiscoveryClientController {

    @Autowired
    private DiscoveryClient discoveryClient;

    public Optional serviceUrl() {
        return discoveryClient.getInstances("myApp")
          .stream()
          .map(si -> si.getUri());
          .findFirst()
    }
}

最後に、アプリケーションのエンドポイントを定義します。

@GetMapping("/discoveryClient")
public String discoveryPing() throws RestClientException,
  ServiceUnavailableException {
    URI service = serviceUrl()
      .map(s -> s.resolve("/ping"))
      .orElseThrow(ServiceUnavailableException::new);
    return restTemplate.getForEntity(service, String.class)
      .getBody();
}

@GetMapping("/ping")
public String ping() {
    return "pong";
}

“myApp/ping”パスは、サービスエンドポイントを持つSpringアプリケーション名です。 領事は“myApp”.という名前の利用可能なすべてのアプリケーションを提供します

4. ヘルスチェック

Consulは、サービスエンドポイントの状態を定期的にチェックします。

デフォルトでは、Spring implements the health endpoint to return 200 OK if the app is upです。 エンドポイントをカスタマイズする場合は、application.yml:を更新する必要があります

spring:
  cloud:
    consul:
      discovery:
        healthCheckPath: /my-health-check
        healthCheckInterval: 20s

その結果、領事は20秒ごとに“/my-health-check”エンドポイントをポーリングします。

FORBIDDENステータスを返すカスタムヘルスチェックサービスを定義しましょう。

@GetMapping("/my-health-check")
public ResponseEntity myCustomCheck() {
    String message = "Testing my healh check function";
    return new ResponseEntity<>(message, HttpStatus.FORBIDDEN);
}

領事代理店のサイトにアクセスすると、アプリケーションが失敗していることがわかります。 これを修正するには、“/my-health-check”サービスがHTTP200 OKステータスコードを返す必要があります。

5. 分散構成

この機能はallows synchronizing the configuration among all the servicesです。 Consulは構成の変更を監視し、すべてのサービスの更新をトリガーします。

まず、spring-cloud-starter-consul-configの依存関係をpom.xmlに追加する必要があります。


    org.springframework.cloud
    spring-cloud-starter-consul-config
    1.3.0.RELEASE

また、ConsulおよびSpringアプリケーション名の設定をapplication.ymlファイルからSpringが最初にロードするbootstrap.ymlファイルに移動する必要があります。

次に、Spring Cloud Consul Configを有効にする必要があります。

spring:
  application:
    name: myApp
  cloud:
    consul:
      host: localhost
      port: 8500
      config:
        enabled: true

Spring Cloud Consul Configは、“/config/myApp”でConsulのプロパティを検索します。 したがって、“my.prop”というプロパティがある場合は、Consulエージェントサイトでこのプロパティを作成する必要があります。

プロパティを作成するには、“KEY/VALUE”セクションに移動し、“Create Key”フォームに“/config/myApp/my/prop”を入力し、値として“Hello World”を入力します。 最後に、“Create”ボタンをクリックします。

Springプロファイルを使用している場合、Springアプリケーション名の横にプロファイルを追加する必要があることに注意してください。 たとえば、devプロファイルを使用している場合、領事館の最終パスは“/config/myApp,dev”.になります。

次に、プロパティが挿入されたコントローラーがどのように見えるかを見てみましょう。

@RestController
public class DistributedPropertiesController {

    @Value("${my.prop}")
    String value;

    @Autowired
    private MyProperties properties;

    @GetMapping("/getConfigFromValue")
    public String getConfigFromValue() {
        return value;
    }

    @GetMapping("/getConfigFromProperty")
    public String getConfigFromProperty() {
        return properties.getProp();
    }
}

そして、MyPropertiesクラス:

@RefreshScope
@Configuration
@ConfigurationProperties("my")
public class MyProperties {
    private String prop;

    // standard getter, setter
}

アプリケーションを実行すると、フィールドvaluepropertiesは、Consulからの同じ“Hello World”値を持ちます。

5.1. 構成の更新

Spring Bootアプリケーションを再起動せずに構成を更新するのはどうですか?

領事エージェントサイトに戻り、プロパティ“/config/myApp/my/prop”“New Hello World”などの別の値で更新すると、フィールドvalueは変更されず、フィールドpropertiesは次のようになります。期待どおりに“New Hello World”に更新されました。

これは、フィールドpropertiesMyPropertiesクラスであり、@RefreshScopeアノテーションがあるためです。 All beans annotated with the @RefreshScope annotation will be refreshed after configuration changes.

実際には、Consulにプロパティを直接保持するべきではありませんが、どこかに永続的に保存する必要があります。 これは、Config Serverを使用して実行できます。

6. 結論

この記事では、サービス検出の目的でConsulと連携するようにSpring Bootアプリケーションを設定し、ヘルスチェックルールをカスタマイズし、分散構成を共有する方法について説明しました。

また、クライアントがこれらの登録済みサービスを呼び出すためのいくつかのアプローチを導入しました。

いつものように、ソースはover on GitHubで見つけることができます。