最近运维一直反馈我的应用健康检查返回的数据格式不正确,具体如下
[api@prod-xxxx-service]$ curl http://localhost:54321/actuator/health
{
"details":{
"elasticsearch":{
"details":{},
"status":{
"code":"UP",
"description":""
}
},
"diskSpace":{
"details":{
"total":211242639360,
"free":188137111552,
"threshold":10485760
},
"status":{"$ref":"$.details.elasticsearch.status"}
}
},
"status":{"$ref":"$.details.elasticsearch.status"}
}
正常的返回数据如下
[api@prod-xxxx-service]$ curl http://localhost:54321/actuator/health
{"status":"UP","details":{"elasticsearch":{"status":"UP"},"diskSpace":{"status":"UP","details":{"total":211242639360,"free":188136599552,"threshold":10485760}}}}
可见,异常的返回数据中,出现了很多dollar符开头的表达式,如果把这些表达式替换成对应的值,这个返回结果并没有什么问题。
一开始怀疑是项目中pom文件配置不正确导致的,于是找了中间件团队的文档对照着重新配置pom,但是并没有什么作用。又找了健康检查数据正常的应用来进行对比,仍然没有发现问题。
这时候真是一脸蒙逼,完全不知道问题在哪里,互联网上也完全找不到任何类似的问题。
突然想到一个办法:排除法
首先从springboot官网上初始化一个springboot的demo项目,同时找来一个健康检查数据异常的项目。
将健康检查数据异常的项目里的代码一点点copy到demo项目中,每做一次改动后都查看健康检查数据是否正常。
刚开始时,demo项目的健康检查数据都是正常的,随着copy过来的代码越来越多,终于健康检查数据不正常了,此时基本可以确定是项目里的代码引起了健康检查数据的异常。
查看新增的代码时,发现了如下的一个配置
@Configuration
public class SpringConfig {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
// 1.定义一个converters转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
// 2.添加fastjson的配置信息,比如: 是否需要格式化返回的json数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat);
// 3.在converter中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
// 4.将converter赋值给HttpMessageConverter
HttpMessageConverter<?> converter = fastConverter;
// 5.返回HttpMessageConverters对象
return new HttpMessageConverters(converter);
}
}
这段配置是为了使rest接口返回json数据时使用fastjson来进行格式化,而非springboot默认的jackson来进行格式化。
突然想到,获取健康检查结果的接口也是一个rest接口,那么很可能就是这个配置导致健康检查数据的异常。
接下来进行验证,注释掉上面的这段配置
重启项目,查看健康检查数据
正常!!!!