目录
配套资料,免费下载
链接:https://pan.baidu.com/s/1jA217UgqXpONi_fV-aOzqw
提取码:bm2g
复制这段内容后打开百度网盘手机App,操作更方便哦
1、场景简介
未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。Spring Boot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。而我们要做的就是引入这个场景的启动器即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、端点介绍
2.1、端点概述
执行器端点(Actuator endpoints)使您可以监视应用程序并与之交互。Spring Boot包含许多内置端点,您可以添加自己的端点。例如,health
端点提供基本的应用程序运行状况信息。每个单独的端点都可以通过HTTP或JMX启用或禁用和公开。当端点同时启用和公开时,它被视为可用。内置端点只有在可用时才会被自动配置。大多数应用程序选择通过HTTP公开,其中端点的ID和前缀/actuator映射到URL。例如,默认情况下,health端点映射到/actuator/health。
可以使用以下与技术无关的端点:
ID | 描述 |
---|---|
auditevents |
公开当前应用程序的审核事件信息。需要一个AuditEventRepository 组件。 |
beans |
显示应用程序中所有Spring Bean的完整列表。 |
caches |
公开可用的缓存。 |
conditions |
显示在配置和自动配置类上评估的条件以及它们匹配或不匹配的原因。 |
configprops |
显示所有的整理列表@ConfigurationProperties 。 |
env |
公开Spring的属性ConfigurableEnvironment 。 |
flyway |
显示所有已应用的Flyway数据库迁移。需要一个或多个Flyway 组件。 |
health |
显示应用程序运行状况信息。 |
httptrace |
显示HTTP跟踪信息(默认情况下,最近100个HTTP请求-响应交换)。需要一个HttpTraceRepository 组件。 |
info |
显示任意应用程序信息。 |
integrationgraph |
显示Spring Integration图。需要对的依赖spring-integration-core 。 |
loggers |
显示和修改应用程序中记录器的配置。 |
liquibase |
显示已应用的所有Liquibase数据库迁移。需要一个或多个Liquibase 组件。 |
metrics |
显示当前应用程序的“指标”信息。 |
mappings |
显示所有@RequestMapping 路径的整理列表。 |
scheduledtasks |
显示应用程序中的计划任务。 |
sessions |
允许从Spring Session支持的会话存储中检索和删除用户会话。需要使用Spring Session的基于Servlet的Web应用程序。 |
shutdown |
使应用程序正常关闭。默认禁用。 |
startup |
显示由收集的启动步骤数据ApplicationStartup 。需要使用SpringApplication 进行配置BufferingApplicationStartup 。 |
threaddump |
执行线程转储。 |
如果您的应用程序是Web应用程序(Spring MVC,Spring WebFlux或Jersey),则可以使用以下附加端点:
ID | 描述 |
---|---|
heapdump |
返回hprof 堆转储文件。 |
jolokia |
通过HTTP公开JMX bean(当Jolokia在类路径上时,不适用于WebFlux)。需要对的依赖jolokia-core 。 |
logfile |
返回日志文件的内容(如果已设置logging.file.name 或logging.file.path 属性)。支持使用HTTPRange 标头来检索部分日志文件的内容。 |
prometheus |
以Prometheus服务器可以抓取的格式公开指标。需要对的依赖micrometer-registry-prometheus 。 |
2.2、启动端点
默认情况下,除了shutdown
端点,其余所有端点均处于启用状态。要配置端点的启用,请使用其management.endpoint.<id>.enabled
属性。
以下示例启用shutdown
端点:
management:
endpoint:
shutdown:
enabled: true
如果您只想启用部分端点而不是所有端点,请将management.endpoints.enabled-by-default
属性设置为false
并使用各个端点enabled
属性重新启用。
以下示例启用该info
端点并禁用所有其他端点:
management:
endpoints:
enabled-by-default: false
endpoint:
info:
enabled: true
注意: 禁用的端点将从应用程序上下文中完全删除。如果只想更改公开端点的技术,请使用
include
和exclude
属性。
2.3、暴露端点
由于端点可能包含敏感信息,因此应谨慎考虑何时公开它们。下表显示了内置端点的默认暴露情况:
ID | JMX | Web |
---|---|---|
auditevents |
Yes | No |
beans |
Yes | No |
caches |
Yes | No |
conditions |
Yes | No |
configprops |
Yes | No |
env |
Yes | No |
flyway |
Yes | No |
health |
Yes | Yes |
heapdump |
N/A | No |
httptrace |
Yes | No |
info |
Yes | Yes |
integrationgraph |
Yes | No |
jolokia |
N/A | No |
logfile |
N/A | No |
loggers |
Yes | No |
liquibase |
Yes | No |
metrics |
Yes | No |
mappings |
Yes | No |
prometheus |
N/A | No |
scheduledtasks |
Yes | No |
sessions |
Yes | No |
shutdown |
Yes | No |
startup |
Yes | No |
threaddump |
Yes | No |
为了改变这些端点原有默认暴露行为,您可以使用include和
exclude属性进行设置:
属性 | 默认 |
---|---|
management.endpoints.jmx.exposure.exclude |
|
management.endpoints.jmx.exposure.include |
* |
management.endpoints.web.exposure.exclude |
|
management.endpoints.web.exposure.include |
info,health |
该include
属性列出了公开的端点的ID。该exclude
属性列出了不应公开的端点的ID。
例如,要停止通过JMX公开所有端点,而仅公开health
和info
端点,请使用以下属性:
management:
endpoints:
jmx:
exposure:
include: health,info
*
可用于选择所有端点。例如,要通过HTTP公开除env
和beans
端点之外的所有内容,请使用以下属性:
management:
endpoints:
web:
exposure:
include: '*'
exclude: env,beans
注意:
*
在YAML中具有特殊含义,因此如果要包括(或排除)所有端点,请确保添加引号。
2.4、访问端点
我们以访问health端点为例:http://localhost:8080/actuator/health
2.5、保护端点
您应该像对待其他任何敏感URL一样,确保HTTP端点的安全。如果存在Spring Security,则默认情况下使用Spring Security的内容协商策略保护端点的安全。例如,如果您希望为HTTP端点配置自定义安全性,仅允许具有特定角色的用户访问它们,Spring Boot提供了一些方便的RequestMatcher
对象,这些对象可以与Spring Security结合使用。典型的Spring Security配置可能类似于以下示例:
@Configuration(proxyBeanMethods = false)
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests((requests) ->
requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
http.httpBasic();
}
}
前面的示例用于EndpointRequest.toAnyEndpoint()
将请求匹配到任何端点,然后确保所有ENDPOINT_ADMIN
角色都具有该角色。如果将应用程序部署在防火墙后面,则可能希望无需进行身份验证即可访问所有执行器端点。您可以通过更改management.endpoints.web.exposure.include
属性来做到这一点,如下所示:
management:
endpoints:
web:
exposure:
include: '*'
此外,如果存在Spring Security,则需要添加自定义安全配置,该配置允许未经身份验证的端点访问,如以下示例所示:
@Configuration(proxyBeanMethods = false)
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests((requests) ->
requests.anyRequest().permitAll());
}
}
2.6、配置端点
对于不带任何参数的端点读取操作,端点将自动缓存。要配置端点缓存生存的时间,请使用其cache.time-to-live
属性。
以下示例将beans
端点的缓存的生存时间设置为10秒:
management:
endpoint:
beans:
cache:
time-to-live: 10s
2.7、跨域支持
(CORS)是W3C规范,可让您灵活地指定授权哪种类型的跨域请求。如果使用Spring MVC或Spring WebFlux,则可以将Actuator的Web端点配置为支持此类方案。默认情况下,CORS支持是禁用的,并且仅management.endpoints.web.cors.allowed-origins
在设置了属性后才启用。
以下配置允许GET
和POST
从example.com
域调用:
management:
endpoints:
web:
cors:
allowed-origins: https://example.com
allowed-methods: GET,POST
注意: 有关选项的完整列表,请参见CorsEndpointProperties。
2.8、自定义端点
如果您想自定义端点请在类上标注@Endpoint
注解,还有一些特定的方法注解如@ReadOperation,
@WriteOperation或
@DeleteOperation,自定义厚的端点会默认显示在Web应用程序以及JMX和HTTP的访问中,可以使用Jersey,Spring MVC或Spring WebFlux通过HTTP公开端点。如果Jersey和Spring MVC均可用,则将使用Spring MVC。
以下示例公开了一个读取操作,一个写操作:
@Component
@Endpoint(id = "container")
public class DockerEndpoint {
@ReadOperation
public Map getDockerInfo(){
return Collections.singletonMap("info","docker started...");
}
@WriteOperation
private void restartDocker(){
System.out.println("docker restarted....");
}
}
以下示例公开了一个读取操作,该操作返回一个自定义对象:
@ReadOperation
public CustomData getCustomData() {
return new CustomData("test", 5);
}
您也可以使用@JmxEndpoint
或编写技术特定的端点@WebEndpoint
。这些端点仅限于其各自的技术。例如,@WebEndpoint
仅通过HTTP而不是JMX公开。
您可以使用@EndpointWebExtension
和编写特定于技术的扩展@EndpointJmxExtension
。这些注解使您可以提供特定于技术的操作来扩展现有端点。
最后,如果需要访问特定于Web框架的功能,则可以实现Servlet或Spring@Controller
和@RestController
终结点,但要付出代价,即它们无法通过JMX或使用其他Web框架使用。
Servlet端点
Servlet
可以通过标注一个@ServletEndpoint
注解同时实现Supplier<EndpointServlet>
就能成为一个Servlet端点。Servlet端点提供了与Servlet容器的更深层集成,但以可移植性为代价。它们旨在用于将现有对象公开Servlet
为端点。对于新端点,应尽可能使用@Endpoint
和@WebEndpoint
注解。
Controller端点
@ControllerEndpoint
与@RestControllerEndpoint
可以用于实现仅由Spring MVC或Spring WebFlux公开的端点。使用Spring MVC和Spring WebFlux的标准注解(例如@RequestMapping
和)映射方法@GetMapping
,并将端点的ID用作路径的前缀。控制器端点提供了与Spring Web框架的更深层集成,但以可移植性为代价。对于新端点,应尽可能使用@Endpoint
和@WebEndpoint
注解。
3、健康信息
3.1、健康详情
您可以使用运行状况信息来检查正在运行的应用程序的状态。监视软件通常使用它在生产系统出现故障时向某人发出警报。health
端点公开的信息取决于management.endpoint.health.show-details
和management.endpoint.health.show-components
属性,可以使用以下值之一对其进行配置:
名称 | 描述 |
---|---|
never |
详细信息永远不会显示。 |
when-authorized |
详细信息仅显示给授权用户。可以使用来配置授权角色management.endpoint.health.roles 。 |
always |
向所有用户显示详细信息。 |
默认值为never
。当用户担任一个或多个端点的角色时,该用户被视为已授权。如果端点没有配置的角色(默认值),则所有通过身份验证的用户均被视为已授权。可以使用management.endpoint.health.roles
属性配置角色。
健康信息是从HealthContributorRegistry
中收集的,该HealthContributorRegistry
可用于在运行时注册和注销的健康指标。Spring Boot包括许多自动配置的HealthContributors
,您也可以编写自己的。
一个HealthContributor
可以是一个HealthIndicator
或是一个 CompositeHealthContributor
。一个HealthIndicator
提供实际的健康信息,包括Status
。一个CompositeHealthContributor
提供其他的组合HealthContributors
,合起来形成一个树形结构来代表整个系统的健康状况。
默认情况下,最终的系统健康状况是由StatusAggregator
派生的,它根据状态HealthIndicator
的有序列表对每个状态进行排序。排序列表中的第一个状态用作整体运行状况。如果没有HealthIndicator
返回一个已知状态StatusAggregator
,一种UNKNOWN
是使用状态。
3.2、健康指标
3.2.1、健康指标列表
HealthIndicators
在适当的情况下,Spring Boot会自动配置以下内容。您也可以通过配置启用/禁用选定的指标management.health.key.enabled
,key表示键这一列的某一个属性。
键 | 名称 | 描述 |
---|---|---|
cassandra |
CassandraDriverHealthIndicator |
检查Cassandra数据库是否已启动。 |
couchbase |
CouchbaseHealthIndicator |
检查Couchbase群集是否已启动。 |
datasource |
DataSourceHealthIndicator |
Checks that a connection to DataSource can be obtained. |
diskspace |
DiskSpaceHealthIndicator |
检查磁盘空间不足。 |
elasticsearch |
ElasticsearchRestHealthIndicator |
检查Elasticsearch集群是否已启动。 |
hazelcast |
HazelcastHealthIndicator |
检查Hazelcast服务器是否已启动。 |
influxdb |
InfluxDbHealthIndicator |
检查InfluxDB服务器是否已启动。 |
jms |
JmsHealthIndicator |
检查JMS代理是否启动。 |
ldap |
LdapHealthIndicator |
检查LDAP服务器是否已启动。 |
mail |
MailHealthIndicator |
检查邮件服务器是否已启动。 |
mongo |
MongoHealthIndicator |
检查Mongo数据库是否已启动。 |
neo4j |
Neo4jHealthIndicator |
检查Neo4j数据库是否启动。 |
ping |
PingHealthIndicator |
一律以回应UP 。 |
rabbit |
RabbitHealthIndicator |
检查Rabbit服务器是否已启动。 |
redis |
RedisHealthIndicator |
检查Redis服务器是否启动。 |
solr |
SolrHealthIndicator |
检查Solr服务器是否已启动。 |
注意: 您可以通过设置
management.health.defaults.enabled
属性来全部禁用它们。
其他HealthIndicators
功能可用,但默认情况下未启用:
键 | 名称 | 描述 |
---|---|---|
livenessstate |
LivenessStateHealthIndicator |
公开“活动”应用程序的可用性状态。 |
readinessstate |
ReadinessStateHealthIndicator |
公开“就绪”应用程序可用性状态。 |
反应式健康指标列表
ReactiveHealthIndicators
在适当的情况下,Spring Boot会自动配置以下内容:
名称 | 描述 |
---|---|
CassandraDriverReactiveHealthIndicator |
检查Cassandra数据库是否已启动。 |
CouchbaseReactiveHealthIndicator |
检查Couchbase群集是否已启动。 |
ElasticsearchReactiveHealthIndicator |
检查Elasticsearch集群是否已启动。 |
MongoReactiveHealthIndicator |
检查Mongo数据库是否已启动。 |
Neo4jReactiveHealthIndicator |
检查Neo4j数据库是否启动。 |
RedisReactiveHealthIndicator |
检查Redis服务器是否启动。 |
3.2.2、自定义健康指标
为了提供定制的健康信息,您可以注册实现该HealthIndicator
接口的Spring bean 。您需要提供该health()
方法的实现并返回Health
响应。的Health
响应应该包括一个状态,并且可以任选地包括另外的细节被显示。以下代码显示了示例HealthIndicator
实现:
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class MyHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
}
除了Spring Boot的预定义Status
类型之外,Health
还可以返回代表新系统状态的自定义Status
。
在这种情况下,StatusAggregator
还需要提供接口的自定义实现或者必须使用management.endpoint.health.status.order
配置属性来配置默认实现。
management:
endpoint:
health:
status:
order: fatal,down,out-of-service,unknown,up
响应中的HTTP状态代码反映了总体健康状态。默认情况下,OUT_OF_SERVICE
和DOWN
映射到503的所有未映射的健康状态,包括UP
,映射到200你可能也想,如果你通过HTTP访问健康端点注册自定义状态映射。配置自定义映射禁用默认映射DOWN
和OUT_OF_SERVICE
。如果要保留默认映射,则必须在所有自定义映射旁边显式配置它们。例如,以下属性映射FATAL
到503(服务不可用)和保留的默认映射DOWN
和OUT_OF_SERVICE
:
management:
endpoint:
health:
status:
http-mapping:
down: 503
fatal: 503
out-of-service: 503
下表显示了内置状态的默认状态映射:
Status | Mapping |
---|---|
DOWN | SERVICE_UNAVAILABLE (503) |
OUT_OF_SERVICE | SERVICE_UNAVAILABLE (503) |
UP | 默认情况下没有映射,因此http状态为200 |
UNKNOWN | 默认情况下没有映射,因此http状态为200 |
自定义反应式健康指标
对于反应式应用程序,例如使用Spring WebFlux的那些应用程序,ReactiveHealthContributor
提供了非阻塞合同来获取应用程序的运行状况。与传统方法类似HealthContributor
,健康信息是从中收集的ReactiveHealthContributorRegistry
的信息。为了从反应式API提供自定义的健康信息,您可以注册实现该ReactiveHealthIndicator
接口的Spring bean 。以下代码显示了示例ReactiveHealthIndicator
实现:
@Component
public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {
@Override
public Mono<Health> health() {
return doHealthCheck() //perform some specific health check that returns a Mono<Health>
.onErrorResume(ex -> Mono.just(new Health.Builder().down(ex).build()));
}
}
4、数据可视化
4.1、Spring Boot Admin概述
我们虽然可以使用HTTP请求来查看当前应用健康数据,但是毕竟不是很方便,所以我们可以使用开源的 Spring Boot Admin 来进行可视化。
Spring Boot Admin为注册的应用程序提供以下功能:
- 显示健康状况
- 显示详细信息,例如
- JVM和内存指标
- micrometer.io指标
- 数据源指标
- 缓存指标
- 显示内部编号
- 关注并下载日志文件
- 查看JVM系统和环境属性
- 查看Spring Boot配置属性
- 支持Spring Cloud的可发布/ env-和// refresh-endpoint
- 轻松的日志级别管理
- 与JMX-beans交互
- 查看线程转储
- 查看http-traces
- 查看审核事件
- 查看http端点
- 查看预定的任务
- 查看和删除活动会话(使用spring-session)
- 查看Flyway / Liquibase数据库迁移
- 下载heapdump
- 状态更改通知(通过电子邮件,Slack,Hipchat等)
- 状态更改的事件日志(非持久性)
4.2、Spring Boot Admin文档
指南地址:http://codecentric.github.io/spring-boot-admin/2.3.1/
4.3、Spring Boot Admin使用
4.3.1、Client端
我们自己编写的应用叫做客户端,为了能够连接服务器,所以我们应该添加客户端的依赖:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.3.1</version>
</dependency>
也需要针对性的做一些配置:
management:
endpoints:
web:
exposure:
include: '*'
spring:
boot:
admin:
client:
#配置服务端地址
url: http://127.0.0.1:8888
instance:
#是否启用IP地址访问服务端
prefer-ip: true
#请配置当前应用的应用名称
name: spring-boot-quick
重新启动咱们自己编写的应用即可,但是现在先不要访问,因为我们还没有服务端,服务端就是用来将数据进行可视化的,所以,等服务端创建完毕并运行以后,我们再启动当前的应用就好。
4.3.2、Server端
导入依赖:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.3.1</version>
</dependency>
修改配置:
server:
port: 8888
spring:
application:
name: spring-boot-admin
开启注解:
@SpringBootApplication
@EnableAdminServer
public class SpringBootAdminApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminApplication.class, args);
}
}
启动应用,然后再启动客户端,最后访问地址:http://localhost:8888/
原文地址:https://caochenlei.blog.csdn.net
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。