框架整合疑云
最近在整合框架的时候遇到的一些问题特意记录下来,分享给大家,避免大家在做这块的时候。
整合现状:1、SpringBoot已经完成了统一结果返回改造
2、对应的配置文件已经放到nacos里面。
接下来动作:引入服务监控功能,由于项目规模不大,涉及到的服务也不多,所以决定对接SpringBootAdmin。
跟着官方教程一步一步来,前面都很顺,等服务启动之后,访问http://xxx.xx.xx:8080/wallboard之后发现注册进来的服务状态不对。明明服务启动
没有任何异常。
原因分析:SpringBootAdmin通过调用接入服务的http://127.0.0.1:8889/actuator/health的返回值来判断服务是否正常。
正常返回结果是
{ "status": "UP", "components": { "db": { "status": "UP", "details": { "database": "MySQL", "validationQuery": "isValid()" } }, "diskSpace": { "status": "UP", "details": { "total": 69823623168, "free": 63936913408, "threshold": 10485760, "exists": true } }, "ping": { "status": "UP" } } }
但服务实际返回的格式
{ "code": 1000, "msg": "操作成功", "data": { "status": "UP", "components": { "db": { "status": "UP", "details": { "database": "MySQL", "validationQuery": "isValid()" } }, "diskSpace": { "status": "UP", "details": { "total": 69823623168, "free": 63936671744, "threshold": 10485760, "exists": true } }, "ping": { "status": "UP" } } } }
到这里就知道原因了,原来是我的统一返回结果处理导致的。原因找到了,解决也就不难了。
改造后的统一返回结果代码如下
@RestControllerAdvice public class ResponseControllerAdvice implements ResponseBodyAdvice<Object> { @Override public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) { //如果接口返回类型本身就是ResultVO那就没必要进行额外的操作,返回false String name = methodParameter.getMethod().getDeclaringClass().getName(); return Objects.nonNull(name) && name.contains("com.hengtiansoft.controller") && !methodParameter.getParameterType().equals(ResultVO.class); } @Override public Object beforeBodyWrite(Object data, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { // String类型不能直接包装,所以要进行些特别的处理 if (methodParameter.getGenericParameterType().equals(String.class)) { ObjectMapper objectMapper = new ObjectMapper(); try { // 将数据包装在ResultVO里后,再转换为json字符串响应给前端 return objectMapper.writeValueAsString(new ResultVO<>(data)); } catch (JsonProcessingException e) { throw new APIException("返回String类型错误"); } } //对于分页返回结果处理 if (methodParameter.getParameterType().equals(Page.class)) { Page page = (Page) data; PageVO result = new PageVO(); result.setPage(page.getPageNum()); result.setSize(page.getPageSize()); result.setTotal(page.getTotal()); result.setDataList(page.getResult()); return new ResultVO<>(result); } // 将原本的数据包装在ResultVO里 return new ResultVO<>(data); } }
至此服务注册显示就正常了。但是当我们把SpringBootAdmin配置文件放到nacos之后发现又有问题了。
通过走读源码发现,由于SpringBoot需要加载admin配置的时候,这时候nacos配置信息还没有加载进来,由于nacos默认不开启预加载,
所以为了解决这个问题,nacos配置项中预加载开关需要打开,对应的配置文件修改如下:
nacos: config: auto-refresh: true bootstrap: enable: true -- 预加载配置项 data-id: data-receive-msg server-addr: 172.16.130.52:8848 type: yaml
至此SpringBoot2接入SpringBootAdmin就可以正式使用了。