Nacos2.0.3 Dubbo k8s灰度下线

private int waitTime = 8;                      //等待几秒 todo
//    private String nacosMetaUrl = "http://10.18.225.115:8848/nacos/v1/ns/instance/metadata/batch
    private String nacosMetaProt = "http://";
    private String nacosMetaHttpProt = "PUT";
    private String nacosMetaUrl = "/nacos/v1/ns/instance/metadata/batch";

    @Autowired
    NacosDiscoveryProperties nacosDiscoveryProperties;

    /**
     *
     * <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 = nacosMetaProt + split[0] + nacosMetaUrl;
//        if (variables != null) {
//            nacosMetaUrl = nacosMetaUrl + "?" + asUrlVariables(variables);
//        }

        log.info("nacosDown rest , nacosMetaUrl:{} , variables: {}", nacosMetaUrl, asUrlVariables(variables));
//        JSONObject result = RestUtil.put(nacosMetaUrl, variables);
        String result = RestUtil(nacosMetaUrl, variables, nacosMetaHttpProt);
        log.info("nacosDown rest ok , nacosMetaUrl:{}, result:{} ", nacosMetaUrl, result);
    }

    /**
     * <pre>
     *
     * 模拟curl, Core的RestUtil跑不通,自己撸了个curl
     *
     * 报文demo
     * 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());
     *
     *
     * </pre>
     * @param url 链接
     * @param variables 参数
     * @param METHOD 如PUT,GET,POST等, 必须大写
     * @return
     */
    public static String RestUtil(String url, JSONObject variables, String METHOD) {

//        String parm = "\"[\\\"default\\\",\\\"ASDSFGSDGRRGSSSSS\\\"]\"";
        String[] cmds = {"curl", "-X", METHOD, url, "-d", " " + asUrlVariables(variables)};
        log.info("nacosDown rest , rest : {}, ", cmds.toString());
        ProcessBuilder process = new ProcessBuilder(cmds);
        StringBuilder builder;
        Process p;
        try {
            p = process.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            builder = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
                builder.append(System.getProperty("line.separator"));
            }
            return builder.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;

    }

    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);
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Nacos是一个用于配置管理和服务发现的开源平台。要下载Nacos 2.0.3版本,可以按照以下步骤进行: 1. 打开Nacos官方网站。 2. 在主页上,点击"获取Nacos"按钮,进入下载页面。 3. 在下载页面上,可以看到各种Nacos版本的下载链接。 4. 找到2.0.3版本的下载链接,通常会列在最新发布的版本中。 5. 点击2.0.3版本的下载链接,进入下载页面。 6. 根据不同操作系统选择下载对应的版本,如Windows、Linux、Mac等。 7. 点击下载按钮,等待下载完成。 8. 下载完成后,可以将下载的安装包解压到指定文件夹中。 9. 运行解压后的文件夹里的启动命令或脚本来启动Nacos服务。 需要注意的是,为了确保安全,建议从官方网站进行下载,以获得可信且最新的版本。此外,如果有其他特定的配置要求或文档需求,可以查阅官方网站的相关文档,以获取更详细的使用指南。 ### 回答2: Nacos是一个开源的分布式服务注册、发现和配置管理平台,它的2.0.3版本是其中的一个重要更新版本。要下载Nacos 2.0.3版本,你可以按照以下步骤进行: 1. 打开Nacos的官方网站(https://nacos.io/zh-cn/),在网站的导航栏中找到“文档”一栏。 2. 进入“文档”页面后,可以看到不同版本的文档,找到并点击“2.0.3-GA版本”。 3. 在“2.0.3-GA版本”页面中,可以看到"Nacos 2.0.3-GA 下载"的标签,点击下载链接。 4. 根据你的需要,选择合适的下载选项,比如Windows、Linux或者MacOS版本,点击下载链接即可下载相应版本的Nacos 2.0.3。 5. 下载完成后,解压缩得到的压缩包文件。 6. 进入解压缩后的文件夹,根据文档提供的说明,配置Nacos的相关参数。 7. 根据所需的使用场景,运行相应的命令来启动Nacos服务。 需要注意的是,下载Nacos 2.0.3之前,你也可以查看官方网站上的Nacos文档,了解更多关于Nacos的使用指南和配置说明,以便更好地使用和运行Nacos。 ### 回答3: nacos 2.0.3版本是什么 Nacos 2.0.3是一个开源的服务发现和配置管理平台。它具有高度动态、可伸缩和弹性的特征,适用于现代云原生架构。Nacos支持多种注册中心和配置管理模式,并集成了动态DNS服务、权重路由、灰度发布等功能。 Nacos 2.0.3版本的下载方式 要下载Nacos 2.0.3版本,您可以按照以下步骤进行操作: 1. 打开Nacos官方网站(https://github.com/alibaba/nacos/releases)。 2. 在页面中找到2.0.3版本的发布。 3. 点击2.0.3版本的下载链接,将会跳转到一个包含可执行文件的页面。 4. 根据您所使用的操作系统,选择适合您的安装包。 5. 点击下载按钮开始下载安装包。 6. 下载完成后,解压缩安装包到您选择的任意目录。 需要注意的是,安装Nacos之前,您需要确保已经安装了Java运行时环境,因为Nacos是基于Java开发的。另外,为了方便使用,您可能还需要配置一些环境变量和系统参数。 总结 Nacos是一个功能强大的服务发现和配置管理平台,2.0.3版本是其提供的一个稳定版本。通过官方网站可以简单地下载安装包,并遵循相应的安装指南来安装Nacos。安装完成后,您就可以开始使用Nacos来管理您的微服务架构了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

折腾数据折腾代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值