教程:在 Azure 容器应用中创建高度可用的 Eureka 服务器组件群集

在本教程中,你将了解如何创建一个旨在面对故障和高需求时保持运行的 Eureka 服务。 构建高度可用的 Eureka 服务可确保无论需求如何,服务注册表始终可供客户端使用。

实现 Eureka 的高可用性状态涉及将多个 Eureka 服务器实例链接在一起形成群集。 群集提供资源,以便在一个 Eureka 服务器发生故障时,其他服务仍可用于请求。

在本教程中,你将了解:

  • 创建一个用于 Spring 组件的 Eureka 服务器。
  • 将两个用于 Spring 组件的 Eureka 服务器绑定到一个群集。
  • 将应用程序绑定到两个 Eureka 服务器,以便进行高可用性服务发现。

先决条件

注意事项

在 Azure 容器应用中运行托管 Java 组件时,请注意以下详细信息:

说明
范围 组件与连接的容器应用在同一环境中运行。
缩放 组件无法缩放。 缩放属性 minReplicasmaxReplicas 都设置为 1
资源 为组件分配的容器资源是固定的。 CPU 核心数为 0.5,内存大小为 1Gi。
定价 组件计费低于基于消耗量的定价。 托管组件消耗的资源按活动/空闲费率计费。 可以删除不再使用的组件以停止计费。
Binding 容器应用通过绑定连接到组件。 绑定将配置注入容器应用环境变量。 建立绑定后,容器应用可以从环境变量读取配置值并连接到该组件。

安装

使用以下步骤创建 Eureka 服务群集。

  1. 创建保存应用程序配置值的变量。

    export LOCATION=chinaeast
    export RESOURCE_GROUP=my-services-resource-group
    export ENVIRONMENT=my-environment
    export EUREKA_COMPONENT_FIRST=eureka01
    export EUREKA_COMPONENT_SECOND=eureka02
    export APP_NAME=sample-service-eureka-client
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-service-eureka-client:latest"
    
  2. 通过 Azure CLI 登录 Azure。

    az cloud set -n AzureChinaCloud
    az login
    # az cloud set -n AzureCloud   //means return to Public Azure.
    
  3. 创建资源组。

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. 创建容器应用环境。

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

创建群集

接下来,创建两个 Eureka 服务器实例并将它们作为群集链接在一起。

  1. 创建两个用于 Spring 组件的 Eureka 服务器。

    az containerapp env java-component eureka-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_FIRST
    
    az containerapp env java-component eureka-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_SECOND
    

将组件绑定在一起

若要使 Eureka 服务器在高可用性配置中正常工作,需要将它们链接在一起。

  1. 将第一个 Eureka 服务器绑定到第二个。

    az containerapp env java-component eureka-server-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_FIRST \
        --bind $EUREKA_COMPONENT_SECOND
    
  2. 将第二个 Eureka 服务器绑定到第一个。

    az containerapp env java-component eureka-server-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $EUREKA_COMPONENT_SECOND \
        --bind $EUREKA_COMPONENT_FIRST
    

部署和绑定应用程序

将服务器组件链接在一起后,可以创建容器应用并将其绑定到两个 Eureka 组件。

  1. 创建容器应用。

    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
    
  2. 将容器应用绑定到第一个 Eureka 服务器组件。

    az containerapp update \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --bind $EUREKA_COMPONENT_FIRST 
    
  3. 将容器应用绑定到第二个 Eureka 服务器组件。

    az containerapp update \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --bind $EUREKA_COMPONENT_SECOND
    

查看仪表板

重要

要查看仪表板,至少需要在托管环境资源上向你的帐户分配 Microsoft.App/managedEnvironments/write 角色。 可在资源上显式分配 OwnerContributor 角色,也可按照以下步骤创建自定义角色定义,并将其分配给你的帐户。

  1. 创建自定义角色定义。

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

    请确保将 AssignableScopes 值中 <> 括号之间的占位符替换为订阅 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 "Java Component Dashboard Access" \
        --scope $ENVIRONMENT_ID
    
  4. 获取适用于 Spring 的 Eureka 服务器仪表板的 URL。

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

    此命令会返回可用来访问适用于 Spring 的 Eureka 服务器仪表板的 URL。 通过仪表板,可以验证 Eureka 服务器设置是否包含两个副本。

    一个用于 Spring 的高可用性 Eureka 服务器仪表板的屏幕截图。

清理资源

本教程中创建的资源会影响 Azure 帐单。 如果不打算长期使用这些服务,请运行以下命令来删除本教程中创建的所有内容。

az group delete --resource-group $RESOURCE_GROUP