通过MSE提供的数据隔离方案,您可以在不需要修改任何业务代码的情况下,实现数据库层面全链路灰度。
背景信息
微服务体系架构中,服务之间的依赖关系错综复杂。例如,某个功能发布上线依赖多个服务同时升级上线,对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,即通过构建从网关到后端服务的环境隔离,来对多个不同版本的服务进行灰度验证。
在发布过程中,只需部署服务的灰度版本。流量在调用链路上流转时,由流经的网关、各个中间件以及各个微服务来识别灰度流量,并动态转发至对应服务的灰度版本。如下图所示,用不同的颜色来表示不同版本的灰度流量,可以看出无论是微服务网关还是微服务本身都需要识别流量,根据治理规则做出动态决策。当服务版本发生变化时,这个调用链路的转发也会实时改变。相比于利用机器搭建的灰度环境,不仅可以节省大量的机器成本和运维人力,而且可以帮助开发者实时快速的对线上流量进行精细化的全链路控制。

通过影子表实现数据库灰度
一般通过数据库灰度解决数据隔离的问题。本文介绍在数据库层面通过影子表的方式实现数据层面的流量隔离。
支持组件
数据库连接池的组件支持版本如下:
组件 | JDK 1.7支持版本 | JDK 1.8支持版本 | JDK 11支持版本 |
---|---|---|---|
Druid | 1.0.0或以上版本 | 1.2.4或以上版本 | 1.2.4或以上版本 |
HikariCP | 2.3.0或以上版本 | 2.3.13或以上版本 | 2.3.13或以上版本 |
步骤一:数据库建表
影子表方案是在同一个实例的同一个数据库上建立对应的影子表。在执行SQL的过程中,对灰度流量的SQL进行解析与修改,实现不同环境流量的SQL分别访问对应的表。假设基线环境的表的名称为mse_demo_table
,那么Gray环境的流量可以映射到mse_demo_table_gray
的表中,从而实现灰度数据和基线环境数据表隔离的效果。
步骤二:开启全链路灰度
配置MSE的全链路发布,详情请参见配置基于Ingress网关的全链路灰度。
步骤三:开启数据库灰度
结果验证
通过如下SQL语句查询影子表,确认灰度环境的数据都插入至影子表,同时在MSE的SQL洞察页面发现已有灰度SQL的执行情况。
SELECT * FROM `mse_demo_table_gray`
