通过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的表中,从而实现灰度数据和基线环境数据表隔离的效果。

  1. 登录数据管理DMS 5.0控制台创建基线环境表。数据库建表语句如下:
    CREATE TABLE `mse_demo_table` (
      `id` int NOT NULL AUTO_INCREMENT,
      `location` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
    ;
  2. 数据管理DMS 5.0控制台创建影子表,因为需要创建灰度Gray环境,所以需要创建影子表mse_demo_table_gray。数据库建表语句如下:
    CREATE TABLE `mse_demo_table_gray` (
      `id` int NOT NULL AUTO_INCREMENT,
      `location` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
    ;

步骤二:开启全链路灰度

配置MSE的全链路发布,详情请参见配置基于Ingress网关的全链路灰度

步骤三:开启数据库灰度

  1. 登录MSE治理中心控制台。并在顶部菜单栏选择地域。
  2. 在左侧导航栏选择治理中心 > 应用治理
  3. 应用列表页面单击目标应用的资源卡片,然后在左侧导航栏单击数据库治理,单击页面的数据库灰度页签。
  4. 数据库治理页面单击数据库灰度页签。
    1. 单击开启数据库灰度右侧的编辑按钮图标编辑,然后单击开启按钮图标开启开启数据库灰度。
    2. 单击需要灰度的数据库表的右侧下拉框,选择需要灰度的数据库表。
    参数 描述
    开启数据库灰度开关 开启数据库灰度能力,此功能实时生效,无需重启应用。
    需要灰度的数据库表 选择需要灰度的数据库表。如果您没有选择需要灰度的数据库表,则表示全部数据库表都需要灰度。
    注意 需要您提前创建对应的影子表,否则灰度SQL执行会找不到对应的数据库表。

结果验证

通过如下SQL语句查询影子表,确认灰度环境的数据都插入至影子表,同时在MSE的SQL洞察页面发现已有灰度SQL的执行情况。
SELECT * FROM `mse_demo_table_gray`
灰度SQL的执行情况