以前这个监控都是领导去加,我顶多去修改一些时间参数,让我自己加还是头一次
正经踩了不少坑啊
1.依赖引入
先说配置过程
不对 先说我们项目结构
我们有一个common项目,作为一个公共项目。各种项目公用的依赖,都配置在common中
然后这个监控是各个项目都要加的,所以我也把actuator这个依赖放到common中了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.冲突解决
项目里边本来有knife4j了,然后现在加了 actuator之后,启动报错
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
找了半天,都说是swagger什么问题,终于找到了一个靠谱的博客
引入springboot actuator和spring boot 2.7.1和knife4j 3.0 依赖版本冲突错误解决_白YY的博客-CSDN博客
2.1 yml文件
management:
endpoint:
health:
show-details: always
2.2 配置类
@Bean
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(
WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier,
ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes,
CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties,
Environment environment) {
List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
allEndpoints.addAll(webEndpoints);
allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
String basePath = webEndpointProperties.getBasePath();
EndpointMapping endpointMapping = new EndpointMapping(basePath);
boolean shouldRegisterLinksMapping = shouldRegisterLinksMapping(webEndpointProperties,
environment, basePath);
return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,
corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath),
shouldRegisterLinksMapping, null);
}
/**
* shouldRegisterLinksMapping
* @param webEndpointProperties webEndpointProperties
* @param environment environment
* @param basePath /
* @return boolean
*/
private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties,
Environment environment, String basePath) {
return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath)
|| ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
}
2.3 配置类引入
配置类是加到common里边了,但是我其他的项目没有扫描到这个配置类,应该是不在扫描路径中
打断点都不进那个class
解决方式
@Import
3.权限接口放开
监控接口肯定是不经过权限校验的,所以要过滤掉跟监控有关的接口
.antMatchers("/actuator/**").permitAll()
3.1踩坑点
/** 和/* 的区别
/* 是拦截所有的文件夹,不包含子文件夹
/** 是拦截所有的文件夹及里面的子文件夹
如果你配置的是/actuator/*
那你访问/actuator/health是可以的,但是你想访问/actuator/health/liveness,会报权限不够
但是如果你配置的是/actuator/**
那你访问/actuator/health 以及/actuator/health/liveness 都是可以的
4.引入不到最新的包
4.1问题发现
console引用了common
我本地没有问题,验证通过之后才部署线上,不管怎么重新构建,都没有效果
所以我怀疑肯定是没有引用到最新的common包
为了验证自己的猜想,我去github上把压缩包下载下来,去找class,一看,果然代码是旧的
那个按钮是可以下载的
4.2 问题解决
1.2 修改mvn编译命令
修改打包命令,添加-U参数,如:mvn clean install package -U -DskipTests=true,-U参数的含义是update-snapshots,保证可以更新快照包。
把线上的编译命令改了就好了
5.配置文件修改
1,开启健康检查的liveness和readiness的接口访问
2.关闭一些不需要检查的项
management:
endpoint:
health:
probes:
enabled: true
health:
livenessstate:
enabled: true
readinessstate:
enabled: true
rabbit:
enabled: false
Solr:
enabled: false
elasticsearch:
enabled: false
6.线上验证
通过线上的命令行
wget http://localhost:8800/actuator/health/liveness
wget http://localhost:8800/actuator/health/readiness
其实wget就是下载,你执行这两个之后,在当前路径可以看到两个文件,cat命令可以查看文件内容