チュートリアル: 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 の請求書に影響する可能性のあるサービスを使用します。 手順に従う場合は、予期しない課金を回避するために、この記事で紹介されているリソースを必ず削除してください。
前提条件
考慮事項
Container Apps で Spring 用 Eureka サーバーを実行する場合は、次の詳細に注意してください。
項目 | 説明 |
---|---|
範囲 | Eureka Server for Spring コンポーネントは、接続されているコンテナー アプリと同じ環境で実行されます。 |
スケーリング | Spring 用 Eureka サーバー コンポーネントは、スケーリングできません。 スケーリング プロパティ minReplicas と maxReplicas は両方とも 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 サーバー コンポーネントの操作を開始する前に、まず、必要なリソースを作成する必要があります。
次のコマンドを実行して、コンテナー アプリ環境にリソース グループを作成します。
アプリケーション構成をサポートする変数を作成します。 これらの値は、このレッスンのために提供されています。
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
コンテナー アプリで使用されるコンテナー イメージ。 Azure CLI を使用して Azure にサインインします。
az login
リソース グループを作成する。
az group create --name $RESOURCE_GROUP --location $LOCATION
コンテナー アプリ環境を作成します。
az containerapp env create \ --name $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --location $LOCATION
Eureka Server for Spring の Java コンポーネントを作成する
既存の環境が作成されたので、コンテナー アプリを作成し、Eureka Server for Spring の Java コンポーネント インスタンスにバインドできます。
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
省略可能: 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 コンポーネントにバインドする
コンテナー アプリを作成し、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
今後の手順で使用できるように、アプリの 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
ロールを明示的に割り当てられます。 また、手順に従ってカスタム ロール定義を作成し、アカウントに割り当てることもできます。
カスタム ロールの定義を作成します。
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 に置き換えてください。マネージド環境リソースのアカウントにカスタム ロールを割り当てます。
マネージド環境のリソース ID を取得します。
export ENVIRONMENT_ID=$(az containerapp env show \ --name $ENVIRONMENT --resource-group $RESOURCE_GROUP \ --query id \ --output tsv)
ユーザー アカウントにそのロールを割り当てます。
このコマンドを実行する前に、プレースホルダー (
<>
かっこで示される) を、自分のユーザーまたはサービス プリンシパル 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 で割り当てた名前です。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 を返します。 ダッシュボードを使用すると、次のスクリーンショットに示すように、コンテナー アプリも表示できます。
省略可能: 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 コンポーネントを使用して相互に通信します。 呼び出し先アプリケーションは、呼び出し元アプリケーションから呼び出しを受けるエンドポイントを公開します。
呼び出し先アプリケーションを作成します。 メイン クラスに
@EnableDiscoveryClient
注釈を追加して、Spring Boot アプリケーションで Eureka クライアントを有効にします。@SpringBootApplication @EnableDiscoveryClient public class CalleeApplication { public static void main(String[] args) { SpringApplication.run(CalleeApplication.class, args); } }
呼び出し先アプリケーションは、呼び出し元アプリケーションから呼び出しを受けるエンドポイントを公開します。
@RestController public class CalleeController { @GetMapping("/call") public String calledByCaller() { return "Hello from Application callee!"; } }
呼び出し先アプリケーションの名前をアプリケーション構成ファイル (たとえば、application.yml) 内に設定します。
spring.application.name=callee
呼び出し元アプリケーションを作成します。
@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(); } }
アプリケーション名 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 コンポーネントに独自の構成を設定することでオーバーライドできます。