1. 概要

Spring Cloud は、クライアント側の負荷分散、サービスレジストリ/検出、同時実行制御、構成サーバーなどの幅広い機能とライブラリを提供します。 一方、マイクロサービスの世界では、さまざまな言語とフレームワークでポリグロットサービスを作成するのが一般的な方法です。 では、エコシステム全体でSpring Cloudを利用したい場合はどうでしょうか。 Spring CloudNetflixSidecarがここでのソリューションです。

このチュートリアルでは、実際の例を使用してSpring Cloudサイドカーについて詳しく学習します。

2. What Is Spring Cloud Sidecar?

Cloud Netflix Sidecarは、 Netflix Prana に着想を得ており、JVM以外の言語で記述されたサービスのサービスレジストリの使用を容易にし、Spring Cloudエコシステム内のエンドポイントの相互運用性を向上させるユーティリティとして使用できます。

Cloud Sidecarを使用すると、非JVMサービスをサービスレジストリに登録できます。さらに、サービスはサービスディスカバリを使用して他のサービスを検索したり、ホストルックアップまたはZuulを介して構成サーバーにアクセスしたりすることもできます。プロキシ。 非JVMサービスを統合できるようにするための唯一の要件は、標準のヘルスチェックエンドポイントを使用できるようにすることです。

3. サンプルアプリケーション

サンプルのユースケースは、3つのアプリケーションで構成されています。  Cloud Netflix Sidecarの最高の機能を示すために、NodeJSで / hello エンドポイントを作成し、sidecarと呼ばれるSpringアプリケーションを介してエコシステムに公開します。 また、サービスディスカバリとZuulを使用して、 /helloエンドポイント応答をエコーする別のSpring Bootアプリケーションを開発します。

このプロジェクトでは、リクエストの2つのフローをカバーすることを目指しています。

  • ユーザーがechoSpring Bootアプリケーションでechoエンドポイントを呼び出します。 エコーエンドポイントは、 DiscoveryClient を使用して、EurekaからhelloサービスのURL、つまりNodeJSサービスを指すURLを検索します。 次に、echoエンドポイントがNodeJSアプリケーションのhelloエンドポイントを呼び出します
  • ユーザーは、Zuulプロキシを使用して、エコーアプリケーションから直接helloエンドポイントを呼び出します。

3.1. NodeJSHelloエンドポイント

hello.jsというJSファイルを作成することから始めましょう。 expressを使用してhelloリクエストを処理しています。 hello.js ファイルでは、デフォルトの「/」エンドポイント、 / hello エンドポイント、 /healthエンドポイントの3つのエンドポイントを導入しました。 Spring Cloudサイドカーの要件を満たす:

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
    res.send('Hello World!')
})

app.get('/health', (req, res) => {
    res.send({ "status":"UP"})
})

app.get('/hello/:me', (req, res) => {
    res.send('Hello ' + req.params.me + '!')
})

app.listen(port, () => {
    console.log(`Hello app listening on port ${port}`)
})

次に、expressをインストールします。

npm install express

そして最後に、アプリケーションを開始しましょう。

node hello.js

アプリケーションが起動したら、helloエンドポイントをcurlしましょう。

curl http://localhost:3000/hello/baeldung
Hello baeldung!

次に、ヘルスエンドポイントをテストします。

curl http://localhost:3000/health
status":"UP"}

次のステップに向けてノードアプリケーションの準備ができたので、Springifyを実行します。

3.2. サイドカーアプリケーション

まず、Eurekaサーバーを稼働させる必要があります。 Eurekaサーバーの起動後、http://127.0.0.1:8761からアクセスできます。

spring-cloud-netflix-sidecarを依存関係として追加しましょう。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-netflix-sidecar</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>

現時点でのspring-cloud-netflix-sidecarの最新バージョンは2.2.10.RELEASEであり、spring bootのみをサポートしていることに注意してください。 2.3.12.RELEASE。 そのため、現時点では、最新バージョンのSpring BootはNetflixSidecarと互換性がありません。

次に、サイドカーを有効にしてSpring Bootアプリケーションクラスを実装しましょう。

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

次のステップでは、Eurekaに接続するためのプロパティを設定する必要があります。 さらに、NodeJShelloアプリのポートとヘルスURIを使用してサイドカー構成を設定します。

server.port: 8084
spring:
  application:
    name: sidecar
eureka:
  instance:
    hostname: localhost
    leaseRenewalIntervalInSeconds: 1
    leaseExpirationDurationInSeconds: 2
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
    healthcheck:
      enabled: true
sidecar:
  port: 3000
  health-uri: http://localhost:3000/health

これで、アプリケーションを開始できます。 アプリケーションが正常に起動すると、SpringはEurekaサーバーに「hello」という名前のサービスを登録します。

動作するかどうかを確認するために、エンドポイント http:// localhost:8084 / hosts /sidecarにアクセスできます。

@EnableSidecar は、サイドサービスをEurekaに登録するためのマーカー以上のものです。 それはまた引き起こします @EnableCircuitBreaker @EnableZuulProxy 追加される予定であり、その後、Spring Bootアプリケーションはヤマアラシズール

これで、Springアプリケーションの準備ができたので、次のステップに進み、エコシステム内のサービス間の通信がどのように機能するかを見てみましょう。

3.3. エコーアプリケーションもこんにちは!

エコーアプリケーションの場合、サービス検出を利用してNodeJShelloエンドポイントを呼び出すエンドポイントを作成します。 さらに、Zuul Proxyが、これら2つのサービス間の通信に関する他のオプションを表示できるようにします。

まず、依存関係を追加しましょう。

 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
     <version>2.2.10.RELEASE</version>
 </dependency>
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
     <version>2.2.10.RELEASE</version>
 </dependency>

サイドカーアプリケーションとの一貫性を保つために、エコーアプリケーションでは 2.2.10.RELEASEforの両方の依存関係をspring-cloud-starter-netflix-zuulに使用します。およびspring-cloud-starter-netflix-eureka-client

次に、Spring Bootメインクラスを作成し、Zuulプロキシを有効にします。

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class EchoApplication {
    // ...
}

次に、前のセクションで行ったようにEurekaクライアントを構成します。

server.port: 8085
spring:
  application:
    name: echo
eureka:
  instance:
    hostname: localhost
    leaseRenewalIntervalInSeconds: 1
    leaseExpirationDurationInSeconds: 2
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka
 ...

次に、エコーアプリケーションを開始します。 開始後、2つのサービス間の相互運用性を確認できます。

サイドカーアプリケーションを確認するために、エコーサービスのメタデータをクエリしてみましょう。

curl http://localhost:8084/hosts/echo

次に、エコーアプリケーションがサイドカーアプリケーションによって公開されたNodeJSエンドポイントを呼び出すことができるかどうかを確認するために、Zuulプロキシの魔法を使用してこのURLをカールさせましょう。

curl http://localhost:8085/sidecar/hello/baeldung
Hello baeldung!

すべてが機能していることを確認したので、helloエンドポイントを呼び出す別の方法を試してみましょう。 まず、echoアプリケーションでコントローラーを作成して注入します DiscoveryClient。 次に、 得るを使用するエンドポイント DiscoveryClient helloサービスを照会し、 RestTemplate:

@Autowired
DiscoveryClient discoveryClient;

@GetMapping("/hello/{me}")
public ResponseEntity<String> echo(@PathVariable("me") String me) {
    List<ServiceInstance> instances = discoveryClient.getInstances("sidecar");
    if (instances.isEmpty()) {
        return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body("hello service is down");
    }
    String url = instances.get(0).getUri().toString();
    return ResponseEntity.ok(restTemplate.getForObject(url + "/hello/" + me, String.class));
}

エコーアプリケーションを再起動し、このcurlを実行して、エコーアプリケーションから呼び出されたエコーエンドポイントを確認しましょう。

curl http://localhost:8085/hello/baeldung
Hello baeldung!

または、もう少し面白くするには、サイドカーアプリケーションから呼び出します。

curl http://localhost:8084/echo/hello/baeldung
Hello baeldung!

4. 結論

この記事では、Cloud Netflix Sidecarについて学び、NodeJSと2つのSpringアプリケーションを使用して動作するサンプルを作成し、Springエコシステムでの使用法を示しました。

いつものように、例の完全なコードはGitHubで入手できます。