灰度发布
也叫金丝雀发布。
灰度发布和全量发布,也是是一种局部与整体的关系,灰度发布的目的是先小范围试验,然后经过一定的时间窗口之后再全量发布的发布方式。在一些敏感的服务,不适合全量发布,灰度发布是一种风险控制的策略。
灰度期:灰度发布开始到结束期间的这一段时间,称为灰度期。
粒度
- 接口粒度
- 以服务实例为级别的粒度
- 以多个服务实例组成的组为级别的粒度
原理
目前主要关注以服务实例为级别的粒度的实现。
灰度的核心就是路由。
spring-cloud后端服务与服务之间的调用往往通过Feign或者restTemplate两种方式。在调用服务的时候往往只需要写服务名就可以做到路由到具体的服务。
如果能够重写Ribbon默认的负载均衡算法,就意味着能够控制服务的转发。
-
spring-cloud服务体系下无论是通过Resttemplate还是Feign的方式进行服务间的调用,他们都会从Ribbon选择一个服务实例返回,这是路由寻址的核心。
-
服务注册中心存有关于服务的信息,Eureka有相应的接口,可以对服务实例进行操作,还可以写入Meta数据,用来对服务实例进行标志,一遍区分哪些服务是为灰度提供服务的,那些是不需要提供灰度服务的。
服务链路/调用分析
- Request => Gateway(zuul/others) => 服务RestTemplate调用 => endpoint Service
-
Request => Gateway(zuul/others) => 服务Fegin调用 => endpoint Service
-
内部服务间调用
1.重新实现自己的路由规则:GrayMetadataRule
2.重新定义restTemplate拦截器和Feign拦截器
3.在配置文件增加配置项:serviceId.ribbon.NFLoadBalancerRuleClassName=自定义的负载均衡策略类