微服务: Actuator实现服务监测

简介

SpringBoot Actuator 可以帮助我们监控 SpringBoot 应用的运行情况,服务上线后如何监控和管理自己的服务是我们要考虑的一个重要问题。

Actuator 是 SpringBoot 的一个附加组件(需要自己手动集成),Actuator 能帮助应用程序实现在各个环境运行时的监控。可以使用 HTTP 的各个请求路径来进行健康检查、审计、收集引用的运行情况,对于应用状态、内存、线程、堆栈等等都可以进行监控,比较全面的监控了 SpringBoot 应用的整个生命周期。对于微服务的管理十分有意义,在企业级应用中,对系统进行运行状态监控是不可或缺的。

Actuator 不仅支持 HTTP 方式访问,还支持 JMX(Java Management Extensions,即Java管理扩展)、SSH、Telnet 方式访问。Actuator 还支持端点扩展,扩展 Actuator 的端点(Endpoint) 可以自定义监控指标,实现更多的运维能力。

访问 spring-boot-actuator 给我们展现的是纯 JSON 格式的数据,对于非开发人员来说不够直观和不够人性化。Spring Boot Admin 就是用来解决这个问题的,使用 Spring Boot Admin 可以实现这些 JSON 接口数据的界面展现,方便运营人员查看和管理。本篇我们只学习 spring-boot-actuator 的使用,关于 Spring Boot Admin 下一篇再一起学习。

本篇主要内容:

  • 如何使用 spring-boot-actuator(算是简单入门);
  • 结合 spring-boot-security 增加对 spring-boot-actuator 的访问限制;

更多关于微服务相关文章,可以通过 微服务项目系列文章 学习。

实战

在你的工程的 pom.xml 文件中,加入如下依赖就可以引入 spring-boot-actuator 组件,如下:

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

等待加载完成(就是对应的jar包文件下载完成且ide加载jar正常),可以看到多了如下两个jar包。

actuator 是其功能实现,actuator-autoconfigure 是其自动配置的实现。

启动工程,然后在浏览器打开 http://localhost:8080/actuator,可以看到如下 json 数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"_links": {
"self": {
"href": "http://localhost:8080/actuator",
"templated": false
},
"health": {
"href": "http://localhost:8080/actuator/health",
"templated": false
},
"health-path": {
"href": "http://localhost:8080/actuator/health/{*path}",
"templated": true
},
"info": {
"href": "http://localhost:8080/actuator/info",
"templated": false
}
}
}

你可以访问如下的 URL,如下:

1
2
http://localhost:8080/actuator/health
http://localhost:8080/actuator/info

在 Actuator 的 2.x 版本中,大多数端点默认被禁掉了,且默认端点增加了 /actuator 前缀。默认暴露的两个端点为 /actuator/health/actuator/info,正是如上可以访问的两个 URL.

如果想开启所有的断点可以被访问,需要在工程的 properties 文件中,增加如下配置:

1
management.endpoints.web.exposure.include=*

再次访问 http://localhost:8080/actuator,就会有更多的URL可以被访问了。如 http://localhost:8080/actuator/envhttp://localhost:8080/actuator/beans 等。

官方文档 Spring Boot Actuator: Production-ready Features 完整的介绍了相关的内容,大家可以自行查阅。

从上面的访问路径可以看出,默认访问 Actuator 所有的监控点路径都在/actuator/*,是否可以自定义呢?是的,可以自定义这个前缀,只需要在 properties 中配置如下内容即可:

1
management.endpoints.web.base-path=/monitor

再次访问上面的 URL,就需要将 actuator/ 换成 monitor/ 了。

安全

虽然 Actuator 提供了很方便的监控和管理服务的能力,但是试想一下让任何其他的服务都可以访问,会存在一些安全隐患,SpringBoot 提供了 security 模块,可以帮助我们更加安全的使用 Actuator。集成 security 也很简单,下面我们具体说说如何使用吧。

首先,需要在 pom 文件中,添加如下依赖。

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

其次,配置工程的 properties 文件,加入如下内容:

1
2
3
spring.security.user.name=actuator-self
spring.security.user.password=actuator-admin
spring.security.user.roles=ACTUATOR_ADMIN

用户名(name)和密码(password),可以根据自己的实际情况自定义。

最后,添加一个配置类 MSActuatorSecurityConfig,该类继承 WebSecurityConfigurerAdapter.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class MSActuatorSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.requestMatchers(EndpointRequest.toAnyEndpoint())
.hasRole("ACTUATOR_ADMIN")
.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
.permitAll()
.antMatchers("/")
.permitAll()
.antMatchers("/**")
.authenticated()
.and()
.httpBasic();
}
}

下次再次访问 http://localhost:8080/monitor,就会提示你输入用户名和密码了。

下图是使用 Chrome 浏览器显示的效果。

输入配置的用户名和密码登录就可以访问到数据了。

另外为了安全,可以单独设置 Actuator 的管理端口并配置不对外网开放,如下配置独立的端口 1102,然后可以在防火墙上做下限制即 1102 端口仅用于内网访问即可。

在 properties 中增加如下配置,如下:

1
2
# 配置独立的端口
management.server.port=1012

使用效果:


人无千日好,花无百日红,早时不算计,过后一场空。~

坚持原创技术分享!