灰度发布是指在黑与白之间,可以平滑过渡的一种发布方式。在其上能够进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,若是用户对B没有什么反对意见,那么逐步扩大范围,把全部用户都迁移到B上面来。灰度发布能够保证总体系统的稳定,在初始灰度的时候就能够发现、调整问题,以保证其影响度。web
在开发或者测试的时候,或者线上发布,线上服务多版本控制的时候,须要对服务提供权重路由,最多见的使用就是,一个服务有两个版本,旧版本V1,新版本v2。在线上灰度的时候,须要经过网关动态实时推送,路由权重信息。好比95%的流量走服务v1版本,5%的流量走服务v2版本。spring
如何使用SpringCloud进行灰度发布呢?将分一下四步:后端
Spring Cloud Gateway中提供了org.springframework.cloud.gateway.handler.predicate.WeightRoutePredicateFactory去实现根据分组设置权重进行路由,所以使用起来相对比较简单,有兴趣的能够debug阅读源码。app
咱们经过在Spring Cloud Gateway中会配置不一样的权重信息到不一样URL上,Spring Cloud Gateway会根据咱们配置的路由权重信息,将请求分发到不一样的源服务组,权重信息如ch4/ch4-gateway中的application.yml所示,主要配置信息以下。测试
spring: ui
cloud:spa
gateway: discovery: locator: enabled: true routes: - id: order-service1 uri: lb://order/order/create1 order: 8000 predicates: - Path=/order/create filters: - StripPrefix=1 - Weight=order-service, 95 - id: order-service2 uri: lb://order/create2 order: 8000 predicates: - Path=/order/create filters: - StripPrefix=1 - Weight=order-service, 5
Weight=order-service1, 95,Weight=service1, 5就是路由的权重信息。debug
源服务在本案例中为order模块源服务,主要提提供Gateway Server权重路由对应的后端源服务。由于比较简单所以不作详细说明,主要代码以下所示。版本控制
import org.springframework.web.bind.annotation.RequestMapping;code
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
@RequestMapping("/create1")
public String orderCreateV1() {
//此处写业务逻辑代码 return "success";
}
@RequestMapping( "/ceate2")
public String v2() {
//此处写业务逻辑代码 return “success”;
}
}
分别启动gateway,order进行访问:http://localhost:5001/order/create 测试,发现会根据所设权重进行路由。
到第三步完成之后,如今能够经过修改配置的如何根据现有的服务在线动态更新权重呢?使用zookeeper做为spring cloud的注册和配置中心,gateway模块和order模块配置监控配置的变化,若是想作动态灰度发布,增长后台在线配置管理界面,并在线修改gateway的配置,实现动态的灰度发布,而不用每次修改都要从新启动gateway。
spring:
cloud:
zookeeper: enabled: true connect-string: localhost:2181 config: root: /config enabled: true watcher: enabled: true
使用ZKUI来可视化管理Zookeeper,登陆ZKUI->import 选择对应文件导入便可。ZKUI安装使用请自行百度。
以上就是我使用spring cloud进行灰度发布的过程记录。