# canary **Repository Path**: cuic/canary ## Basic Information - **Project Name**: canary - **Description**: 金丝雀发布组件 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-08-15 - **Last Updated**: 2022-09-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # canary #### 介绍 金丝雀发布组件,支持Spring-cloud-loadbalancer #### 软件架构 ![输入图片说明](https://foruda.gitee.com/images/1660543767020915335/canary-ar.png "Canary-ar.png") - Canary-core为该组件的核心模块,其中CanaryMat为核心入口,在初始化后即可使用。其内部的主要组件为: 1. CanaryPublishEngine: 金丝雀发布引擎,版本路由控制入口。判断本地节点是否匹配灰度版本,判断请求上下文是否符合预设的路由规则。默认为DefaultCanaryPublishEngine。 2. VersionController: 版本控制器,对版本进行控制、录入及读取。为其他模块提供版本数据的支持。 3. VersionMathcher : 版本匹配器,判断当前版本与要发布的目标版本是否匹配。默认为DefaultVersionMatcher 4. RouteRuleChain: 路由规则控制链,针对请求上下文配合已配置的规则进行规则的判断。判断当前上下文是否路由到目标版本。默认为StaticInitRuleChain。 5. RouteRule: 路由规则根据传入的上下文和用户实现的路由规则来判断当前上下文是否能够路由到目标版本。使用Spring-cloud-canary-loadbalancer时需实现LoadBalanceRouteRule接口。 6. VersionInfoRepository: 版本信息仓库。 需由用户实现的版本信息仓库。其为各个组件提供版本信息数据的支持。在spring-cloud-canary-loadbalancer中用户可以实现抽象类AbstractLoadBalanceVersionInfoRepository的子类。 - Spring-cloud-canary-loadbalancer为对Spring-Cloud负责均衡路由的封装模块,用户可以依赖该模块对微服务项目进行灰度路由的增强。 #### 使用说明 1. 用户需要自定义VersionInfoRepository作为版本信息数据的提供类。 2. 用户需要自定RouteRule来实现定制化的路由规则。使用Spring-cloud-canary-loadbalancer时需实现LoadBalanceRouteRule接口。 3. 在Spring-cloud-canary-loadbalancer时,我们可以继承抽象类AbstractLoadBalanceVersionInfoRepository来实现对版本信息VersionInfo的读写。 4. 在Spring-cloud-canary-loadbalancer时,通过在配置文件配置 **canary.api.currentVersion: [自己版本号]** 来实现本地版本的配置 5. 通过配置**logging: level:jk.framework.**: debug**开启对金丝雀路由的日志debug模式。 #### 实现说明 ### VersionInfoRepository ``` public interface VersionInfoRepository { 添加一个版本信息 void add(VersionInfo version); 发布一个版本信息 void publish(VersionInfo version); 完成一个版本的发布 void completion(VersionInfo version); 获取到目标版本号 VersionInfo targetVersion(String routeKey); 获取本地当前版本号 VersionInfo localCurrentVersion(); } ``` ### RouteContext中的Labels预设属性key: - Header的key前缀为: header. - cookie的key前缀为:cookie. - Attribute的key前缀为: attribute. - **注意 Feign组件时默认情况下不会携带header,cookie信息传递到下个节点,如果需要使用请自行定义feign拦截器实现。** - **在SpringCloud规范中,请求的真实数据不会进入到标准化组件中,所以该模块无法获得用户请求的数据,只能得到header/cookie。attribute属性在默认的SpringCloud组件中也是以emptyMap传递。**