ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Nacos2.0.3 Dubbo k8s灰度下线

2022-01-04 18:30:42  阅读:196  来源: 互联网

标签:Dubbo String Nacos2.0 ip clusterName 灰度 nacosDiscoveryProperties put port


/**
     *
     * <pre>
     *     如果通过配置dubbo.service.shutdown.wait=20000(默认10000,10秒)这种方式,
     *     k8s.terminationGracePeriodSeconds=缩小时间间隔,
     *     则会有线上的在途服务突然中断或者其他错误,
     *
     *     借助k8s的容器层的preStop来做灰度下线,并不影响线上服务,
     *
     *     a. 先让nacos服务主动下线,
     *     b. 然后等待一段时间再关闭容器(尽量是5秒以上),
     *     c. 设置nacos的心跳超时(可选)
     *
     *     主动下线方法中,1调nacos实例下线(no run),2.调nacos的超时(仅在springcloud服务中能和),3.调dubbo的hoop shutdown接口
     *     最后选择用3.dubbo的shutdown接口
     *
     *     不能做到绝对的灰度
     *
     * </pre>
     *
     * @param map
     * @return 成功标记
     */
    public boolean nacosDown(Map map) {

        String serviceName = nacosDiscoveryProperties.getService();
        String groupName = nacosDiscoveryProperties.getGroup();
        String clusterName = nacosDiscoveryProperties.getClusterName();
        String server = nacosDiscoveryProperties.getServerAddr();
        String ip = nacosDiscoveryProperties.getIp();
        int port = nacosDiscoveryProperties.getPort();
        log.info("nacosDown deregister from nacos, serviceName:{}, groupName:{}, clusterName:{}, server:{}, ip:{}, port:{} ", serviceName, groupName, clusterName, server, ip, port);

        try {
            //由于它会比terminationGracePeriodSeconds先执行,所以如果立刻下线的话新的pods还没开好的话,

            //a. 先让nacos服务主动下线,
//            DubboShutdownHook.destroyAll();

            //b. 然后等待一段时间再关闭容器(尽量是5秒以上),
            Thread.sleep(waitTime * 1000);

            //c. 设置nacos的心跳超时(可选)
            nacosSetTimeout(nacosDiscoveryProperties);

            log.info("nacosDown sucess deregister from nacos, serviceName:{}, clusterName:{}, ip:{}, port:{}", serviceName, clusterName, ip, port);

        } catch (Exception e) {
            e.printStackTrace();
        }


        log.info("nacosDown deregister from nacos, serviceName:{}, groupName:{}, clusterName:{}, server:{}, ip:{}, port:{} ", serviceName, groupName, clusterName, server, ip, port);

        return true;
    }


    /**
     * c. 设置nacos的心跳超时(可选)
     * @param nacosDiscoveryProperties
     */
    private void nacosSetTimeout(NacosDiscoveryProperties nacosDiscoveryProperties) {
        String serviceName = nacosDiscoveryProperties.getService();
        String clusterName = nacosDiscoveryProperties.getClusterName();
        String server = nacosDiscoveryProperties.getServerAddr();
        String ip = nacosDiscoveryProperties.getIp();
        int port = nacosDiscoveryProperties.getPort();
        String nameSpace = nacosDiscoveryProperties.getNamespace();

        String[] split = server.split(",");
        JSONObject variables = new JSONObject();
        variables.put("namespaceId", nameSpace);
        variables.put("serviceName", serviceName);

        JSONArray instantsList = new JSONArray();   //实例ip
        JSONObject instantsOne = new JSONObject();
        instantsOne.put("ip", ip);
        instantsOne.put("port", port);
        instantsOne.put("clusterName", clusterName);
        instantsList.add(instantsOne);
        variables.put("instances", instantsList.toJSONString());

        JSONObject metaDataOne = new JSONObject();
        metaDataOne.put(PreservedMetadataKeys.HEART_BEAT_INTERVAL, "1000");
        // 设置心跳超时时间,单位为秒,这里将心跳超时时间设为500毫秒
        // 即服务端6秒收不到客户端心跳,会将该客户端注册的实例设为不健康:
        metaDataOne.put(PreservedMetadataKeys.HEART_BEAT_TIMEOUT, "500");
        // 设置实例删除的超时时间,单位为秒,这里将实例删除超时时间设为500毫秒,
        // 即服务端9秒收不到客户端心跳,会将该客户端注册的实例删除:
        metaDataOne.put(PreservedMetadataKeys.IP_DELETE_TIMEOUT, "500");
        variables.put("metadata", metaDataOne.toJSONString());

        nacosMetaUrl = split[0] + nacosMetaUrl;
        if (variables != null) {
            nacosMetaUrl = nacosMetaUrl + "?" + asUrlVariables(variables);
        }

        log.info("nacosDown rest , nacosMetaUrl:{} ", nacosMetaUrl);
        JSONObject result = RestUtil.put(nacosMetaUrl);
        log.info("nacosDown rest ok , nacosMetaUrl:{}, result:{} ", nacosMetaUrl, result.toJSONString());
    }

    public static String asUrlVariables(JSONObject variables) {

        Map<String, Object> source = variables.getInnerMap();
        Iterator<String> it = source.keySet().iterator();

        StringBuilder urlVariables;
        String key;
        String value;
        for(urlVariables = new StringBuilder(); it.hasNext(); urlVariables.append("&").append(key).append("=").append(value)) {
            key = (String)it.next();
            value = "";
            Object object = source.get(key);
            if (object != null && !StrUtil.isEmpty(object.toString())) {
                value = object.toString();
            }
        }

        return urlVariables.substring(1);
    }

标签:Dubbo,String,Nacos2.0,ip,clusterName,灰度,nacosDiscoveryProperties,put,port
来源: https://blog.csdn.net/shine0181/article/details/122308860

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有