Spring Boot Admin是一个以代码为中心的社区项目,用于管理和监视Spring Boot®应用程序。 这些应用程序通过HTTP在我们的Spring Boot Admin Client中注册,或者是通过Spring Cloud®(例如,Eureka,Consul)发现的。 UI只是Spring Boot Actuator端点之上的Vue.js应用程序。
使用Pyctuator可获得对Python应用程序的支持。
Spring Boot Admin 的源码参见 https://github.com/codecentric/spring-boot-admin
Spring Boot Admin 的文档参见 https://codecentric.github.io/spring-boot-admin/2.3.1/
一 快速启动
1.1 设置Spring Boot Admin Server
首先,您需要设置服务器。 为此,只需设置一个简单的启动项目(使用start.spring.io)。 由于Spring Boot Admin Server能够作为servlet或webflux应用程序运行,因此您需要对此进行决定并添加相应的Spring Boot Starter。 在此示例中,我们使用Servlet Web Starter。
1 首先在项目里添加以下依赖
1 | <dependency> |
注意spring-boot-admin-starter-server里已经包含了以下依赖
1 | <dependency> |
在配置时无须重复添加。
2 接下来在项目里添加以下代码
1 |
|
注意不要忘了添加@EnableAdminServer
注解
配置后启动项目,即可通过 http://localhost:8080/ 访问了。
1.2 配置Spring Boot Admin Client
要在SBA服务器上注册您的应用程序,您可以包括SBA客户端或使用Spring Cloud Discovery(例如Eureka,Consul等)。 在SBA服务器端,还有一个使用静态配置的简单选项。
每个要注册的应用程序都必须包含Spring Boot Admin Client。 为了保护端点,还添加了spring-boot-starter-security。
1 首先在项目里添加以下依赖
1 | <dependency> |
注意,在spring-boot-admin-starter-client
中已经包含了以下依赖
1 | <dependency> |
而 spring-boot-admin-client
中则又包含了
1 | <dependency> |
因此在配置时如果时大型项目,需要关注下各个版本间的依赖关系,防止冲突。
2 接下来配置指向的Spring Boot Admin Server服务器地址
在配置文件里添加以下代码
1 | spring.boot.admin.client.url=http://localhost:8080 |
在上述配置中,spring.boot.admin.client.url
指向的是在1.1中配置的Spring Boot Admin Server服务器的地址
Spring Boot 2默认情况下大多数端点都不通过http公开的,在这里我们公开了所有端点。如果是在生产环境下,您应该仔细选择要公开的端点。
完成上述配置后,在 http://localhost:8080/ 即可观察监控信息了。
1.3 扩展配置
上述配置只是最简配置,可以观看基本的信息,如果需要监控各种的信息,可以进行扩展配置。
在配置文件里添加以下配置
1 | # Actuator Web 访问端口 |
1.3.1 显示版本信息
对于Spring Boot应用程序,显示版本的最简单方法是使用spring-boot-maven-plugin中的build-info目标,该目标会生成META-INF / build-info.properties。 另请参阅《 Spring Boot参考指南》。
对于非Spring Boot应用程序,您可以向注册元数据添加版本或build.version,版本将显示在应用程序列表中。
此时,需要在项目的pom文件里添加以下配置
1 | <build> |
1.3.2 JMX-Bean Management
要在管理界面中与JMX bean进行交互,您必须在应用程序中包含Jolokia。 由于Jolokia是基于servlet的,因此不支持反应式应用程序。 如果您使用的是spring-boot-admin-starter-client,那么如果没有将Jolokia添加到您的依赖项中,它将为您使用。 在Spring Boot 2.2.0中,如果要通过JMX公开Spring Bean,则可能需要设置
1 | spring.jmx.enabled = true。 |
然后再项目依赖里添加
1 | <dependency> |
1.3.3 日志文件查看器
默认情况下,日志文件无法通过执行器端点访问,因此在Spring Boot Admin中不可见。 为了启用日志文件执行器端点,您需要通过设置logging.file.path或logging.file.name来配置Spring Boot写入日志文件。
Spring Boot Admin将检测所有看起来像URL的内容,并将其呈现为超链接。
还支持ANSI颜色转义。 您需要设置一个自定义文件日志模式,因为Spring Boot的默认模式不使用颜色。
在配置文件里添加以下配置
1 | logging.file.name=/var/log/sample-boot-application.log |
1.3.4 按实例显示标签
标签是一种为每个实例添加视觉标记的方法,它们将出现在应用程序列表以及实例视图中。 默认情况下,不将标签添加到实例,并且由客户端决定是否要通过将信息添加到元数据或信息端点来指定所需的标签。
在配置文件里添加以下配置
1 | #using the metadata |
二 加入安全配置
在第一章的示例是没有添加安全配置的,无须登录就能查看所有的监控信息,这是在生产环境中是不合适的,需要加入安全配置,在这里对第一章中的示例进行以下安全改造。
2.1 Spring Boot Admin Server安全配置
由于在分布式Web应用程序中有多种解决认证和授权的方法,因此Spring Boot Admin并未提供默认方法。 默认情况下,spring-boot-admin-server-ui提供一个登录页面和一个注销按钮。
1 在项目的依赖里添加以下配置
1 | <dependency> |
2 在项目里添加以下文件
1 | package com.yishuifengxiao.common.adminserver; |
完成上述配置后,重新启动项目,此时再次访问服务端 http://localhost:8080/ 就会跳转到登录页面,登录页面的用户名为在上面配置的 user ,密码为上面配置的 password 。
在服务端添加安全配置后,此时客户端不能直接注册到服务器上,需要添加安全信息。
此时需要在客户端添加以下配置
1 | spring.boot.admin.client.username=user |
这里配置的用户名和密码是服务端配置的用户名和密码。
2.2 Spring Boot Admin Client安全配置
在上述所有的配置中,客户端均未添加安全配置,当使用HTTP Basic身份验证保护执行器端点时,SBA Server需要凭据才能访问它们。 您可以在注册应用程序时在元数据中提交凭据。 然后,BasicAuthHttpHeaderProvider使用此元数据添加Authorization标头,以访问应用程序的执行器端点。 您可以提供自己的HttpHeadersProvider来更改行为(例如添加一些解密)或添加额外的标头。
SBA服务器会屏蔽HTTP接口中的某些元数据,以防止敏感信息泄漏。
通过元数据提交凭据时,应为SBA服务器或(服务注册表)配置HTTPS。
使用Spring Cloud Discovery时,您必须知道任何可以查询您的服务注册表的人都可以获取证书。
使用这种方法时,SBA Server会决定用户是否可以访问注册的应用程序。 (使用OAuth2)可以使用更复杂的解决方案,让客户端决定用户是否可以访问端点。 为此,请查看joshiste / spring-boot-admin-samples中的示例。
此时,需要在客户端的配置文件里添加以下配置
1 | spring.boot.admin.client: |
2.3 SBA服务器
您可以通过管理服务器中的配置属性指定凭据。
要启用从属性中提取凭据,spring.boot.admin.instance-auth.enabled属性必须为true(默认值)。
如果您的客户通过元数据(即通过服务注释)提供凭据,则将使用该元数据代替属性。
您可以通过设置spring.boot.admin.instance-auth.default-user-name和spring.boot.admin.instance-auth.default-user-password来提供默认的用户名和密码。 (可选)您可以使用spring.boot.admin.instance-auth.service-map。。user-name模式为特定服务(按名称)提供凭据,用服务名称替换。
application.yml
1 | spring.boot.admin: |
2.4 Eureka中配置
application.yml
1 | eureka: |
2.5 CSRF on Actuator Endpoints
一些执行器端点(例如/ loggers)支持POST请求。 使用Spring Security时,您需要忽略CSRF-Protection的执行器端点,因为Spring Boot Admin Server当前缺乏支持。
1 | @Override |
三 微服务监控
3.1 Spring Cloud Discovery
如果您已经将Spring Cloud Discovery用于您的应用程序,则不需要SBA客户端。 只需将DiscoveryClient添加到Spring Boot Admin Server中,其余的由我们的自动配置完成。
以下步骤使用Eureka,但也支持其他Spring Cloud Discovery实施。 有使用Consul和Zookeeper的示例。
1 首先添加spring-cloud-starter-eureka依赖
1 | <dependency> |
2 添加文件
1 |
|
为了简洁起见,我们暂时禁用安全性。 查看有关如何处理安全终结点的安全性部分。
3 告诉Eureka客户端在哪里可以找到服务注册表:
application.yml
1 | eureka: #Eureka客户端的配置部分 |
您可以将Spring Boot Admin Server包含到Eureka服务器中。 如上所述设置所有内容,并将spring.boot.admin.context-path设置为不同于“ /”的名称,以使Spring Boot Admin Server用户界面不会与Eureka的用户界面冲突。
更多细节参见官方示例程序 spring-boot-admin-sample-eureka
3.2 Spring Clouds DiscoveryClient
Spring Boot Admin Server可以使用Spring Clouds DiscoveryClient来发现应用程序。 这样做的好处是客户端不必包括spring-boot-admin-starter-client。 您只需将DiscoveryClient实现添加到管理服务器-其他所有操作均由自动配置完成。
1 使用SimpleDiscoveryClient进行静态配置
Spring Cloud提供了一个SimpleDiscoveryClient。 它允许您通过静态配置指定客户端应用程序:
pom.xml
1 | <dependency> |
application.yml
1 | spring: |
Spring Boot Admin支持Spring Cloud的DiscoveryClient的所有其他实现(Eureka,Zookeeper,Consul等)。 您需要将其添加到Spring Boot Admin Server并正确配置。 上面显示了使用Eureka的示例设置。
3.3 转换服务实例
服务注册表中的信息由ServiceInstanceConverter转换。 Spring Boot Admin附带了默认和Eureka转换器实现。 通过自动配置选择正确的一个。
您可以使用SBA Server配置选项和实例元数据来修改来自注册表的信息如何用于注册应用程序。 元数据中的值优先于服务器配置。 如果大量选项无法满足您的需求,则可以提供自己的ServiceInstanceConverter。
使用Eureka时,会使用Eureka已知的healthCheckUrl进行健康检查,可以使用eureka.instance.healthCheckUrl在您的客户端上进行设置。
实例元数据选项(Instance metadata options)
Key | Value | Default value |
---|---|---|
user.name user.password | 用于访问端点的凭据。 | |
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} |
发现配置选项(Discovery configuration options)
Property name | Description | Default value |
---|---|---|
spring.boot.admin.discovery.enabled | 为管理服务器启用DiscoveryClient支持。 | true |
spring.boot.admin.discovery.converter.management-context-path | 由DefaultServiceInstanceConverter转换管理URL时,将附加到发现的服务的服务URL上 | /actuator |
spring.boot.admin.discovery.converter.health-endpoint-path | 当HealthURL由DefaultServiceInstanceConverter转换时,将附加到发现的服务的管理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”) |
如果要将应用程序部署到CloudFoundry,则必须将vcap.application.application_id和vcap.application.instance_index添加到元数据中,以便在Spring Boot Admin Server中正确注册应用程序。 这是Eureka的示例配置:
application.yml
1 | eureka: |
四 详细配置
4.1 客户端详细配置
Spring Boot Admin Client在管理服务器上注册应用程序。 这是通过定期向SBA服务器发出HTTP发布请求来提供有关应用程序的信息来完成的。
有许多属性可以影响SBA客户端注册应用程序的方式。 如果不符合您的需求,您可以提供自己的ApplicationFactory实现。
Property name | Description | Default value |
---|---|---|
spring.boot.admin.client.enabled | 启用Spring Boot Admin Client。 | true |
spring.boot.admin.client.url | 要在其中注册的Spring Boot Admin服务器的URL的逗号分隔排序列表。 这将触发自动配置。 必选 | |
spring.boot.admin.client.api-path | 管理服务器上注册端点的Http路径。 | "instances" |
spring.boot.admin.client.username spring.boot.admin.client.password | 如果SBA Server api受HTTP Basic身份验证保护,则为用户名和密码。 | |
spring.boot.admin.client.period | 重复注册的时间间隔(以毫秒为单位) | 10,000 |
spring.boot.admin.client.connect-timeout | 连接注册超时(以毫秒为单位) | 5,000 |
spring.boot.admin.client.read-timeout | 读取注册超时(以毫秒为单位) | 5,000 |
spring.boot.admin.client.auto-registration | 如果设置为true,则在应用程序准备好之后,将自动安排注册应用程序的定期任务 | true |
spring.boot.admin.client.auto-deregistration | 当上下文关闭时,切换为在Spring Boot Admin服务器上启用自动解密。 如果未设置该值,则在检测到正在运行的CloudPlatform时,该功能将处于活动状态。 | null |
spring.boot.admin.client.register-once | 如果设置为true,则客户端将仅在一个管理服务器上注册(按spring.boot.admin.instance.url定义的顺序); 如果该管理服务器出现故障,将自动向下一个管理服务器注册。 如果为false,则会向所有管理服务器注册。 | true |
spring.boot.admin.client.instance.health-url | 要注册的健康网址。 如果可访问URL不同(例如Docker),则可以覆盖。 在注册表中必须唯一。 | Guessed based on management-url and endpoints.health.id . |
spring.boot.admin.client.instance.management-base-url | 用于计算要注册的管理URL的基本URL。 该路径是在运行时推断的,并附加到基本URL。 | Guessed based on management.port , service-url and server.servlet-path . |
spring.boot.admin.client.instance.management-url | 要注册的管理网址。 如果可访问的网址不同(例如Docker),则可以覆盖。 | Guessed based on management-base-url and management.context-path . |
spring.boot.admin.client.instance.service-base-url | 用于计算要注册的服务URL的基本URL。 该路径是在运行时推断的,并附加到基本URL。 在Cloudfoundry环境中,您可以像这样切换到 spring.boot.admin.client.instance.service-base-url=https://${vcap.application.uris[0]} |
Guessed based on hostname, server.port . |
spring.boot.admin.client.instance.service-url | 要注册的服务网址。 如果可访问的网址不同(例如Docker),则可以覆盖。 | Guessed based on service-base-url and server.context-path . |
spring.boot.admin.client.instance.service-path | 要注册的服务路径。 在可达路径不同的情况下可以覆盖(例如,以编程方式设置的上下文路径)。 | / |
spring.boot.admin.client.instance.name | 要注册的名称。 | ${spring.application.name} if set, "spring-boot-application" otherwise. |
spring.boot.admin.client.instance.prefer-ip | 在猜测的网址中使用ip地址而不是主机名。 如果设置了server.address / management.address,它将被使用。 否则,将使用从InetAddress.getLocalHost()返回的IP地址。 | false |
spring.boot.admin.client.instance.metadata.* | 要与此实例相关联的元数据键值对。 | |
spring.boot.admin.client.instance.metadata.tags.* | 标记作为要与此实例相关联的键值对。 |
4.2 服务端详细配置
如果Spring Boot Admin服务器在反向代理后面运行,则可能需要配置该服务器可通过(spring.boot.admin.ui.public-url)到达的公共URL。 此外,当反向代理终止https连接时,可能需要配置
1 | server.forward-headers-strategy = native |
Property name | Description | Default value |
---|---|---|
spring.boot.admin.context-path | 上下文路径在应为Admin Server静态资产和API提供服务的路径之前加上前缀。 相对于Dispatcher-Servlet | |
spring.boot.admin.monitor.status-interval | 检查实例状态的时间间隔 | 10,000ms |
spring.boot.admin.monitor.status-lifetime | 终身身份。 只要最后一个状态没有过期,该状态就不会更新。 | 10,000ms |
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都有超时的键值对。 默认为默认超时。 | |
spring.boot.admin.monitor.default-retries | 失败请求的默认重试次数。 永远不会重试修改请求(PUT,POST,PATCH,DELETE)。 可以使用spring.boot.admin.monitor.retries。*覆盖特定端点的各个值。 | 0 |
spring.boot.admin.monitor.retries.* | 键值对,具有每个endpointId的重试次数。 默认为默认重试。 永远不会重试修改请求(PUT,POST,PATCH,DELETE) | |
spring.boot.admin.metadata-keys-to-sanitize | 匹配这些正则表达式模式的键的元数据值将在所有json输出中被清除。 | ".**password$", ".\*secret$", ".\*key$", ".\*token$", ".\*credentials.**", ".*vcap_services$" |
spring.boot.admin.probed-endpoints | 对于Spring Boot 1.x客户端应用程序,SBA使用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-auth.enabled | 启用从Spring配置属性中提取凭证 | true |
spring.boot.admin.instance-auth.default-user-name | 用于验证注册服务的默认用户名。 spring.boot.admin.instance-auth.enabled属性必须为true。 | null |
spring.boot.admin.instance-auth.default-user-password | 用于验证注册服务的默认用户密码。 spring.boot.admin.instance-auth.enabled属性必须为true。 | null |
spring.boot.admin.instance-auth.service-map.*.user-name | 用于使用指定名称对注册的服务进行身份验证的用户名。 spring.boot.admin.instance-auth.enabled属性必须为true | |
spring.boot.admin.instance-auth.service-map.*.user-password | 用户密码,用于使用指定名称对注册的服务进行身份验证。 spring.boot.admin.instance-auth.enabled属性必须为true。 | |
spring.boot.admin.instance-proxy.ignored-headers | 向客户提出请求时,不转发标题。 | "Cookie", "Set-Cookie", "Authorization" |
spring.boot.admin.ui.public-url | 用于在ui中建立基本href的基本URL。 | If running behind a reverse proxy (using path rewriting) this can be used to make correct self references. If the host/port is omitted it will be inferred from the request. |
spring.boot.admin.ui.brand | 要在导航栏中显示的品牌。 | "<img src="assets/img/icon-spring-boot-admin.svg"><span>Spring Boot Admin</span>" |
spring.boot.admin.ui.title | 要显示的页面标题。 | "Spring Boot Admin" |
spring.boot.admin.ui.login-icon | 在登录页面上用作图像的图标。 | "assets/img/icon-spring-boot-admin.svg" |
spring.boot.admin.ui.favicon | 用作默认图标的图标和用于桌面通知的图标。 | "assets/img/favicon.png" |
spring.boot.admin.ui.favicon-danger | 当一项或多项服务关闭并用于桌面通知时,用作网站图标。 | "assets/img/favicon-danger.png" |
spring.boot.admin.ui.remember-me-enabled | 切换为在登录页面上显示/隐藏“记住我”复选框。 | true |
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 |
五 监控通知
邮件通知将作为使用Thymeleaf模板呈现的HTML电子邮件进行传递。 要启用邮件通知,请使用spring-boot-starter-mail配置JavaMailSender并设置收件人。
为了防止泄露敏感信息,默认邮件模板不显示实例的任何元数据。 如果要显示一些元数据,则可以使用自定义模板。
1 将spring-boot-starter-mail添加到您的依赖项
pom.xml
1 | <dependency> |
2 配置一个JavaMailSender
application.properties
1 | spring.mail.host=smtp.example.com |
3 详细配置
Property name | Description | Default value |
---|---|---|
spring.boot.admin.notify.mail.enabled | 启用邮件通知 | true |
spring.boot.admin.notify.mail.ignore-changes | 以逗号分隔的状态更改列表将被忽略。 格式:“ <从状态>:<至状态>”。 允许使用通配符。 | "UNKNOWN:UP" |
spring.boot.admin.notify.mail.template | 用于渲染的Thymeleaf模板的资源路径。 | "classpath:/META-INF/spring-boot-admin-server/mail/status-changed.html" |
spring.boot.admin.notify.mail.to | 逗号分隔的邮件收件人列表 | "root@localhost" |
spring.boot.admin.notify.mail.cc | 逗号分隔的复本收件人列表 | |
spring.boot.admin.notify.mail.from | Mail sender | "Spring Boot Admin <noreply@localhost>" |
spring.boot.admin.notify.mail.additional-properties | 可以从模板访问的其他属性 |
六 自定义配置
6.1 自定义通知程序
您可以通过添加实现Notifier接口的Spring Bean来添加自己的Notifier,最好是扩展AbstractEventNotifier或AbstractStatusChangeNotifier。
1 | public class CustomNotifier extends AbstractEventNotifier { |
6.2 注入自定义HTTP标头
如果您需要将自定义HTTP标头注入到对受监视应用程序的执行器端点的请求中,则可以轻松添加HttpHeadersProvider:
1 |
|
6.3 拦截请求和响应
您可以通过实现InstanceExchangeFilterFunction接口来拦截和修改对受监视应用程序的执行器端点的请求和响应。 这对于审核或添加一些额外的安全检查很有用。
1 |
|
6.4 链接/嵌入外部页面
您可以非常简单地通过配置添加到外部页面的链接,甚至嵌入它们(添加iframe = true):
1 | spring: |
6.5 自定义标题徽标和标题
您可以使用以下配置属性在标题中设置自定义信息(即显示登台信息或公司名称):
spring.boot.admin.ui.brand
:此HTML代码段显示在导航标题中,默认为<img src =“ assets / img / icon-spring-boot-admin.svg”> <span> Spring Boot Admin </ span >
。 默认情况下,它会显示SBA徽标及其名称。 如果要显示自定义徽标,则可以设置:spring.boot.admin.ui.brand = <img src =“ custom / custom-icon.png”>
。 您只需将映像添加到/ META-INF / spring-boot-admin-server-ui /
中的jar文件中(默认情况下,SBA会为此位置注册一个ResourceHandler),或者必须确保自己可以正确提供该映像 (例如,注册您自己的ResourceHandler)
spring.boot.admin.ui.title:使用此选项来自定义浏览器窗口标题。