1. 序章

この記事では、Zookeeperと、クラウド内のサービスに関する一元化された知識として使用されるServiceDiscoveryでのZookeeperの使用方法について説明します。

Spring Cloud Zookeeperは、自動構成とSpring環境へのバインドを通じて、SpringBootアプリにApacheZookeeper統合を提供します。

2. サービスディスカバリのセットアップ

2つのアプリを作成します。

  • サービスを提供するアプリ(この記事ではサービスプロバイダー と呼びます)
  • このサービスを利用するアプリ(サービスコンシューマーと呼ばれます)

Apache Zookeeperは、サービス検出セットアップのコーディネーターとして機能します。 Apache Zookeeperのインストール手順は、次のリンクで入手できます。

3. サービスプロバイダー登録

spring-cloud-starter-zookeeper-discovery 依存関係を追加し、メインアプリケーションでアノテーション @EnableDiscoveryClient を使用して、サービス登録を有効にします。

以下に、「HelloWorld!」を返すサービスのこのプロセスを段階的に示します。 GETリクエストへの応答で。

3.1. Mavenの依存関係

まず、必要な spring -cloud-starter-zookeeper-discovery、spring -web、spring -cloud-dependencies spring-boot-starterを追加しましょう。 ] pom.xml ファイルへの依存関係:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter</artifactId>
	<version>2.2.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
	<artifactId>spring-web</artifactId>
        <version>5.1.14.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
     </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3.2. サービスプロバイダーの注釈

次に、メインクラスに@EnableDiscoveryClientという注釈を付けます。 これにより、HelloWorldアプリケーションが検出可能になります。

@SpringBootApplication
@EnableDiscoveryClient
public class HelloWorldApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class, args);
    }
}

そして、単純なコントローラー:

@GetMapping("/helloworld")
public String helloWorld() {
    return "Hello World!";
}

3.3. YAML構成

次に、YAML Application.yml ファイルを作成します。このファイルは、アプリケーションのログレベルを構成し、アプリケーションが検出可能であることをZookeeperに通知するために使用されます。

Zookeeperに登録されるアプリケーションの名前が最も重要です。 後のサービスコンシューマーで、feignクライアントはサービス検出中にこの名前を使用します。

spring:
  application:
    name: HelloWorld
  cloud:
    zookeeper:
      discovery:
        enabled: true
logging:
  level:
    org.apache.zookeeper.ClientCnxn: WARN

Spring Bootアプリケーションは、デフォルトのポート2181でzookeeperを探します。 zookeeperが別の場所にある場合は、構成を追加する必要があります。

spring:
  cloud:
    zookeeper:
      connect-string: localhost:2181

4. サービス消費者

次に、RESTサービスコンシューマーを作成し、Spring NetflixFeignClientを使用して登録します。

4.1. Mavenの依存関係

まず、必要な spring -cloud-starter-zookeeper-discovery、spring -web、spring -cloud-dependencies、spring -boot-starter-actuator spring -cloud-starter-feign pom.xml ファイルへの依存関係:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>2.2.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

4.2. サービス消費者アノテーション

サービスプロバイダーと同様に、メインクラスに @EnableDiscoveryClient の注釈を付けて、検出に対応できるようにします。

@SpringBootApplication
@EnableDiscoveryClient
public class GreetingApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(GreetingApplication.class, args);
    }
}

4.3. FeignClientでサービスを発見

宣言型RESTクライアントを定義できるNetflixのプロジェクトSpringCloud FeignIntegrationを使用します。 URLがどのように見えるかを宣言し、feignがRESTサービスへの接続を処理します。

Feign Client は、spring-cloud-starter-feignパッケージを介してインポートされます。 @Configuration@EnableFeignClientsの注釈を付けて、アプリケーション内で使用できるようにします。

最後に、 @FeignClient( “service-name”)を使用してインターフェイスに注釈を付け、プログラムでこのサービスにアクセスできるように、アプリケーションに自動接続します。

ここで、注釈 @FeignClient(name =“ HelloWorld”)では、以前に作成したサービスプロデューサーのservice-nameを参照しています。

@Configuration
@EnableFeignClients
@EnableDiscoveryClient
public class HelloWorldClient {
 
    @Autowired
    private TheClient theClient;

    @FeignClient(name = "HelloWorld")
    interface TheClient {
 
        @RequestMapping(path = "/helloworld", method = RequestMethod.GET)
        @ResponseBody
	String helloWorld();
    }
    public String HelloWorld() {
        return theClient.HelloWorld();
    }
}

4.4. コントローラクラス

以下は、偽のクライアントクラスのサービスプロバイダー関数を呼び出して、挿入されたインターフェイス helloWorldClient オブジェクトを介してサービス(詳細はサービス検出によって抽象化されます)を使用し、それに応じて表示する単純なサービスコントローラークラスです。 :

@RestController
public class GreetingController {
 
    @Autowired
    private HelloWorldClient helloWorldClient;

    @GetMapping("/get-greeting")
    public String greeting() {
        return helloWorldClient.helloWorld();
    }
}

4.5. YAML構成

次に、前に使用したものと非常によく似たYAMLファイルApplication.ymlを作成します。 これにより、アプリケーションのログレベルが構成されます。

logging:
  level:
    org.apache.zookeeper.ClientCnxn: WARN

アプリケーションは、デフォルトポート2181でZookeeperを探します。 Zookeeperが別の場所にある場合は、構成を追加する必要があります。

spring:
  cloud:
    zookeeper:
      connect-string: localhost:2181

5. セットアップのテスト

HelloWorld RESTサービスは、デプロイ時にZookeeperに自分自身を登録します。 次に、サービスコンシューマとして機能する Greeting サービスが、Feignクライアントを使用してHelloWorldサービスを呼び出します。

これで、これら2つのサービスを構築して実行できます。

最後に、ブラウザで http:// localhost:8083 / get-greeting を指定すると、次のように表示されます。

Hello World!

6. 結論

この記事では、 Spring Cloud Zookeeper を使用してサービス検出を実装する方法を確認し、[X218X]HelloWorldというサービスをZookeeperサーバーに登録してGreeting[ X231X]ロケーションの詳細を知らずにFeignClientを使用するサービス。

いつものように、この記事のコードは GitHubで入手できます。