type
Post
status
Published
date
Aug 19, 2024
slug
summary
tags
category
icon
password

背景

🙃
因为项目小但又有多个服务,无法查看一些健康指标,而且因为网络限制查看日志特别不方便,又不想额外引入日志系统,所以引入SpringBootAdmin,但在期间遇到一个问题,模拟搭建的环境,日志输出的好好的上放到项目中就报错无法显示😂。

现象

SpringBootAdmin健康的客户端,配置了日志文件但查看是提示获取日志文件失败。Cannot read properties of undefined (reading 'split'), 接口/instances/74ad10016842/actuator/logfile返回体是JSON,实际应该是文件内容
notion image

排查问题

入口是SpringBootAdmin的服务,instances/74ad10016842/actuator/logfile,通过debug它是转到客户端的开放的clientPoint(这里自定义了前缀默认是actuator)/logfile接口上
notion image
notion image
进到客户端在logfile接口打断点,一步步进去发现配置了fastjson消息转换器,实际上是需要这个消息转换器来解析的org.springframework.http.converter.ResourceRegionHttpMessageConverter(Spring MVC中的一个消息转换器,主要用于处理从服务器返回的资源文件(如图片、视频等多媒体文件)的分块请求。它主要用于响应客户端发送的 Range 请求头,以便客户端可以请求资源文件的特定部分。)
notion image
那应该如何破解?,如上图,遍历消息转换器时有一个if判断,会走各自转换器的canWrite,所以这里是突破口,看看这个方法是否可重写
进入fastjson转换器发现有,还是调用父类的
notion image
那么对应org.springframework.http.converter.ResourceRegionHttpMessageConverter也应该有重写这个方法的,果然有
notion image
因为fastjson转换器时排在第一的,如果走了它的逻辑那么后续的就不会走了,那么怎么跳过他呢?通过上面的分析突破口就是重写fastjson的canWrite这个方法,但有需要考虑原有逻辑不被破坏,就得debug看调用logfile接口进到fastjson的canWrite时Type是什么值对应做判断跳出,如果是想全部按ResourceRegionHttpMessageConverter这个走就将它的方法逻辑copy过来取反即可。进入继承了fastjson的转换器重写了canWrite打上断点,进来看到type实现类是sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl里面装的是List<org.springframework.core.io.support.ResourceRegion>
notion image
所以将canWrite重写,重启客户端即可

🤗 总结归纳

对于这种不清楚实现逻辑的,先到网上搜索一下,或者ai问一下(但往往它很难理解你说的,这种都是有解决帖子才有大概率回答出来)
我是先将错误goggle了一下但都是讲前端怎么解决的,去百度看了一下有个人帖子提到可能是fastjson的问题,但没给出证明和解决方案,只能自己硬着头皮debug看了,通过不停打断点,梳理让后串起来,其中器到关键性作用还是百度到的帖子提醒了我,所以断点主要是看在消息转换器是如何流转的。
 
💡
有关使用上的问题,欢迎您在底部评论区留言,一起交流~
 
查询接口怎么这么慢该如何优化(1)如何定位及解决依赖版本冲突
Loading...