泳道Swimlane
约 1272 字大约 4 分钟
2025-04-23
微服务框架下服务个数多、调用链路较长,其中一个服务出问题会影响到整条链路。但QA提测往往需要该条链路上的多个服务配套测试,甚至是同时测试一个服务的多个演进版本。
提供稳定环境和多服务/多版本同时测试看似相悖的需求,通过泳道(Swimlane)能够得到解决。
测试过程中会遇到的问题
- 关于一个服务上的多个需求的同时测试,存在服务抢占分支测试的问题;
- 不同的业务组在测试时依赖的第三方服务有改动或正在进行新需求测试影响本业务测试。
什么是泳道
对服务链按需求进行分组复制,并实现逻辑、物理的隔离,使得不同需求的服务链运行在相隔的物理机器上,逻辑上如同游泳场中的泳道。
如上图,有两个 QA。第一个 QA 可以建立属于自己的泳道-1
,第二个 QA 可以建立属于自己的泳道-2
。
QA1 测试的功能在 B、C、D 服务上,它只需要建立一个有关于这次测试特性的 B、C、D 的服务,其他服务就可以复用原来的骨干链路。比如骨干链路
的请求通过泳道-1
的域名进来,首先会路由到骨干链路
的 A服务上,之后他会直接把这次请求转发给泳道-1
上的 B、C、D 服务,之后 D服务因为没有部署和他不相干的服务,所以它又会回到骨干链路
的 E服务和 F服务。
QA2 测试的功能主要是集中在 A 和 B 服务,它只需要单独部署本次测试的 A、B 服务就可以了。当请求进来,在泳道-2
上的A、B 服务流经结束,就会回到主干链路
的 C、D、E 和 F 服务上,从而实现并发测试的效果,同时保证了骨干链路的稳定,因为这个过程中骨干链路是一直没有动的,唯一动的是要测试的那部分的内容。
同时多泳道并存可以保证多服务和多版本的并行测试,并做错误的隔离,极大的提高了的服务上线的流程。
优势:
- 并行测试。(因此可以根据测试需要,部署不同分支的服务分组,多个泳道并行,多个服务/多个版本可同时提测)
- 提供稳定的骨干链路。(保证整个测试流程始终能正常运行)
- 错误隔离。(泳道内的服务发生异常 不会影响其他泳道)
泳道的特性
泳道相当于提供了多条“请求的跑道”,理解泳道主要在于理解“流量跑到哪去了”
1.泳道内如果没有部署被调用服务,流量会fallback到骨干
- 比如上图泳道-2中的B服务 调用了 骨干链路中的C服务
2.泳道内若存在被调用节点,那么流量是一定不会fallback到骨干 (包括不可用的和禁用的)
- 比如上图泳道-2中的A服务只会调用泳道-2中的B服务,即使泳道-2中的B不可用,也是不会fallback到骨干
3.骨干环境是一定不会调用到泳道内的
- 比如上图中绝对不会有 从骨干链路到泳道-2的调用
4.泳道之间是一定不会互相调用的
- 比如上图中绝对不会有 泳道-1与泳道-2之间的调用
泳道的实现
泳道实现的重点在于服务的注册、发现和服务导流。
后端服务的注册和发现的流程
1.服务B启动,上报ip、port、appkey、swimlane等信息
2.骨干链路上的服务A节点要调用B,先去取B的服务列表,并进行过滤:A不带有泳道标识,所以只会调用不带泳道标识的B服务节点
3.泳道-1上的服务A节点要调用B,也会先去取B的服务列表,并进行过滤:A带有swimlane=泳道1 标识,所以只会调用同样带有swimlane=泳道1标识的B服务节点
服务导流
- 通过域名划分泳道:为各个泳道申请单独的域名,根据域名进行分流
- 通过header携带泳道信息:请求的header字段增加“swimlane=xxxx”,标识请求要打到名为xxxx的泳道里,分流系统会根据该字段做分流。