最近運維一直反饋我的應用健康檢查返回的數據格式不正確,具體如下
[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接口,那麼很可能就是這個配置導致健康檢查數據的異常。
接下來進行驗證,註釋掉上面的這段配置
重啓項目,查看健康檢查數據
正常!!!!