IT袋

当前位置:主页 > 经验教程 > 建站编程 >

微服务灰度发布的底层实现

微服务灰度发布的底层实现 微服务灰度发布的技术实现方式(2)

时间:2024-03-06 21:21:17 来源:IT袋 作者:马勇
导读:微服务灰度发布的底层实现,灰度发布的具体实现步骤如下: 前端程序在灰度测试的用户 Header 头中打上标签,例如在 Header 中添加“gray-tag: true”,其表示要进行灰常测试(访问灰度

微服务灰度发布的底层实现

灰度发布的具体实现步骤如下:

  1. 前端程序在灰度测试的用户 Header 头中打上标签,例如在 Header 中添加“gray-tag: true”,其表示要进行灰常测试(访问灰度服务),而其他则为访问正式服务。
  2. 在负载均衡器 Spring Cloud LoadBalancer 中,拿到 Header 中的“gray-tag”进行判断,如果此标签不为空,并等于“true”的话,表示要访问灰度发布的服务,否则只访问正式的服务。
  3. 在网关 Spring Cloud Gateway 中,将 Header 标签“gray-tag: true”继续往下一个调用服务中传递。
  4. 在后续的调用服务中,需要实现以下两个关键功能:
    1. 在负载均衡器 Spring Cloud LoadBalancer 中,判断灰度发布标签,将请求分发到对应服务。
    2. 将灰度发布标签(如果存在),继续传递给下一个调用的服务。

经过第四步的反复传递之后,整个 Spring Cloud 全链路的灰度发布就完成了。

4、具体实现

4.1、版本标识

在灰度发布的执行流程中,有一个核心的问题,如果在 Spring Cloud LoadBalancer 进行服务调用时,区分正式服务和灰度服务呢?

这个问题的解决方案是:在灰度服务既注册中心的 MetaData(元数据)中标识自己为灰度服务即可,而元数据中没有标识(灰度服务)的则为正式服务,以 Nacos 为例,它的设置如下:

spring:
  application:
    name: gray-user-service
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: localhost:8848
        namespace: public
        register-enabled: true 
        metadata: { "gray-tag":"true" } # 标识自己为灰度服务

4.2、负载均衡调用灰度服务

Spring Cloud LoadBalancer 判断并调用灰度服务的关键实现代码如下:

private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances,
                                                          Request request) {
        // 实例为空
        if (instances.isEmpty()) {
            if (log.isWarnEnabled()) {
                log.warn("No servers available for service: " + this.serviceId);
            }
            return new EmptyResponse();
        } else { // 服务不为空
            RequestDataContext dataContext = (RequestDataContext) request.getContext();
            HttpHeaders headers = dataContext.getClientRequest().getHeaders();
            // 判断是否为灰度发布(请求)
            if (headers.get(GlobalVariables.GRAY_KEY) != null &&
                    headers.get(GlobalVariables.GRAY_KEY).get(0).equals("true")) {
                // 灰度发布请求,得到新服务实例列表
                List<ServiceInstance> findInstances = instances.stream().
                        filter(s -> s.getMetadata().get(GlobalVariables.GRAY_KEY) != null &&
                                s.getMetadata().get(GlobalVariables.GRAY_KEY).equals("true"))
                        .toList();
                if (findInstances.size() > 0) { // 存在灰度发布节点
                    instances = findInstances;
                }
            } else { // 查询非灰度发布节点
                // 灰度发布测试请求,得到新服务实例列表
                instances = instances.stream().
                        filter(s -> s.getMetadata().get(GlobalVariables.GRAY_KEY) == null ||
                                !s.getMetadata().get(GlobalVariables.GRAY_KEY).equals("true"))
                        .toList();
            }
            // 随机正数值 ++i( & 去负数)
            int pos = this.position.incrementAndGet() & Integer.MAX_VALUE;
            // ++i 数值 % 实例数 取模 -> 轮询算法
            int index = pos % instances.size();
            // 得到服务实例方法
            ServiceInstance instance = (ServiceInstance) instances.get(index);
            return new DefaultResponse(instance);
        }
    }

相关阅读

  • 深入理解Adam优化器:工作原理与深度学习的应用

    深入理解Adam优化器:工作原理与深度学习的应用

    今日重点为您介绍深入理解Adam优化器的相关经验,接下来IT袋网小编就来介绍。 介绍Adam优化器 Adam优化器是一种用于深度学习模型训练的优化算法,自2015年提出以来,已广泛应用于各种机器学

  • Javascript基础入门 学习Javascript的基础知识

    Javascript基础入门 学习Javascript的基础知识

    今日IT小知识分享:Javascript基础入门的介绍,一起来看看吧! JavaScript, 是一门能够运行在浏览器上的脚本语言. 简称JS. 首先,,Javascript这个名字的由来就很有意思, 不少人认为Javascript和Java貌似

  • dnf模型补丁制作教程 关于dnf补丁最全的网站

    dnf模型补丁制作教程 关于dnf补丁最全的网站

    一篇方法教程,与您分享dnf模型补丁制作教程和关于dnf补丁最全的网站方面的内容,接下来就是全面介绍。 我发了很多游戏补丁的视频,很多小伙伴都下载了,但是却很多人不会使用,虽然说

  • 现在小说网站投稿哪里好 适合短篇小说投稿的网站推荐

    现在小说网站投稿哪里好 适合短篇小说投稿的网站推荐

    本文核心内容:现在小说网站投稿哪里好和适合短篇小说投稿的网站推荐方面的内容,请看下面详细的介绍。 很多朋友想通过写网络小说赚钱,又不知道哪个平台好,哪个平台适合自己。下面