在微服务架构中,对单个服务的灰度控制可以在请求进入该服务前的代理进行,比如ingress gateway或者客户端sidecar(如基于请求头部选择不同的版本的后端服务),全链路灰度中对链路中的每个服务的灰度也是基于此原理(定义DestinationRule、VirtualService实现),不同于单服务的灰度控制,全链路灰度需要调用链上的所有服务都有统一的VS、DR配置,并且需要在整个调用链上传递版本控制信息,每个服务基于统一的版本控制信息和VS、DR配置实现统一的灰度控制,这里就依赖业务必须接入链路追踪能力。服务网格全链路灰度利用链路追踪的trace id在sidecar里实现了inbound请求中的灰度控制信息透传到outbound请求,解决了灰度控制信息在调用链中透传的问题,如图所示:
步骤说明如下:
- 用户请求时带上特定版本控制头部x-version,业务接入了分布式链路追踪系统,请求会带上traceid。
- 经过ingress网关将请求转发到后端服务的sidecar。
- sidecar内通过自研wasm插件在内存中缓存版本控制信息(key为traceid值,value为版本控制信息)。
- sidecar将请求转发到业务,此时请求头部包含traceid和x-version。
- 由于业务接入了全链路追踪,默认会透传traceid,因此app1向外部请求时也会带上traceid。
- sidecar outbound方向从缓存中获取版本控制信息,并添加到头部中转发到app2。
- 链路内后续的调用情况类似。
通过以上过程就是服务网格全链路灰度控制的原理。