【从0到1设计一个网关】灰度发布的实现

什么是灰度发布?

先简单介绍一下什么是灰度发布

灰度发布(Gray Release)是一种软件部署和发布策略,用于逐步将新版本的应用或服务引入生产环境,以降低潜在的风险并确保系统的稳定性。在灰度发布中,新版本的应用或服务不会一次性全部暴露给所有用户,而是逐渐引入一小部分用户,然后根据观察结果决定是否继续推广新版本或回滚到旧版本。这种策略有助于在生产环境中验证新功能、修复潜在问题以及逐渐接受用户反馈。

关键特点和概念:

渐进式发布:新版本逐渐替代旧版本,从一小部分用户开始,然后逐渐增加新版本的暴露范围。这可以是一个逐步增加百分比的用户,也可以是按照某种规则或条件选择的用户群体。

风险控制:通过逐渐发布,可以在早期发现和解决潜在问题,从而减轻生产环境中可能发生的故障或问题对整体系统的影响。

用户反馈:灰度发布过程中,可以收集用户的反馈和性能数据,帮助开发团队更好地了解新版本的行为和性能,以及用户的满意度。

回滚能力:如果在灰度发布期间发现了严重问题或故障,可以轻松回滚到旧版本,从而减少对用户和业务的负面影响。

分层策略:通常,灰度发布采用多层级策略,从开发环境到测试环境,再到生产环境,逐渐扩大发布的范围。这确保了新版本在不同环境中都经历了测试和验证。

自动化工具:灰度发布通常借助自动化工具和部署管道来简化流程,例如使用容器编排工具、部署蓝绿或金丝雀发布等。

灰度发布是现代软件开发和交付的一种最佳实践,它允许组织更加安全和可控地推出新功能,降低风险,提高可维护性,同时减少对用户的影响。这是特别适用于大规模和高可用性系统的策略,以确保系统的连续性和稳定性。

之后再来介绍一下:全链路灰度发布

全链路发布是一种软件交付策略,它强调在整个软件开发和交付过程中的每个环节都进行逐步验证和控制,以确保新版本的成功发布并降低风险。全链路发布覆盖了整个软件生命周期,包括开发、测试、部署、监控、用户反馈和持续改进等阶段。

灰度发布注重的是部署发布这个过程,而全链路发布则范围更加广,包含了开发的整个生命周期,从开发,测试,到部署,维护等。

知道了这个概念之后,我们就开始实现网关层面的灰度发布。

网关层实现灰度发布

在网关这里我们实现灰度发布,首先按照上面的意思,只有部分的用户会使用的是灰度发布后的服务,因此,我们需要首先设定判断,当前请求是否是灰度发布后的版本。 我们可以在请求头中设定一个 gray 字段,如果为true表示当前为一个灰度发布的版本。 之后,我们编写一定的业务逻辑,将这个请求传递下去,并且在请求头中设定当前请求是否为灰度发布的请求。

java 复制代码
@Slf4j
@FilterAspect(id = GRAY_FILTER_ID,
        name = GRAY_FILTER_NAME,
        order = GRAY_FILTER_ORDER)
public class GrayFilter implements Filter {
    public static final String GRAY = "true";
    @Override
    public void doFilter(GatewayContext ctx) throws Exception {
        //测试灰度功能待时候使用  我们可以手动指定其是否为灰度流量
        String gray = ctx.getRequest().getHeaders().get("gray");
        if (GRAY.equals(gray)) {
            ctx.setGray(true);
        }
        //选取部分的灰度用户
        String clientIp = ctx.getRequest().getClientIp();
        //等价于对1024取模
        int res = clientIp.hashCode() & (1024 - 1);
        if (res == 1) {
            //1024分之一的概率
            ctx.setGray(true);
        }

    }
}

代码如上,其实我们的实现方式就是很简单的使用了一个hash计算的方式来判断当前请求是否是灰度发布的一个流量。 同时,我们将灰度发布过滤器放入到我们的过滤器链中。 当我们设定当前的请求为一个灰度流量的时候,我们就会选择服务实例中gray=true的实例。 否则我们就选取所有的机器进行负载均衡。 而当当前是一个灰度流量,但是没有可用的灰度实例,那么我们就选取不到具体的服务进行负载均衡了,就会报错。 至此,灰度发布就已经实现了。

相关推荐
林太白2 小时前
❤Node09-用户信息token认证
数据库·后端·mysql·node.js
骆晨学长3 小时前
基于Springboot的助学金管理系统设计与实现
java·spring boot·后端
蒙娜丽宁3 小时前
深入理解Go语言中的接口定义与使用
开发语言·后端·golang·go
AskHarries4 小时前
java使用ByteBuffer进行多文件合并和拆分
java·后端
不染_是非4 小时前
Django学习实战篇六(适合略有基础的新手小白学习)(从0开发项目)
后端·python·学习·django
代码对我眨眼睛4 小时前
springboot从分层到解耦
spring boot·后端
The Straggling Crow5 小时前
go 战略
开发语言·后端·golang
ai安歌5 小时前
【JavaWeb】利用IDEA2024+tomcat10配置web6.0版本搭建JavaWeb开发项目
java·开发语言·后端·tomcat·web·intellij idea
尘浮生5 小时前
Java项目实战II基于Java+Spring Boot+MySQL的作业管理系统设计与实现(源码+数据库+文档)
java·开发语言·数据库·spring boot·后端·mysql·spring
程序员阿鹏6 小时前
ArrayList 与 LinkedList 的区别?
java·开发语言·后端·eclipse·intellij-idea