• 框架整合疑云


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

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

  • 相关阅读:
    二分搜素——(lower_bound and upper_bound)
    二分(搜索)查找
    算法复杂度中的O(logN)底数是多少
    hdu 1050 Moving Tables
    hdu 1010 Tempter of the Bone
    hud 3123 GCC
    “123”——> 123
    基本模运算
    101个MySQL的调节和优化的Tips
    一个最简单的图片缩略图
  • 原文地址:https://www.cnblogs.com/mczhou2/p/15194542.html
Copyright © 2020-2023  润新知