1. 概要

この記事では、 Spring CloudGatewayアプリケーションとSpring Bootアプリケーションから始めます。 次に、代わりに Dapr(分散アプリケーションランタイム)を使用するように更新します。 最後に、Dapr構成を更新して、クラウドネイティブコンポーネントと統合するときにDaprが提供する柔軟性を示します。

2. Daprの紹介

Daprを使用すると、アプリケーション自体に影響を与えることなく、クラウドネイティブアプリケーションのデプロイを管理できます。 Daprはサイドカーパターンを使用していますオフロードするアプリケーションからの展開に関する懸念。これにより、アプリケーション自体を変更することなく、他の環境(オンプレミス、さまざまなプロプライエタリクラウドプラットフォーム、Kubernetesなど)にアプリケーションを展開できます。 詳細については、DaprのWebサイトでこの概要を確認してください。

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

まず、サンプルのSpringCloudGatewayとSpring Bootアプリケーションを作成します。 「Helloworld」の例の優れた伝統では、ゲートウェイは、標準の「Helloworld」グリーティングのバックエンドSpringBootアプリケーションにリクエストをプロキシします。

3.1. あいさつサービス

まず、あいさつサービス用のSpring Bootアプリケーションを作成しましょう。 これは、 spring-boot-starter-web が唯一の依存関係であり、標準のメインクラスであり、サーバーポートが3001として構成されている標準のSpringBootアプリケーションです。

helloエンドポイントに応答するコントローラーを追加しましょう。

@RestController
public class GreetingController {
    @GetMapping(value = "/hello")
    public String getHello() {
        return "Hello world!";
    }
}

グリーティングサービスアプリを作成したら、起動します。

java -jar greeting/target/greeting-1.0-SNAPSHOT.jar

curl を使用してテストし、「Helloworld!」を返すことができます。 メッセージ:

curl http://localhost:3001/hello

3.2. Spring Cloud Gateway

次に、 spring-cloud-starter-gateway を唯一の依存関係とし、標準のメインクラスを使用して、標準のSpring Bootアプリケーションとしてポート3000にSpringCloudGatewayを作成します。 また、ルーティングを構成します グリーティングサービスにアクセスします。

spring:
  cloud:
    gateway:
      routes:
        - id: greeting-service
          uri: http://localhost:3001/
          predicates:
            - Path=/**
          filters:
          - RewritePath=/?(?<segment>.*), /$\{segment}

ゲートウェイアプリを作成したら、ゲートウェイを開始できます。

java -Dspring.profiles.active=no-dapr -jar gateway/target/gateway-1.0-SNAPSHOT.jar

curl を使用してテストし、「Helloworld!」を返すことができます。 グリーティングサービスからのメッセージ:

curl http://localhost:3000/hello

4. Daprを追加

基本的な例が用意できたので、Daprをミックスに追加しましょう。

これを行うには、ゲートウェイを設定して、グリーティングサービスと直接通信するのではなく、Daprサイドカーと通信します。 Daprは、グリーティングサービスを見つけて、リクエストを転送する責任があります。 これで、通信パスはゲートウェイからDaprサイドカーを経由してグリーティングサービスになります。

4.1. Daprサイドカーを配備する

まず、Daprサイドカーの2つのインスタンスを展開する必要があります。1つはゲートウェイ用で、もう1つはグリーティングサービス用です。 これは、 DaprCLIを使用して行います。

標準のDapr構成ファイルを使用します。

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec: {}

dapr コマンドを使用して、ポート4000のゲートウェイのDaprサイドカーを起動してみましょう。

dapr run --app-id gateway --dapr-http-port 4000 --app-port 3000 --config dapr-config/basic-config.yaml

次に、 dapr コマンドを使用して、ポート4001でグリーティングサービスのDaprサイドカーを起動しましょう。

dapr run --app-id greeting --dapr-http-port 4001 --app-port 3001 --config dapr-config/basic-config.yaml

サイドカーが稼働しているので、リクエストの傍受とグリーティングサービスへの転送をサイドカーがどのように処理するかを確認できます。 curl を使用してテストすると、「Helloworld!」が返されるはずです。 挨拶:

curl http://localhost:4001/v1.0/invoke/greeting/method/hello

ゲートウェイサイドカーを使用して同じテストを試して、「Helloworld!」も返されることを確認してみましょう。 挨拶:

curl http://localhost:4000/v1.0/invoke/greeting/method/hello

ここで舞台裏で何が起こっているのですか? ゲートウェイのDaprサイドカーは、サービスディスカバリ(この場合はローカル環境のmDNS)を使用して、グリーティングサービスのDaprサイドカーを検索します。 次に、はサービス呼び出しを使用して、グリーティングサービスで指定されたエンドポイントを呼び出します。

4.2. ゲートウェイ構成の更新

次のステップは、代わりにDaprサイドカーを使用するようにゲートウェイルーティングを構成することです。

spring:
  cloud:
    gateway:
      routes:
        - id: greeting-service
          uri: http://localhost:4000/
          predicates:
            - Path=/**
          filters:
          - RewritePath=//?(?<segment>.*), /v1.0/invoke/greeting/method/$\{segment}

次に、更新されたルーティングを使用してゲートウェイを再起動します。

java -Dspring.profiles.active=with-dapr -jar gateway/target/gateway-1.0-SNAPSHOT.jar

curl コマンドを使用してテストし、グリーティングサービスから「Helloworld」グリーティングをもう一度取得できます。

curl http://localhost:3000/hello

Wireshark を使用してネットワークで何が起こっているかを見ると、ゲートウェイとサービス間のトラフィックがDaprサイドカーを通過していることがわかります。

おめでとう! これで、Daprをうまく取り入れることができました。 これにより得られたものを確認しましょう。グリーティングサービスを見つけるためにゲートウェイを構成する必要がなくなり(つまり、ルーティング構成でグリーティングサービスのポート番号を指定する必要がなくなります)、ゲートウェイが不要になります。リクエストがグリーティングサービスに転送される方法の詳細を知るため。

5. Dapr構成を更新する

Daprが配置されたので、代わりに他のクラウドネイティブコンポーネントを使用するようにDaprを構成できます。

5.1. サービスディスカバリに領事を使用する

mDNSの代わりにConsulをサービスディスカバリに使用しましょう。

まず、 デフォルトのポートである8500にConsulをインストールして起動してから、u領事を使用するためにDaprサイドカー構成をpdateします。

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec:
  nameResolution:
    component: "consul"
    configuration:
      selfRegister: true

次に、両方のDaprサイドカーを新しい構成で再起動します。

dapr run --app-id greeting --dapr-http-port 4001 --app-port 3001 --config dapr-config/consul-config.yaml
dapr run --app-id gateway --dapr-http-port 4000 --app-port 3000 --config dapr-config/consul-config.yaml

サイドカーが再起動されると、領事UIの[サービス]ページにアクセスして、ゲートウェイアプリとグリーティングアプリが一覧表示されます。 アプリケーション自体を再起動する必要がないことに注意してください。

それがどれほど簡単だったかわかりますか? Daprサイドカーの簡単な構成変更により、Consul がサポートされるようになりました。最も重要なのは、が基盤となるアプリケーションに影響を与えないことです。 これは、アプリケーション自体を更新する必要がある Spring CloudConsulを使用する場合とは異なります。

5.2. トレースにZipkinを使用する

Daprは、アプリケーション間で呼び出しをトレースするためのZipkinとの統合もサポートしています。

まず、デフォルトのポート9411にZipkinをインストールして起動し、Daprサイドカーの構成を更新してZipkinを追加します。

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec:
  nameResolution:
    component: "consul"
    configuration:
      selfRegister: true
  tracing:
    samplingRate: "1"
    zipkin:
      endpointAddress: "http://localhost:9411/api/v2/spans"

新しい構成を取得するには、両方のDaprサイドカーを再起動する必要があります。

dapr run --app-id greeting --dapr-http-port 4001 --app-port 3001 --config dapr-config/consul-zipkin-config.yaml
dapr run --app-id gateway --dapr-http-port 4000 --app-port 3000 --config dapr-config/consul-zipkin-config.yaml

Daprを再起動したら、 curl コマンドを発行し、ZipkinUIをチェックして呼び出しトレースを確認できます。

繰り返しになりますが、ゲートウェイとグリーティングサービスを再起動する必要はありません。 必要なのは Dapr構成への簡単な更新 。 これを、代わりに Spring CloudZipkinを使用する場合と比較してください。

5.3. その他のコンポーネント

Daprがセキュリティ、監視、レポートなどの他の懸念に対処するためにサポートする多くのコンポーネントがあります。 完全なリストについては、Daprのドキュメントを確認してください。

6. 結論

バックエンドのSpringBootサービスと通信するSpringCloudGatewayの簡単な例にDaprを追加しました。 Daprサイドカーを構成して起動する方法と、サービスディスカバリ、通信、トレースなどのクラウドネイティブの問題をどのように処理するかを示しました。

これにはサイドカーアプリケーションのデプロイと管理が犠牲になりますが、Daprは、Daprとの統合が行われると、アプリケーションに変更を加えることなく、さまざまなクラウドネイティブ環境およびクラウドネイティブの懸念事項にデプロイするための柔軟性を提供します。 。

このアプローチは、開発者がコードを記述しているときにクラウドネイティブの懸念に煩わされる必要がないことも意味します。これにより、開発者はビジネス機能に集中できるようになります。 Daprサイドカーを使用するようにアプリケーションを構成すると、アプリケーションに影響を与えることなく、さまざまなデプロイメントの懸念に対処できます。アプリケーションを再コーディング、再構築、または再デプロイする必要はありません。 Daprは、アプリケーションとデプロイメントの懸念を明確に分離します

いつものように、この記事の完全なコードはGitHubにあります。