SpringBoot 健康检查数据格式问题排查

最近运维一直反馈我的应用健康检查返回的数据格式不正确,具体如下

[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接口,那么很可能就是这个配置导致健康检查数据的异常。

接下来进行验证,注释掉上面的这段配置

重启项目,查看健康检查数据

正常!!!!

你可能感兴趣的:(Java&Javaweb)