一. 什么是Actuator
actuator是从spring-boot中带的一套用来进行系统健康检查的一个模块,具有即插即用的能力。它提供了一套基于restful的api接口,可以帮助我们方便的通过相应的接口了解到系统资源占用、beans、dump、mappings等相关的信息。同时其还具有能力,可以基于HealthIndicators实现自定义的安全与健康检查。
actuator目前自带的接口如下:
ID
|
描述
|
Sensitive Default
|
---|---|---|
| Provides a hypermedia-based “discovery page” for the other endpoints. Requires Spring HATEOAS to be on the classpath. | true |
| Exposes audit events information for the current application. | true |
|
Displays an auto-configuration report showing all auto-configuration candidates and the reason why they ‘were’ or ‘were not’ applied. 告诉你为什么会有这个Bean,或者为什么没有这个Bean。提供了报告,列出了计算过的所有条件,根据条件是否通过进行分组 | true |
|
显示应用所有的Bean装配报告.
◆bean: Spring应用程序上下文中的Bean名称或ID。
◆resource: .class文件的物理位置,通常是一个URL,指向构建出的JAR文件。
◆dependencies:当前Bean注入的Bean ID列表。
◆scope: Bean的作用域(通常是单例,这也是默认作用域)。
◆type: Bean的Java类型。
| true |
|
显示应用所有的 | true |
|
显示当前应用的所有线程dump情况。当出现内存占用过高等情况下,可以帮助分析线程的使用情况,帮助定位问题。返回数据的结构如下: | true |
|
显示Spring的 | true |
|
显示任意的Flyway数据库迁移被应用情况(一般情况下该功能使用的场景很小)。.默认情况下,该功能是关闭的,访问会出现404错误。
| true |
|
显示系统的健康信息 (when the application is secure, a simple ‘status’ when accessed over an unauthenticated connection or full message details when authenticated).
| false |
|
显示任意的应用程序信息.默认是空,如果需要显示自己应用的相关信息,可以在配置文件中添加相应的节点即可。并通过接口输出,例如如下的配置: info.app.name=ecs info.app.version=1.0.0 info.build.artifactId=@project.artifactId@ info.build.version=@project.version@
执行
| false |
| Shows and modifies the configuration of loggers in the application. | true |
| Shows any Liquibase database migrations that have been applied. | true |
|
显示当前应用的 ‘metrics’信息.即可以全量查询也可以单个指标查询,路径格式为:/metrics/{name:.*}
| true |
|
显示系统所有的 | true |
| Allows the application to be gracefully shutdown (not enabled by default). | true |
|
显示trace信息 (默认显示最后100个HTTP请求). | tru |
二. actuator的个性化配置
1.修改端点Id
如把/beans改为/beansome:
endpoints.beans.id=beansome
这时要是想查看bean的信息时,路径就由原来的/beans变为/beansome;
2.启用和禁用端点
默认情况下,所有端点(除了/shutdown)都是启用的。
禁用端点所有的端点:endpoints.enabled=false
禁用某个特定的端点:endpoints.endpoint-id.enabled=false
注意奥!
禁用后,再次访问URL时,会出现404错误。
3.添加自定义度量信息
3.1 简单的自定义度量信息:
springBoot自动配置Actuator创建CounterService的实例,并将其注册为Spring的应用程序上下文中的Bean。
CounterService这个接口里定义了三个方法分别用来增加、减少或重置特定名称的度量值。
代码如下:
package org.springframework.boot.actuate.metrics;
public interface CounterService {
void increment(String metricName);
void decrement(String metricName);
void reset(String metricName);
}
Actuator的自动配置还会配置一个GaugeService类型的Bean。
代码如下:
package org.springframework.boot.actuate.metrics;
public interface GaugeService {
void submit(String metricName, double value);
}
自己写的一个实例:
@Controller
public class HelloController {
@Autowired
private CounterService counterService;
@Autowired
private GaugeService gaugeService;
@RequestMapping(value = "/login", method=RequestMethod.GET)
public String login() {
counterService.increment("logintimes:");
gaugeService.submit("loginLastTime:",System.currentTimeMillis());
return "login";
}
}
在运行/ metrics时,出现自定义的度量信息。
3.2 相对复杂点的自定义度量信息
主要是写一个类实现public Metrics接口,提供自己想要的度量信息。该接口定义了一个metrics()方法,返回一个Metric对象的集合
代码如下:
@Componentpublic
class CustomMetrics implements PublicMetrics {
private ApplicationContext applicationContext;
@Autowide
public CustomMetrics(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override
public Collection<Metric<?>> metrics() {
List<Metric<?>> metrics = new ArrayList<Metric<?>>();
metrics.add(new Metric<Long>("spring.startup-date",applicationContext.getStartupDate()));
metrics.add(new Metric<Integer>("spring.bean.definitions",applicationContext.getBeanDefinitionCount()));
metrics.add(new Metric<Integer>("spring.beans",applicationContext.getBeanNamesForType(Object.class).length));
metrics.add(new Metric<Integer>("spring.controllers",applicationContext.getBeanNamesForAnnotation(Controller.class).length));
return metrics;
}
}
运行结果中可以找到以上自定义的度量信息
"spring.startup-date":1477211367363,
"spring.bean.definitions":317,
"spring.beans":331,
"spring.controllers":3,
4.插入自定义健康指示器
自定义健康指示器时,需要实现HealthIndicator,重写health()方法即可。调用withDetail()方法向健康记录里添加其他附加信息。有多个附加信息时,可多次调用withDetail()方法,每次设置一个健康记录的附加字段。
示例(关于一个异常的健康指示器)如下:
@Componentpublic
class CustomHealth implements HealthIndicator{
@Override
public Health health() {
try {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getForObject("http://localhost:8080/index",String.class);
return Health.up().build();
}catch (Exception e){
return Health.down().withDetail("down的原因:",e.getMessage()).build();
}
}
}
运行“http://localhost:8080/health”
之后就会出现一些列健康指示。有时候有的浏览器仅仅出现{"status":"DOWN"},为什么会是这样呢?官网给了我们答案
Shows application health information (when the application is secure, a simple ‘status’ when accessed over an unauthenticated connection or full message details when authenticated)
而且要求Sensitive Default 为flase
5. 更改健康检查端口
默认情况下健康检查端口和app端口是使用同一个,如我们之前使用的http://127.0.0.1:8080/health
,但是为了安全起见、不影响业务我们最好使用另外的端口进行健康检查,如使用9090
端口,在application.properties
文件中设置management.port=9090
。
6.跨域访问的支持
默认情况下是不支持对actuator端点的跨域访问,假如我们在一个统一的监控平台下希望支持跨域调用这些端点来指向相应的操作,则需要作如下的配置。
Cross-origin resource sharing (CORS) is a W3C specification that allows you to specify in a flexible way what kind of cross domain requests are authorized. Actuator’s MVC endpoints can be configured to support such scenarios.
CORS support is disabled by default and is only enabled once the endpoints.cors.allowed-origins
property has been set. The configuration below permitsGET
and POST
calls from the example.com
domain:
endpoints.cors.allowed-origins=http://example.com endpoints.cors.allowed-methods=GET,POST
|
Check EndpointCorsProperties for a complete list of options. |
7.已经进行自动配置的HealthIndicators
The following HealthIndicators
are auto-configured by Spring Boot when appropriate:
Name
|
Description
|
---|---|
Checks that a Cassandra database is up. | |
Checks for low disk space. | |
Checks that a connection to | |
Checks that an Elasticsearch cluster is up. | |
Checks that a JMS broker is up. | |
Checks that a mail server is up. | |
Checks that a Mongo database is up. | |
Checks that a Rabbit server is up. | |
Checks that a Redis server is up. | |
Checks that a Solr server is up. |
|
It is possible to disable them all using the |
8.通过Remote-Shell来进行监控和管理
Spring Boot supports an integrated Java shell called ‘CRaSH’. You can use CRaSH to ssh
or telnet
into your running application. To enable remote shell support, add the following dependency to your project:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-remote-shell</artifactId> </dependency>
|
The remote shell is deprecated and will be removed in Spring Boot 2.0. |
|
If you want to also enable telnet access you will additionally need a dependency on |
|
CRaSH requires to run with a JDK as it compiles commands on the fly. If a basic |
三. 项目应用现状和思考
目前只有hotel.pms.admin该服务应用到了该框架,只是针对不同的环境做了启用和不启用的相关配置,并没有做太多针对项目实际情况的应用。例如:
1.所有的启动检测接口可以使用健康检查是否有效的判断,访问http://host:port/health的地址,并在所有项目内铺开。
2.针对所有应用的监控,都可以添加autuator的相关配置,方便在线上出现和资源消耗相关的问题时,可以对问题进行初步的排查,并了解系统资源相关的第一手信息。
3.通过bean相关的分析,可以对无效的相关包引用进行排除。毕竟多加载一个包也是对资源的一个浪费。
4.通过info信息来显示服务端应用的最新信息以了解发布的最新版本。
四.总结
建议在Q2开始推动在所有的后端服务内推广嵌入actuator相关的配置,以保障服务基础配置的标准化。