在我们使用springmvc单体架构时,我们可以通过uri,或者请求头做多版本路由,虽然同一个功能需要维护多个版本的接口,但是对于系统而言,不会因为新增一个接口版本而影响到老用户。当我们使用springcloud构建微服务平台时,也希望能做到这一点,然而springcloud并没有提供这个功能。
在springcloud的微服务体系中,大多是使用eureka做为注册中心,ribbon做为负载均衡,hystrix做为断路器。但是在国内网络中却鲜少关于spring-cloud的接口多版本控制的开源项目,而在国内,springcloud做为越来越被创业公司认同的微服务框架,多版本控制的需求也越来越明显,于是就有了fm-cloud-bamboo这个多版本控制的项目。在开发这个项目的过程,发现只要再做一些扩展,就可以实现灰度管理,于是又有了fm-cloud-graybunny。
多版本控制
该项目是在spring-cloud-ribbon的基础上进行扩展,以实现接口的多个版本的调用及负载均衡,支持feign方式和断路器(spring-cloud-hystrix)。
场景
服务A部署了两个实例serivceA-1,serviceA-2,springcloudribbon默认是轮询的方式将请求分别转到两个实例上。如果由于业务原因,服务需要从1.0升级到2.0。
场景1:将所有服务实例平缓的过度到2.0。
场景2:2.0的服务实例需要兼容1.0的服务接口。
思路
在springcloud微服务体系中,服务的请求来源无外乎两个方面:
来源1:外部请求通过网关(zuul)转发而来。
来源2:内部服务之间的调用请求。
不论网关转发过来的请求,还是内部服务调用过来的请求,都需要ribbon做负载均衡,所以可以扩展ribbon的负载均衡策略从而实现不同版本的请求转发到不同的服务实例上。
网关的转发过程是:zuulhystrixribbon
内部服务调用的过程有两种:
RestTemplatehystrixribbon
Feignhystrixribbon
而其中hystrix有一个线程池隔离的能力,会创建另一个线程去请求服务,拥有更好的控制并发访问量、以及服务降级等能力,但是会出现一个问题,就是线程变量(ThreadLocal)的传递问题,这可以通过
转载请注明:http://www.0431gb208.com/sjszlff/11.html