教程:在 Azure 容器应用中连接到适用于 Spring 的管理控制台

适用于 Spring 的控制台托管组件为公开执行器终结点的 Spring Boot Web 应用程序提供了一个管理界面。 作为 Azure 容器应用中的托管组件,可以轻松地将容器应用绑定到适用于 Spring 的控制台,以便无缝集成和管理。

本教程介绍如何创建适用于 Spring 的控制台 Java 组件并将其绑定到容器应用,以便轻松监视和管理 Spring 应用程序。

显示适用于 Spring 的控制台见解仪表板的概览的屏幕截图。

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

  • 创建适用于 Spring 的控制台 Java 组件。
  • 将容器应用绑定到适用于 Spring 的控制台 Java 组件。

若要将适用于 Spring 的控制台与 Eureka Server for Spring 集成,请参阅在容器应用中将适用于 Spring 的控制台与 Eureka Server for Spring 服务器集成

重要

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

先决条件

注意事项

在 Azure 容器应用中运行适用于 Spring 的控制台组件时,请注意以下详细信息:

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

安装

在开始使用适用于 Spring 的控制台组件之前,首先需要创建所需的资源。

以下命令可帮助你创建资源组和容器应用环境。

  1. 创建变量来支持应用程序配置。 这些值是为了本课程的目的而向你提供的。

    export LOCATION=chinaeast
    export RESOURCE_GROUP=my-resource-group
    export ENVIRONMENT=my-environment
    export JAVA_COMPONENT_NAME=admin
    export APP_NAME=sample-admin-client
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-admin-for-spring-client:latest"
    
    变量 说明
    LOCATION 创建容器应用和 Java 组件的 Azure 区域位置。
    ENVIRONMENT 演示应用程序的容器应用环境名称。
    RESOURCE_GROUP 演示应用程序的 Azure 资源组名称。
    JAVA_COMPONENT_NAME 为容器应用创建的 Java 组件的名称。 在本例中,你将创建适用于 Spring 的控制台 Java 组件。
    IMAGE 容器应用中使用的容器映像。
  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 \
        --query "properties.provisioningState"
    

    使用 --query 参数时,响应逐渐映像到简单的成功或失败消息。

  4. 创建容器应用环境。

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

使用组件

有了现有环境后,可以创建容器应用并将其绑定到适用于 Spring 的控制台组件的 Java 组件实例。

  1. 创建适用于 Spring 的控制台 Java 组件。

    az containerapp env java-component admin-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
        --min-replicas 1 \
        --max-replicas 1
    
  2. 更新适用于 Spring 的控制台 Java 组件。

    az containerapp env java-component admin-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
        --min-replicas 2 \
        --max-replicas 2
    

将容器应用绑定到适用于 Spring 的控制台 Java 组件

  1. 创建容器应用并绑定到适用于 Spring 的控制台组件。

    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 $JAVA_COMPONENT_NAME
    

绑定操作将容器应用绑定到适用于 Spring 的控制台 Java 组件。 容器应用现在可以从环境变量(主要是 SPRING_BOOT_ADMIN_CLIENT_URL 属性)读取配置值并连接到适用于 Spring 的控制台组件。

绑定还会注入以下属性:

"SPRING_BOOT_ADMIN_CLIENT_INSTANCE_PREFER-IP": "true",

此属性指示连接到适用于 Spring 的控制台服务器时,适用于 Spring 的控制台组件客户端应首选容器应用实例的 IP 地址。

可选:从适用于 Spring 的控制台 Java 组件取消绑定容器应用

若要从容器应用中移除绑定,请使用 --unbind 选项。

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

查看仪表板

重要

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

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

    az role definition create --role-definition '{
        "Name": "<ROLE_NAME>",
        "IsCustom": true,
        "Description": "Can access managed Java Component dashboards in managed environments",
        "Actions": [
            "Microsoft.App/managedEnvironments/write"
        ],
        "AssignableScopes": ["/subscriptions/<SUBSCRIPTION_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 的控制台仪表板的 URL。

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

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

    显示适用于 Spring 的控制台仪表板的概览的屏幕截图。

清理资源

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

az group delete --resource-group $RESOURCE_GROUP

依赖项

在你自己的容器应用中使用控制台组件时,需要在 pom.xml 文件中添加以下依赖项。 将版本号替换为 Maven 存储库上提供的最新版本。

<dependency>
    <groupId>de.codecentric</groupId>
    <version>3.3.2</version>
    <artifactId>spring-boot-admin-starter-client</artifactId>
</dependency>

可配置属性

从 Spring Boot 2 开始,默认情况下,不会公开除 healthinfo 以外的终结点。 可通过在 application.properties 文件中添加以下配置来公开它们。

management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

“适用于 Spring 的控制台”的允许配置列表

以下列表详细介绍了可为应用配置的控制台组件属性。 有关详细信息,请参阅 Spring Boot 控制台

属性名称 说明 默认值
spring.boot.admin.server.enabled 启用 Spring Boot 控制台服务器。 true
spring.boot.admin.context-path 管理为服务器静态资产和 API 提供服务的路径前缀。 相对于 Dispatcher-Servlet。
spring.boot.admin.monitor.status-interval 检查实例状态的时间间隔(以毫秒为单位)。 10,000ms
spring.boot.admin.monitor.status-lifetime 状态的生存期(以毫秒为单位)。 只要上一状态未过期,状态就不会更新。 10,000 毫秒
spring.boot.admin.monitor.info-interval 检查实例信息的时间间隔(以毫秒为单位)。 1m
spring.boot.admin.monitor.info-lifetime 信息生存期(以分钟为单位)。 只要上一信息未过期,信息就不会更新。 1m
spring.boot.admin.monitor.default-timeout 发出请求时的默认超时。 可使用 spring.boot.admin.monitor.timeout.* 替代特定终结点的单个值。 10,000
spring.boot.admin.monitor.timeout.* 带有每个 endpointId 超时的键值对。 默认值为 default-timeout 值。
spring.boot.admin.monitor.default-retries 失败请求的默认重试次数。 永远不会重试修改数据(PUTPOSTPATCHDELETE)的请求。 可使用 spring.boot.admin.monitor.retries.* 替代特定终结点的单个值。 0
spring.boot.admin.monitor.retries.* 带有每个 endpointId 重试次数的键值对。 永远不会重试修改数据(PUTPOSTPATCHDELETE)的请求。 默认值为 default-retries 值。
spring.boot.admin.metadata-keys-to-sanitize 匹配这些正则表达式模式(用于在所有 JSON 输出中清理)的键的元数据值。 从 Spring Boot 3 开始,默认屏蔽所有执行器值。 有关如何配置取消清理过程的详细信息,请参阅清理敏感值 ".*password$", ".*secret$", ".*key$", ".*token$", ".*credentials.*", ".*vcap_services$"
spring.boot.admin.probed-endpoints 对于 Spring Boot 1.x 客户端应用程序,Spring Boot 控制台使用 OPTIONS 请求探测指定终结点。 如果路径与 ID 不同,可将此值指定为 id:path,例如,health:ping "health", "env", "metrics", "httptrace:trace", "threaddump:dump", "jolokia", "info", "logfile", "refresh", "flyway", "liquibase", "heapdump", "loggers", "auditevents"
spring.boot.admin.instance-proxy.ignored-headers 向客户端发出请求时不转发的标头。 "Cookie", "Set-Cookie", "Authorization"
spring.boot.admin.ui.title 显示的页标题。 "Spring Boot Admin"
spring.boot.admin.ui.poll-timer.cache 提取新缓存数据的轮询持续时间(以毫秒为单位)。 2500
spring.boot.admin.ui.poll-timer.datasource 提取新数据源数据的轮询持续时间(以毫秒为单位)。 2500
spring.boot.admin.ui.poll-timer.gc 提取新 GC 数据的轮询持续时间(以毫秒为单位)。 2500
spring.boot.admin.ui.poll-timer.process 提取新进程数据的轮询持续时间(以毫秒为单位)。 2500
spring.boot.admin.ui.poll-timer.memory 提取新内存数据的轮询持续时间(以毫秒为单位)。 2500
spring.boot.admin.ui.poll-timer.threads 提取新线程数据的轮询持续时间(以毫秒为单位)。 2500
spring.boot.admin.ui.poll-timer.logfile 提取新日志文件数据的轮询持续时间(以毫秒为单位)。 1000
spring.boot.admin.ui.enable-toasts 启用或禁用 toast 通知。 false
spring.boot.admin.ui.title 浏览器的窗口标题值。 ""
spring.boot.admin.ui.brand 导航标头中呈现的 HTML 代码,默认为 Spring Boot 控制台标签。 默认情况下,Spring Boot 控制台徽标后跟其名称。 ""
management.scheme 在用于访问执行器终结点的服务 URL 中替换的值。
management.address 在用于访问执行器终结点的服务 URL 中替换的值。
management.port 在用于访问执行器终结点的服务 URL 中替换的值。
management.context-path 追加到用于访问执行器终结点的服务 URL 的值。 ${spring.boot.admin.discovery.converter.management-context-path}
health.path 追加到用于进行运行状况检查的服务 URL 的值。 被 EurekaServiceInstanceConverter 忽略。 ${spring.boot.admin.discovery.converter.health-endpoint}
spring.boot.admin.discovery.enabled 启用对控制台服务器的 DiscoveryClient 支持。 true
spring.boot.admin.discovery.converter.management-context-path management-url 值由 DefaultServiceInstanceConverter 转换时,追加到所发现服务的 service-url 的值。 /actuator
spring.boot.admin.discovery.converter.health-endpoint-path health-url 值由 DefaultServiceInstanceConverter 转换时,追加到所发现服务的 management-url 的值。 "health"
spring.boot.admin.discovery.ignored-services 使用发现且未注册为应用程序时忽略的服务。 支持简单模式,例如 "foo*""*bar""foo*bar*"
spring.boot.admin.discovery.services 使用发现且注册为应用程序时包括的服务。 支持简单模式,例如 "foo*""*bar""foo*bar*" "*"
spring.boot.admin.discovery.ignored-instances-metadata 如果服务包含至少一个与此列表中的模式匹配的元数据项,则忽略这些服务。 支持 "discoverable=false" 等模式。
spring.boot.admin.discovery.instances-metadata 如果服务包含至少一个与列表中的模式匹配的元数据项,则包括这些服务。 支持 "discoverable=true" 等模式。

常见配置

  • 日志记录相关配置:
    • logging.level.*
    • logging.group.*
    • 应禁止 logging.* 命名空间下的任何其他配置。 例如,应禁止使用 logging.file 写入日志文件。

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