閱讀英文

共用方式為

教程:在 Azure 容器应用中连接到托管 Eureka Server for Spring

Eureka Server for Spring 是一种服务注册表,允许微服务自行注册和发现其他服务。 Eureka Server for Spring 可用作 Azure 容器应用组件。 可以将容器应用绑定到 Eureka Server for Spring,以便自动注册到 Eureka Server。

本教程介绍如何执行下列操作:

  • 创建 Eureka Server for Spring Java 组件。
  • 将容器应用绑定到 Eureka Server for Spring Java 组件。

重要

本教程使用的服务可能会影响 Azure 帐单。 如果你决定按照步骤操作,请确保删除本文中特别推荐的资源,以避免意外计费。

先决条件

注意事项

在容器应用中运行 Eureka Server for Spring 时,请注意以下详细信息:

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

安装

在开始使用 Eureka Server for Spring 组件之前,首先需要创建所需的资源。

要创建为创建容器应用所必要的每个资源,请遵照以下步骤操作:

  1. 在 Azure 门户中搜索“容器应用”,然后选择“创建”

  2. 在“基本信息”选项卡上,输入下列值:

    属性
    订阅 选择 Azure 订阅。
    资源组 选择“新建”来创建一个名为 my-resource-group 的新资源组。
    容器应用名称 输入“my-eureka-client”。
    部署源 选择“容器映像”
    区域 选择离你最近的区域。
    容器应用环境 选择“新建”以创建新环境。
  3. 在“创建容器应用环境”窗口中,输入以下值:

    属性 Value
    环境名称 输入“my-environment”。
    区域冗余 选择“已禁用”。
  4. 选择“创建”,然后选择“容器”选项卡。

  5. 在“容器”选项卡中,输入以下值:

    属性
    名称 输入“my-eureka-client”。
    映像源 选择“Docker Hub 或其他注册表”。
    图像类型 选择“公共”。
    注册表登录服务器 输入 mcr.microsoft.com
    映像和标记 输入“javacomponents/samples/sample-service-eureka-client:latest”
  6. 选择“入口”选项卡

  7. 在“入口”选项卡中,输入以下值,并在窗体的其余部分中填充默认值。

    属性 Value
    流入量 选择启用
    入口流量 选择“接受来自任何位置的流量”
    入口类型 选择 HTTP
    目标端口 输入“8080”
  8. 选择“查看 + 创建”。

  9. 验证检查通过后,选择“创建”以创建容器应用。

创建适用于 Spring 的 Eureka 服务器 Java 组件

有了现有的环境和 Eureka 客户端容器应用后,你现在可以创建 Eureka Server for Spring 的 Java 组件实例。

  1. 在门户中转到你的容器应用环境。

  2. 在服务菜单上的“服务”下,选择“服务”

  3. 选择“配置”下拉列表,然后选择“Java 组件”。

  4. 在“配置 Java 组件”面板中,输入以下值

    属性 Value
    Java 组件类型 选择“Eureka Server for Spring”。
    Java 组件名称 输入“eureka”。
  5. 选择下一步

  6. 在“查看”选项卡中,选择“配置”

将容器应用绑定到适用于 Spring 的 Eureka 服务器 Java 组件

  1. 在门户中转到你的容器应用环境。

  2. 在服务菜单上的“服务”下,选择“服务”

  3. 从列表中选择“eureka”。

  4. 在“绑定”下,选择“应用名称”下拉列表,然后选择 my-eureka-client

  5. 选择“审阅”选项卡。

  6. 选择配置

  7. 在门户中返回到你的容器应用。 将你的应用的 URL 复制到文本编辑器,以便在下一步中使用。

在门户中返回到容器应用。 将你的应用的 URL 复制到文本编辑器,以便在下一步中使用。

转至 /allRegistrationStatus 路由,查看注册到 Eureka Server for Spring 组件的所有应用程序。

绑定将多个配置以环境变量的形式注入应用程序,这些配置主要是 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 Server。 此注册会覆盖 application.properties 中来自配置服务器等的本地设置。 如果要将其设置为 false,可以通过在容器应用中设置环境变量来覆盖它。

由于容器应用环境中的特定域名系统解析规则,eureka.instance.prefer-ip-address 属性被设置为 true。 不要修改此值,以免破坏绑定。

可选:从 Eureka Server for Spring Java 组件取消绑定容器应用

  1. 在门户中转到你的容器应用环境。

  2. 在服务菜单上的“服务”下,选择“服务”

  3. 从列表中选择“eureka”。

  4. 在“绑定”下,找到 my-eureka-client 行,然后选择它。 然后选择“删除”。

  5. 选择下一步

  6. 选择“审阅”选项卡。

  7. 选择配置

通过仪表板查看应用程序

重要

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

  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
    

    注意

    <USER_OR_SERVICE_PRINCIPAL_ID> 值通常是用于访问 Azure 门户的标识。 <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
    

    此命令会返回可用来访问 Eureka Server for Spring 仪表板的 URL。 使用该仪表板,还可查看容器应用,如以下屏幕截图所示。

    显示 Eureka Server for Spring 仪表板的屏幕截图。

可选:将适用于 Spring 的 Eureka 服务器和适用于 Spring 的控制台 Java 组件集成

若要将适用于 Spring 的 Eureka 服务器与适用于 Spring 的控制台 Java 组件集成,请参阅将适用于 Spring 的管理控制台与适用于 Spring 的 Eureka 服务器集成

清理资源

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

az group delete --resource-group $RESOURCE_GROUP

Eureka Server for Spring 的允许配置列表

以下各部分描述了支持的配置。 有关详细信息,请参阅 Spring Cloud Eureka 服务器

注意

请提交新功能请求的支持票证。

配置选项

az containerapp update命令使用--configuration参数控制 Eureka Server for Spring 的配置方式。 只要多个参数被空格分隔,就可以一次性使用它们。 有关详细信息,请参阅 Spring Cloud Eureka 服务器

eureka.server 配置属性上提供了以下配置设置:

名称 说明 默认值
eureka.server.enable-self-preservation 启用后,服务器会跟踪应从服务器接收的续订数。 无论何时,续订数都低于 eureka.server.renewal-percent-threshold 定义的阈值百分比。 在原始 Eureka 服务器中,默认值设置为true,但在 Eureka Server Java 组件中,默认值设置为false。 请参阅 Eureka Server for Spring 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 当前对响应使用两级缓存策略。 具有过期策略的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 写入日志文件。

应用程序之间的调用

此示例演示如何编写 Java 代码,以便在使用 Eureka Server for Spring 组件注册的应用程序之间进行调用。 当容器应用与 Eureka 绑定时,它们通过 Eureka 服务器相互通信。

该示例创建两个应用程序,即调用方和被调用方。 两个应用程序都使用 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豆,以执行对其他服务的负载均衡调用。

    @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. 在调用方应用程序中创建控制器,该控制器使用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 组件附带默认配置,eureka.server.enable-self-preservation设置为false。 此默认配置有助于避免启用自保存后未删除实例的时间。 如果实例太早删除,则一些请求可能会定向到不存在的实例。 如果要将此设置更改为true,可以在 Java 组件中设置自己的配置以覆盖此设置。

后续步骤

教程:将适用于 Spring 的管理控制台与适用于 Spring 的 Eureka 服务器集成