1、什么是灰度发布
以下是百度词条的解释:
灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
说的简单点就是在同一时间,不同用户使用同一功能时看到不同的结果,不同之处可能是界面上的,如按钮上的文字;或业务流程,如跳转支付流程,在原来的流程上多了一个新页面或多了一些选项。
2、为什么要灰度发布
灰度发布的主要目的是保证系统的可用性。因为每一次线上变更都无法保证系统100%的无bug,所以变更后要在线上小范围验证,等没问题再全面放开。
3、常用的灰度发布方式有哪些
1、按机器灰度
线上有多台机器,先将新功能代码部署到其中的1台或多台机器,然后绑定到这些机器进行测试,测试完没问题再部署到所有机器。
2、业务代码中写灰度逻辑
在业务代码中写好判断当前用户是否需要走灰度,如果是走新流程,不是还是走老流程。
打个比方,我们要做一个加密数据库字段的功能,先判断当前用户是否灰度,如果是则将其数据加密,否则不加密。
4、案例分析
我们以一个实际的例子来分析如何做灰度。
假设我们要上线一个迭代,主要有两个大的功能:
1、数据库字段加密
即对数据库部分敏感字段加密存储
2、接口加密
即对接口返回的敏感数据进行加密
另外假设我们的数据库只有一个用户表,其中的mobile字段需要加密存储:
字段 | 类型 | 说明 |
---|---|---|
id | int | 主键 |
name | varchar(50) | 用户名称 |
mobile | varchar(50) | 手机 |
系统部署如下:
用户请求首先访问负载均衡器,然后由负载均衡器路由到一台WEB,WEB调用到其中一台Service获取数据。
先分析下这次上线会上线哪些新功能:
1、数据库保存加密
2、数据库查询解密
3、接口返回加密
首先思考下,我们需要对3个功能都灰度吗?
因为数据库保存加密做了灰度的话,数据库查询解密相当于也做了灰度。所以功能2:数据库查询解密就不用单独做灰度了。
怎么做灰度呢,按前面分析的方式逐个分析:
1、先只将功能发布到1台机器,然后绑定HOST到这台机进行测试
即先将加密功能的代码部署到1台机器,然后绑定到这台机进行测试。
这样只有我们自己测试的数据才是加密的,线上功能不受影响;
一般业务逻辑会下沉到Service层,服务调用上需要支持将某1台WEB机上的某个Service指定到特定机器,这需要服务调用框架等中间件的支持。
另外在微服务架构下,可能有Service之间相互调用,所以Service之间的调用也要能做到根据规则做路由。
还要考虑的是在新代码机器测试的用户数据是加密的,而线上其他机器没有发布,则这些用户访问其它机器功能是不正常的,所以这个也只能限定进行灰度的用户是内部用户。
2、应用中判断当前用户是否灰度
即在配置文件中配置哪些用户是灰度用户,然后代码中判断是否灰度用户,如果是则对其数据进行加密,如果不是还是走原来的流程,等测试没问题了,把灰度用户放开到所有用户。
这种方案操作会比较复杂些,配置灰度用户可能需要分几批,如果配置中心等基础服务都上来了,操作还好,不然就得一台一台机器人肉了~
另外这种方案对业务侵入性比较大,如果每个项目都需要这么实现,工作量就比较大。所以这种方案适合一些业务流程改动非常大的、涉及的系统非常多、需要让非内部用户进行实际验证的场景。