次の方法で共有


チュートリアル: Azure Container Apps でマネージド Eureka Server for Spring に接続する

Eureka Server for Spring は、マイクロサービスが自己を登録し、他のサービスを検出できるようにするサービス レジストリです。 Spring 用 Eureka サーバーは、Azure Container Apps コンポーネントとして使用できます。 コンテナー アプリを Spring 用 Eureka サーバーにバインドして、Eureka サーバーへの自動登録を行うことができます。

このチュートリアルでは、次の作業を行う方法について説明します。

  • Spring 用 Eureka サーバーの Java コンポーネントを作成します。
  • コンテナー アプリを Spring 用 Eureka サーバーの Java コンポーネントにバインドします。

重要

このチュートリアルでは、Azure の請求書に影響する可能性のあるサービスを使用します。 手順に従う場合は、予期しない課金を回避するために、この記事で紹介されているリソースを必ず削除してください。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。 まだお持ちでない場合は、無料で作成できます。
  • Azure CLI

考慮事項

Container Apps で Spring 用 Eureka サーバーを実行する場合は、次の詳細に注意してください。

項目 説明
範囲 Eureka Server for Spring コンポーネントは、接続されているコンテナー アプリと同じ環境で実行されます。
スケーリング Spring 用 Eureka サーバー コンポーネントは、スケーリングできません。 スケーリング プロパティ minReplicasmaxReplicas は両方とも 1 に設定されています。 高可用性を実現するには、Container Apps での高可用性 Eureka サービスの作成に関する記事を参照してください。
リソース Eureka Server for Spring のコンテナー リソースの割り当ては固定されています。 CPU コア数は 0.5、メモリ サイズは 1 Gi です。
価格 Eureka Server for Spring の課金は消費ベースの価格に該当します。 マネージド Java コンポーネントによって消費されるリソースは、アクティブ/アイドル レートで課金されます。 課金を停止するために、使用しなくなったコンポーネントを削除できます。
バインド コンテナー アプリは、バインドを介して Eureka Server for Spring コンポーネントに接続します。 バインドは、コンテナー アプリの環境変数に構成を注入します。 バインドが確立されると、コンテナー アプリで環境変数からこれらの構成値を読み取り、Spring 用 Eureka サーバー コンポーネントに接続できます。

セットアップ

Spring 用 Eureka サーバー コンポーネントの操作を開始する前に、まず、必要なリソースを作成する必要があります。

次のコマンドを実行して、コンテナー アプリ環境にリソース グループを作成します。

  1. アプリケーション構成をサポートする変数を作成します。 これらの値は、このレッスンのために提供されています。

    export LOCATION=eastus
    export RESOURCE_GROUP=my-services-resource-group
    export ENVIRONMENT=my-environment
    export EUREKA_COMPONENT_NAME=eureka
    export APP_NAME=my-eureka-client
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-service-eureka-client:latest"
    
    変数 説明
    LOCATION コンテナー アプリと Java コンポーネントを作成する Azure リージョンの場所。
    ENVIRONMENT デモ アプリケーションのコンテナー アプリ環境名。
    RESOURCE_GROUP デモ アプリケーションの Azure リソース グループ名。
    EUREKA_COMPONENT_NAME コンテナー アプリ用に作成された Java コンポーネントの名前。 この場合、Eureka Server for Spring の Java コンポーネントを作成します。
    IMAGE コンテナー アプリで使用されるコンテナー イメージ。
  2. Azure CLI を使用して Azure にサインインします。

    az login
    
  3. リソース グループを作成する。

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. コンテナー アプリ環境を作成します。

    az containerapp env create \
      --name $ENVIRONMENT \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION
    

Eureka Server for Spring の Java コンポーネントを作成する

既存の環境が作成されたので、コンテナー アプリを作成し、Eureka Server for Spring の Java コンポーネント インスタンスにバインドできます。

  1. Eureka Server for Spring の Java コンポーネントを作成します。

    az containerapp env java-component eureka-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME
    
  2. 省略可能: Eureka Server for Spring の Java コンポーネント構成を更新します。

    az containerapp env java-component eureka-server-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME
        --configuration eureka.server.renewal-percent-threshold=0.85 eureka.server.eviction-interval-timer-in-ms=10000
    

コンテナー アプリを Eureka Server for Spring の Java コンポーネントにバインドする

  1. コンテナー アプリを作成し、Spring 用 Eureka サーバー コンポーネントにバインドします。

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --min-replicas 1 \
        --max-replicas 1 \
        --ingress external \
        --target-port 8080 \
        --bind $EUREKA_COMPONENT_NAME \
        --query properties.configuration.ingress.fqdn
    
  2. 今後の手順で使用できるように、アプリの URL をテキスト エディターにコピーします。

ポータルでコンテナー アプリに戻ります。 今後の手順で使用できるように、アプリの URL をテキスト エディターにコピーします。

/allRegistrationStatus ルートに移動して、Spring 用 Eureka サーバー コンポーネントに登録されているすべてのアプリケーションを表示します。

バインドは、いくつかの構成を環境変数 (主に eureka.client.service-url.defaultZone プロパティ) としてアプリケーションに注入します。 このプロパティは、Eureka Server Java コンポーネントの内部エンドポイントを示します。

バインドでは、次のプロパティも注入されます。

"eureka.client.register-with-eureka":    "true"
"eureka.client.fetch-registry":          "true"
"eureka.instance.prefer-ip-address":     "true"

eureka.client.register-with-eureka プロパティは true に設定され、Eureka サーバーに強制的に登録します。 この登録は、構成サーバーなどからの application.properties のローカル設定を上書きします。 これを false に設定する場合は、コンテナー アプリで環境変数を設定することでオーバーライドできます。

コンテナー アプリ環境の特定のドメイン ネーム システム解決ルールのために、eureka.instance.prefer-ip-address プロパティは true に設定されます。 バインドを壊さないようにするため、この値は変更しないでください。

オプション: Spring 用 Eureka サーバー Java コンポーネントからコンテナー アプリをバインド解除する

コンテナー アプリからバインドを削除するには、--unbind オプションを使用します。

az containerapp update \
    --name $APP_NAME \
    --unbind $JAVA_COMPONENT_NAME \
    --resource-group $RESOURCE_GROUP

ダッシュボードを使用してアプリケーションを表示する

重要

ダッシュボードを表示するには、少なくとも Microsoft.App/managedEnvironments/write ロールがマネージド環境リソースのアカウントに割り当てられている必要があります。 リソースに Owner ロールまたは Contributor ロールを明示的に割り当てられます。 また、手順に従ってカスタム ロール定義を作成し、アカウントに割り当てることもできます。

  1. カスタム ロールの定義を作成します。

    az role definition create --role-definition '{
        "Name": "<YOUR_ROLE_NAME>",
        "IsCustom": true,
        "Description": "Can access managed Java Component dashboards in managed environments",
        "Actions": [
            "Microsoft.App/managedEnvironments/write"
        ],
        "AssignableScopes": ["/subscriptions/<SUBSCRIPTION_ID>"]
    }'
    

    AssignableScopes 値の <SUBSCRIPTION_ID> プレースホルダーは、必ずお持ちのサブスクリプション ID に置き換えてください。

  2. マネージド環境リソースのアカウントにカスタム ロールを割り当てます。

    マネージド環境のリソース ID を取得します。

    export ENVIRONMENT_ID=$(az containerapp env show \
        --name $ENVIRONMENT --resource-group $RESOURCE_GROUP \
        --query id \
        --output tsv)
    
  3. ユーザー アカウントにそのロールを割り当てます。

    このコマンドを実行する前に、プレースホルダー (<> かっこで示される) を、自分のユーザーまたはサービス プリンシパル ID と自分のロール名に置き換えます。

    az role assignment create \
        --assignee <USER_OR_SERVICE_PRINCIPAL_ID> \
        --role "<ROLE_NAME>" \
        --scope $ENVIRONMENT_ID
    

    Note

    通常 <USER_OR_SERVICE_PRINCIPAL_ID> 値は、Azure portal へのアクセスに使用する ID である必要があります。 <ROLE_NAME> 値は、手順 1 で割り当てた名前です。

  4. Spring 用 Eureka サーバー ダッシュボードの URL を取得します。

    az containerapp env java-component eureka-server-for-spring show \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_NAME \
        --query properties.ingress.fqdn \
        --output tsv
    

    このコマンドは、Spring 用 Eureka サーバー ダッシュボードへのアクセスに使用できる URL を返します。 ダッシュボードを使用すると、次のスクリーンショットに示すように、コンテナー アプリも表示できます。

    Spring 用 Eureka サーバー ダッシュボードを示すスクリーンショット。

省略可能: Eureka Server for Spring と Spring 用管理の Java コンポーネントを統合する

Eureka Server for Spring コンポーネントと Spring 用管理の Java コンポーネントを統合する場合は、「Spring 用マネージド管理を Eureka Server for Spring と統合する」を参照してください。

リソースをクリーンアップする

このチュートリアルで作成したリソースは、Azure の請求書に影響します。 これらのサービスを長期間使用しない場合は、次のコマンドを実行して、このチュートリアルで作成したすべてのものを削除してください。

az group delete --resource-group $RESOURCE_GROUP

Eureka Server for Spring で許可される構成のリスト

以降のセクションでは、サポートされている構成について説明します。 詳細については、Spring Cloud Eureka Server に関するページを参照してください。

Note

新機能のリクエストは、サポート チケットをお送りください。

構成オプション

az containerapp update コマンドは、--configuration パラメータを使用して Eureka Server for Spring の構成方法を制御します。 スペースで区切ることで、一度に複数のパラメーターを使用することが可能です。 詳細については、Spring Cloud Eureka Server に関するページを参照してください。

eureka.server 構成のプロパティでは、次の構成設定を使用できます。

名前 Description 規定値
eureka.server.enable-self-preservation 有効にすると、サーバーではサーバーから受け取る必要がある更新回数を記録します。 更新回数が eureka.server.renewal-percent-threshold で定義されたしきい値の割合を下回った場合。 元の Eureka サーバーでは、既定値は true に設定されていますが、Eureka Server の Java コンポーネントでは、既定値は false に設定されています。 Spring 用 Eureka サーバーの Java コンポーネントに関する制限事項の記事を参照してください。 false
eureka.server.renewal-percent-threshold eureka.server.renewal-threshold-update-interval-ms で指定された期間に顧客から期待される更新の最小割合。 更新がしきい値を下回った場合、eureka.server.enable-self-preservation が有効になっていると、有効期限は無効になります。 0.85
eureka.server.renewal-threshold-update-interval-ms eureka.server.renewal-percent-threshold で指定された、しきい値が更新される必要がある間隔。 0
eureka.server.expected-client-renewal-interval-seconds クライアントがハートビートを送信する間隔。 既定値は 30 秒です。 たとえば、クライアントが異なる頻度、たとえば 15 秒ごとにハートビートを送信する場合、このパラメーターはそれに応じて調整する必要があります。そうしないと、自己保存は期待どおりに機能しません。 30
eureka.server.response-cache-auto-expiration-in-seconds 変更イベントによってレジストリのペイロードが無効にされていない場合に、それをキャッシュに保持する時間を取得します。 180
eureka.server.response-cache-update-interval-ms クライアントのペイロード キャッシュを更新する時間間隔を取得します。 0
eureka.server.use-read-only-response-cache 現在 com.netflix.eureka.registry.ResponseCache は、応答に対して 2 レベルのキャッシュ戦略を使用します。 有効期限ポリシーを持つ readWrite キャッシュと、有効期限なしでキャッシュする readonly キャッシュ。 true
eureka.server.disable-delta 差分情報をクライアントに提供できるかどうかをチェックします。 false
eureka.server.retention-time-in-m-s-in-delta-queue クライアントが値を見逃すことなく取得できるように、差分情報をキャッシュする時間を取得します。 0
eureka.server.delta-retention-timer-interval-in-ms クリーンアップ タスクがウェイクアップして、期限切れの差分情報を確認する時間間隔を取得します。 0
eureka.server.eviction-interval-timer-in-ms インスタンスの有効期限が切れたタスクがウェイクアップして実行される時間間隔を取得します。 60000
eureka.server.sync-when-timestamp-differs タイムスタンプが異なる場合にインスタンスを同期させるかどうかをチェックします。 true
eureka.server.rate-limiter-enabled レート リミッターを有効にするか無効にするかを示します。 false
eureka.server.rate-limiter-burst-size レート リミッター、トークン バケット アルゴリズムのプロパティ。 10
eureka.server.rate-limiter-registry-fetch-average-rate レート リミッター、トークン バケット アルゴリズムのプロパティ。 平均適用要求率を指定します。 500
eureka.server.rate-limiter-privileged-clients 認定クライアントの一覧。 これは、標準の eureka Java クライアントに追加されます。 N/A
eureka.server.rate-limiter-throttle-standard-clients レート制限標準クライアントかどうかを示します。 false に設定すると、非標準クライアントのみレート制限されます。 false
eureka.server.rate-limiter-full-fetch-average-rate レート リミッター、トークン バケット アルゴリズムのプロパティ。 平均適用要求率を指定します。 100

一般的な構成

  • ログ関連の構成:
    • logging.level.*
    • logging.group.*
    • logging.* 名前空間の下位にあるその他の構成は、禁止される必要があります。たとえば、logging.file を使用したログ ファイルの書き込みを禁止します。

アプリケーション間の呼び出し

この例では、Eureka Server for Spring コンポーネントに登録されたアプリケーション間で呼び出すための Java コードの記述方法を示します。 コンテナー アプリが Eureka とバインドされると、Eureka サーバー経由で相互に通信します。

この例では、呼び出し元と呼び出し先の 2 つのアプリケーションを作成します。 両方のアプリケーションは、Eureka Server for Spring コンポーネントを使用して相互に通信します。 呼び出し先アプリケーションは、呼び出し元アプリケーションから呼び出しを受けるエンドポイントを公開します。

  1. 呼び出し先アプリケーションを作成します。 メイン クラスに @EnableDiscoveryClient 注釈を追加して、Spring Boot アプリケーションで Eureka クライアントを有効にします。

    @SpringBootApplication
    @EnableDiscoveryClient
    public class CalleeApplication {
      public static void main(String[] args) {
        SpringApplication.run(CalleeApplication.class, args);
      }
    }
    
  2. 呼び出し先アプリケーションは、呼び出し元アプリケーションから呼び出しを受けるエンドポイントを公開します。

    @RestController
    public class CalleeController {
    
        @GetMapping("/call")
        public String calledByCaller() {
            return "Hello from Application callee!";
        }
    }
    
  3. 呼び出し先アプリケーションの名前をアプリケーション構成ファイル (たとえば、application.yml) 内に設定します。

    spring.application.name=callee
    
  4. 呼び出し元アプリケーションを作成します。

    @EnableDiscoveryClient 注釈を追加して、Eureka クライアント機能を有効にします。 また、他のサービスへの負荷分散呼び出しを実行するために、@LoadBalanced 注釈を持つ WebClient.Builder Bean を作成します。

    @SpringBootApplication
    @EnableDiscoveryClient
    public class CallerApplication {
      public static void main(String[] args) {
        SpringApplication.run(CallerApplication.class, args);
      }
    
      @Bean
      @LoadBalanced
      public WebClient.Builder loadBalancedWebClientBuilder() {
        return WebClient.builder();
      }
    }
    
  5. アプリケーション名 callee を使用して呼び出し先アプリケーションを呼び出すために WebClient.Builder を使用する呼び出し元アプリケーションでコントローラーを作成します。

    @RestController
    public class CallerController {
        @Autowired
        private WebClient.Builder webClientBuilder;
    
        @GetMapping("/call-callee")
        public Mono<String> callCallee() {
            return webClientBuilder.build()
                .get()
                .uri("http://callee/call")
                .retrieve()
                .bodyToMono(String.class);
        }
    }
    

これで、Eureka Server for Spring Java コンポーネントを使用して相互に通信する呼び出し元アプリケーションと呼び出し先アプリケーションができました。 呼び出し元アプリケーションで /call-callee エンドポイントをテストする前に、両方のアプリケーションが実行され、Eureka サーバーとバインドされていることを確認してください。

制限事項

Eureka Server Java コンポーネントには、false に設定された既定の構成 eureka.server.enable-self-preservation が付属します。 この既定の構成は、自己保存を有効にした後にインスタンスが削除されない時間を回避するのに役立ちます。 インスタンスの削除が早すぎると、存在しないインスタンスに要求が行われる場合があります。 この設定を true に変更する場合は、Java コンポーネントに独自の構成を設定することでオーバーライドできます。

次のステップ

チュートリアル: Spring 用マネージド管理と Spring 用マネージド Eureka サーバーを統合する