|
1 | | -## Spring Cloud版本控制和灰度发布 |
| 1 | +# Spring Cloud Gray - 微服务灰度路由中间件 |
2 | 2 |
|
3 | 3 |
|
4 | | -在我们使用spring mvc单体架构时,我们可以通过uri,或者请求头做多版本路由,虽然同一个功能需要维护多个版本的接口,但是对于系统而言,不会因为新增一个接口版本而影响到老用户。当我们使用spring cloud构建微服务平台时,也希望能做到这一点,然而spring cloud并没有提供这个功能。 |
| 4 | +[](https://www.apache.org/licenses/LICENSE-2.0.html) |
| 5 | +[](https://github.com/SpringCloud/spring-cloud-gray/releases/tag/A.1.0.10) |
5 | 6 |
|
6 | | -在spring cloud的微服务体系中,大多是使用eureka做为注册中心,ribbon做为负载均衡,hystrix做为断路器。但是在国内网络中却鲜少关于spring-cloud的接口多版本控制的开源项目,而在国内,spring cloud做为越来越被创业公司认同的微服务框架,多版本控制的需求也越来越明显,于是就有了开发多版本控制和灰度管理的想法。 |
7 | 7 |
|
| 8 | +## 介绍 |
| 9 | +Spring Cloud Gray 是一套开源的微服务灰度路由解决方案,它由spring-cloud-gray-client,spring-cloud-gray-client-netflix 和 spring-cloud-tray-server,spring-cloud-gray-webui组成。<br/> |
| 10 | +spring-cloud-gray-client定义了一套灰度路由决策模型,灰度信息追踪模型,以及和spring-cloud-gray-server的基本通信功能。<br/> |
| 11 | +spring-cloud-gray-client-netflix在spring-cloud-gray-client的基础上集成了微服务注册中心eureka,扩展ribbon的负载均衡规则,提供了对zuul,feign,RestTemplate的灰度路由能力,并且无缝支持hystrix线程池隔离。<br/> |
| 12 | +spring-cloud-gray-server负责灰度决策、灰度追踪等信息的管理以及持久化。<br/> |
| 13 | +spring-cloud-gray-webui提供操作界面。 |
8 | 14 |
|
9 | 15 |
|
| 16 | +## pom引用 |
| 17 | +```xml |
| 18 | +<!-- 客户端 --> |
| 19 | +<dependency> |
| 20 | + <groupId>cn.springcloud.gray</groupId> |
| 21 | + <artifactId>spring-cloud-starter-gray-client</artifactId> |
| 22 | + <version>A.1.0.10</version> |
| 23 | +</dependency> |
10 | 24 |
|
11 | | -#### 不足 |
12 | | -没有界面化, 仅仅只有接口列表。 |
| 25 | +<!-- 管控端 --> |
| 26 | +<dependency> |
| 27 | + <groupId>cn.springcloud.gray</groupId> |
| 28 | + <artifactId>spring-cloud-starter-gray-server</artifactId> |
| 29 | + <version>A.1.0.10</version> |
| 30 | +</dependency> |
| 31 | +``` |
13 | 32 |
|
| 33 | +## demo |
| 34 | +[点击查看](./spring-cloud-gray-samples) |
14 | 35 |
|
15 | | -#### 扩展思考 |
16 | | -gray目前仅仅只支持spring cloud eureka, 但是在spring cloud中,eureka只是做为其中一个注册中心, 如果要做spring cloud的灰度管理, 就还需要兼容其他的注册中心, 比如zookeeper, consul, nacos等。 |
17 | 36 |
|
| 37 | +## 设计 |
| 38 | +在微服务架构中,接口的调用通常是服务消费方按照某种负载均衡策略去选择服务实例;但这无法满足线上更特殊化的一些路由逻辑,比如根据一次请求携带的请求头中的信息路由到某一个服务实例上。Spring Cloud Gray正是为此而创建。<br/> |
| 39 | +在Spring Cloud Gray中定义了几个角色灰度客户端(gray-client)、灰度管控端(gray-server)、注册中心。<br/> |
| 40 | + |
| 41 | + |
| 42 | +**注册中心** |
| 43 | +负责服务的注册和发现。 |
| 44 | + |
| 45 | +**灰度客户端** |
| 46 | +灰度的客户端是指依赖了spring-cloud-gray-client的服务,一般是指服务消费方。 |
| 47 | + |
| 48 | +**灰度管控端** |
| 49 | +负责灰度信息的管理、持久化等维护工作。 |
| 50 | + |
| 51 | +灰度客户端会从灰度管控端拉取一份灰度信息的清单,并在内存中维护这份清单信息,清单中包含服务,服务实例,灰度策略,灰度追踪字段等。 |
| 52 | +当请求达到网关时,网关就会在灰度追踪中将需要透传的信息记录下来,并将传递给转发的服务实例,后面的接口调用也会按照同样的逻辑将追踪信息透传下去,从而保证所有一个请求在微服务调用链中的灰度路由。<br/> |
| 53 | +如下图所示: |
| 54 | + |
| 55 | + |
| 56 | + |
| 57 | +## 灰度决策 |
| 58 | +灰度决策是灰度路由的关键,灰度决策由工厂类创建,工厂类的抽象接口是cn.springcloud.gray.decision.factory.GrayDecisionFactory。<br> |
| 59 | +目前已有的灰度决策有: |
| 60 | + |
| 61 | +名称 | 工厂类 | 描述 |
| 62 | +--- | --- | --- |
| 63 | +HttpHeader | HttpHeaderGrayDecisionFactory | 根据http请求头的字段进行判断 |
| 64 | +HttpMethod | HttpMethodGrayDecisionFactory | 根据http请求方法的字段进行判断 |
| 65 | +HttpParameter | HttpParameterGrayDecisionFactory | 根据http url参数进行判断 |
| 66 | +HttpTrackHeader | HttpTrackHeaderGrayDecisionFactory | 根据灰度追踪记录的http请求头的字段进行判断 |
| 67 | +HttpTrackParameter | HttpTrackParameterGrayDecisionFactory | 根据灰度追踪记录的http url参数进行判断 |
| 68 | +TraceIpGray | TraceIpGrayDecisionFactory | 根据灰度追踪记录的请求ip进行判断 |
| 69 | +TrackAttribute | TrackAttributeGrayDecisionFactory | 根据灰度追踪记录的属性值进行判断 |
| 70 | +FlowRateGray | FlowRateGrayDecisionFactory | 按百分比放量进行判断 |
| 71 | + |
| 72 | +## 灰度追踪 |
| 73 | +灰度追踪记录的逻辑是由cn.springcloud.gray.request.GrayInfoTracker的实现类实现。<br/> |
| 74 | +目前已有的灰度追踪有: |
| 75 | + |
| 76 | +名称 | 实现类 | 描述 |
| 77 | +--- | --- | --- |
| 78 | +HttpReceive | HttpReceiveGrayInfoTracker | 接收调用端传递过来的灰追踪信息 |
| 79 | +HttpHeader | HttpHeaderGrayInfoTracker | 获取http请求的header并记录到灰度追踪的Header中 |
| 80 | +HttpIP | HttpIPGrayInfoTracker | 获取http请求的ip并记录到灰度追踪中 |
| 81 | +HttpMethod | HttpMethodGrayInfoTracker | 获取http请求的请求方法并记录到灰度追踪中 |
| 82 | +HttpParameter | HttpParameterGrayInfoTracker | 获取http请求的url参数并记录到灰度追踪的parameter中 |
| 83 | +HttpURI | HttpURIGrayInfoTracker | 获取http请求的URI并记录到灰度追踪中 |
| 84 | + |
| 85 | +## 操作界面 |
| 86 | + |
| 87 | +### 灰度服务 |
| 88 | + |
| 89 | + |
| 90 | +### 灰度实例 |
| 91 | + |
| 92 | + |
| 93 | +### 灰度策略 |
| 94 | + |
| 95 | + |
| 96 | + |
| 97 | +### 灰度追踪 |
| 98 | + |
0 commit comments