框架整合疑云

     最近在整合框架的时候遇到的一些问题特意记录下来,分享给大家,避免大家在做这块的时候。

     整合现状: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就可以正式使用了。

 

posted @ 2021-08-27 17:12  码匠工人  阅读(30)  评论(0编辑  收藏  举报