GateWay网关 和 Nacos 实现灰度发布解决方案

一、灰度发布

灰度发布是一种软件部署策略,旨在逐步将新版本的软件或功能引入生产环境,以减少潜在的风险并确保系统稳定性。在灰度发布过程中,新版本的软件或功能会逐渐向用户群体或服务器集群中的一部分进行发布和测试,而不是立即将其推送给所有用户或服务器。

假设有一家在线购物网站决定推出一个新的购物车功能,他们可以使用灰度发布来逐步引入这个新功能:

  1. 初始阶段: 在初始阶段,该网站仅将新购物车功能部署到少数用户的浏览器中,例如仅向公司内部员工的浏览器中推送该功能。

  2. 内部测试: 在部署给内部员工后,开发团队会对新功能进行全面测试,以确保它与现有系统兼容并且没有明显的缺陷。

  3. 逐步扩大范围: 一旦内部测试通过,该网站可以将新功能扩展到一小部分真实用户的浏览器中。这些用户可能是志愿者或特定的用户组。

  4. 持续监测: 在新功能扩展到更多用户之后,开发团队会持续监测系统的性能和稳定性。如果出现问题,他们可以快速回滚到旧版本,或者在修复问题后再次尝试发布。

  5. 全面发布: 一旦新功能在灰度发布期间被认为是稳定和可靠的,该网站将该功能发布给所有用户,并将其纳入正式的生产环境中。

而在我们的解决方案中,是基于 GateWayNacos 实现的,将生产的服务和灰度环境的服务统一注册到 Nacos 中,使用版本区分,比如生产环境版本为 1.0 ,灰度环境版本为 2.0 ,请求经过网关后,判断携带的用户是否为灰度用户,如果是将请求转发至 2.0 的服务中,否则转发到 1.0 的服务中。

二、实施

1.将两个服务实例注册到Nacos上,在元数据中区分版本

spring:
  cloud:
    nacos:
      discovery:
        metadata:
          version: 1.0/2.0

2.网关中创建一个 ThreadLocal ,用来存储当前的版本信息

public class GrayscaleThreadLocalEnvironment {
    private static ThreadLocal threadLocal = new ThreadLocal();
    
    public static void setCurrentEnvironment(String currentEnvironmentVsersion) {
        threadLocal.set(currentEnvironmentVsersion);
    }
    
    public static String getCurrentEnvironment() {
        return threadLocal.get();
    }
}

3.网关中创建过滤器对请求进行拦截,获取到用户的信息,然后判断是否为灰度用户,如果是的话

你可能感兴趣的:(java,gateway)