带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(3)https://developer.aliyun.com/article/1339609?groupCode=taobaotech
仓储层代理
如果走了代理类,那么逻辑都会被转发到ProxyManager,由代理类管理器来负责数据的分发、去重、合并、更 新、插入等操作。
单条数据查询
代理查询流程图如下图所示,目标接口的目标方法会通过代理被切面拦截掉,切面判断是否需要走代理接口
- 如果不需要走代理接口(即数据源是老的并且未被灰度),则继续走目标接口
- 如果需要走代理接口(即数据源是新的或者老数据迁移后在灰度列表内),则调用代理接口方法,在代理接口方法中会对仓储层逻辑进行进一步的转发,由ProxyManager统一进行收口。在单条数据的查询逻辑里,只需 要调用代理仓储层服务查询新数据源就可以了,逻辑比较简单。
例如单个门店的信息查询,那么我们核心控制器ProxyManager方法逻辑就可以这么实现:
public <T> T getById(Long id, Boolean enableProxy) { if (enableProxy) { // 开启代理,就走代理仓储层的查询服务return proxyRepository.getById(id); } else { // 没开启代理,走原来仓储层的服务return targetRepository.getById(id); }
多条数据查询+去重
多条数据的去重逻辑是一样,去重规则如下:
- 新表、老表都不存在,数据剔除,不反回结果。
- 新表没有,使用老表数据的信息。
- 老表没有,使用新表数据的信息。
- 老表、新表都存在数据(迁移完成),此时判断总控是否打开,以及数据是否在灰度名单,满足其一使用新表数据;否则使用老表数据
基于以上去重逻辑,所有的查询接口都可以抽象成统一的方法
- 查询老数据,业务定义,用supply函数封装查询逻辑
- 查询新数据,业务定义,用supply函数封装查询逻辑
- 合并去重,抽象出统一的合并工具
核心的流程如下图所示,目标接口的目标方法都会被切面拦截,转发到代理接口。代理接口在调用数据源的地方可以进一步转发给ProxyManager进行查询&合并。如果总开关未开启,说明全量数据还没有迁移验证完毕,那么还 是需要查老的数据源(防止数据遗漏)。如果开关开启了,则说明迁移完成,此时不会再调用原来的仓储层服务, 达到了对老的数据源收口的目的。
带你读《2022技术人的百宝黑皮书》——一种可灰度的接口迁移方案(5)https://developer.aliyun.com/article/1339607?groupCode=taobaotech