《Spring Cloud 微服务实战》 学习笔记
监控与管理
在微服务架构中,我们将原本庞大的单体系统拆分为多个单独的服务应用。虽然个体个应用的内部逻辑因分解而得以简化。但是由于部署应用的数量成倍增长,使得系统的维护复杂度大大提升。对于运维人员来说,
随着应用的不断增多,系统集群中出现故障的频率也越来越高。
为了能对这些成倍增长的应用做到高效运维,使用传统的运维方式显然是不合适的。所以我们需要一套自动化的运维监控机制,这套机制的基础就是不间断的收集各个微服务应用的各项指标,并根据这些基础指标信息来指定监控和预警规则
,更进一步甚至做到一些自动化运维操作等。
为了让运维系统能够获取各个微服务应用 的相关指标以及实现一些常规操作控制,我们需要开发一套专用于植入各个微服务应用的接口监控系统采集信息
.这些信息有很大一部分指标都是类似的:比如:环境变量,垃圾收集信息,内存信息,线程池信息等
.
spring-boot-starter-actuator
SpringBoot微服务框架提供了一个特殊的模块:spring-boot-starter-actuator
.
认识actuator
maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
应用
启动应用后,会发现后台输出日志:
,默认开启了两个端点:/actuator/health,/actuator/info
,
spring-boot 2.x
默认屏蔽了所有的web端点,只开放了health和info
两个端点,如果如要是释放其他端点可以使用如下方式:
management:
endpoints:
web:
exposure:
## 开启所有端点
# include: "*"
## 将开启具体的端点
include: ["metrics","beans"]
Endpoints
端点清单
Spring Boot 2
actuator 所有的端点都有一个默认的根路径/actuator
,若想查看health
信息,则需要访问/actuator/health
.
下面为所有端点的清单。
/auditevents:
当前应用程序的审核事件信息 ??/beans:
列出所有的bean/caches:
列出所有的可用的缓存/health:
当前应用的健康状况/conditions:
列出带有@Conditiaon
注解的配置类上:条件通过或不通过的原因。/configprops:
列出所有@ConfigurationProperties
配置类。env:
当前环境信息/info:
展示当前应用信息。 在配置文件中:info.*
配置信息。/loggers:
展示和更新 当前logger的配置信息/heapdump:
下载堆快照文件。threaddump:
展示线程堆信息/metrics:
展示指标项信息清单. 指标包含内存,堆,线程
等多项指标信息. 但此请求并不返回具体的指标数据,若想要获取具体的指标,如jvm.memory.max
,则需要请求:/actuator/metrics/jvm.memory.max
/scheduledtasks:
应用中所有 scheduled tasks./httptrace:
记录最近的100次http请求和响应。(包含/actuator 请求)/mappings:
返回所有的@RequestMapping
信息. (包含/actuator 请求)shutdown:
关闭当前应用(默认关闭)
这些端点可以分为三大类:
应用配置类
: 获取应用程序中加载的应用配置,环境变量,自动化配置等信息度量指标类
: 获取应用程序运行过程中用于监控的指标信息。比如线程信息,内存信息,HTTP请求统计等。操作控制类
: 提供对应用的关闭等操作类功能。
度量指标类 - metrics
查看某一项具体的指标:
度量指标类 - health
通常.使用health
只能查看到很简略的信息,如果想要看到详细的信息需要使用配置:
management.endpoint.health.show-details
,它有三个可选值
never
: 永不展示always
: 所有用户均可展示when-authorized
: 只展示给部分拥有management.endpoint.health.roles
角色的用户。
默认,health检查如下信息:
name | descriptions |
---|---|
DiskSpaceHealthIndicator | 低磁盘空间检测 |
DataSourceHealthIndicator | DataSource 连接是否可用 |
更多详情见:_auto_configured_healthindicators
自定义health检测项
@Component
public class RocketMQHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check();
if(errorCode != 0){
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
private int check(){
//todo 模拟检测操作
int epochMil = (int) Instant.now().toEpochMilli();
return epochMil & 1;
}
}
请求查看/actuator/health
:
操作控制类 - shutdown
通过请求actuator/shutdown
关闭应用,默认是未开启端点,必须使用如下配置:
management.endpoint.shutdown.enabled=true
,且仅允许POST
方法:
这一步操作,关闭应用时非常
危险
的一件事,所以在线上使用的时候,一定要加入保护机制,如整合安全框架,对该请求进行保护。
整合安全框架–spring security
@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
.anyRequest().hasRole("ENDPOINT_ADMIN")
.and()
.httpBasic();
}
}
CORS Support
management.endpoints.web.cors.allowed-origins=http://example.com
management.endpoints.web.cors.allowed-methods=GET,POST