Spring Cloud Gray 微服务灰度中间件

Spring Cloud Gray是一套开源的微服务灰度路由解决方案,它由spring-cloud-gray-clientspring-cloud-gray-client-netflixspring-cloud-tray-serverspring-cloud-gray-webui组成。

Github:https://github.com/SpringCloud/spring-cloud-gray

  • spring-cloud-gray-client定义了一套灰度路由决策模型,灰度信息追踪模型,以及和spring-cloud-gray-server的基本通信功能。
  • spring-cloud-gray-client-netflixspring-cloud-gray-client的基础上集成了微服务注册中心eureka,扩展ribbon的负载均衡规则,提供了对zuulfeignRestTemplate的灰度路由能力,并且无缝支持hystrix线程池隔离。
  • spring-cloud-gray-server负责灰度决策、灰度追踪等信息的管理以及持久化。
  • spring-cloud-gray-webui提供操作界面。

灰度发布模型

SpringCloudGray 能做什么

金丝雀测试

先发布1台实例,用于测试验证,指定测试的流量进入这台实例,其它流量依然进入其它正常的实例。优势在于发布成本小,快速测试,并且不影响正常用户体验影响,即使测试不通过,也只需回滚这一台实例,用户无感知。

金丝雀测试

灰度放量

通过金丝雀测试后,可以逐渐放量到新的版本上。例如,根据userId或者ip5%的流量到其中一台灰度实例上,观察一段时间没异常,可调整放入20%的流量,如果一台实例扛不住,可再发一台或多台实例。将发布产生的风险保持在可控范围内。

灰度放量

切断实例流量

当线上出现问题,可将某台实例的流量切断,保留现场,设置指定的请求进入实例,在线调试并且不影响其它用户。

切断实例流量

数据透传

借助灰度追踪的能力,在网关处记录用户请求的最初的数据,可以将之透传到请求完整的调用链中。

借助“破窗”能力,实例蓝绿发布

首次上灰度时,会存在两种环境,一种是已经依赖了灰度客户端的环境,另一种是正常运行的当前环境。假如微服务的负载均衡是由ribbon实现,那么当前环境会请求路由到实例状态为UP的实例上,而依赖了灰度客户端的环境,则可以通过”破窗”能力,跟灰度路由结合,可以将匹配灰度策略的请求路由到实例状态为STARTING的实例上,不匹配灰度策略的请求路由到实例状态为UP的实例上。

破窗与灰度路由

设计思想

在微服务架构中,接口的调用通常是服务消费方按照某种负载均衡策略去选择服务实例;但这无法满足线上更特殊化的一些路由逻辑,比如根据一次请求携带的请求头中的信息路由到某一个服务实例上。Spring Cloud Gray正是为此而创建。

Spring Cloud Gray中定义了几个角色灰度客户端(gray-client)、灰度管控端(gray-server)、注册中心。

Spring Cloud Gray 角色及职责

  • 注册中心 负责服务的注册和发现
  • 灰度客户端 灰度的客户端是指依赖了spring-cloud-gray-client的服务,一般是指服务消费方
  • 灰度管控端 负责灰度信息的管理、持久化等维护工作

灰度客户端会从灰度管控端拉取一份灰度信息的清单,并在内存中维护这份清单信息,清单中包含服务,服务实例,灰度策略,灰度追踪字段等。当请求达到网关时,网关就会在灰度追踪中将需要透传的信息记录下来,并将传递给转发的服务实例,后面的接口调用也会按照同样的逻辑将追踪信息透传下去,从而保证所有一个请求在微服务调用链中的灰度路由。

如下图所示:

Spring Cloud Gray 灰度路由

管控端后台功能

用户管理

可添加用户,禁用用户,重置密码等。

Spring Cloud Gray 用户管理

服务列表

Spring Cloud Gray 服务列表

权限控制

灰度的权限控制是以服务为对象的,拥有服务的权限,就可以操作服务的所有灰度信息。在服务的权限控制中,分为两种角色,owner和管理者,owner拥有最大的权限,管理者除了不能删除owner的权限,其它权限同owner一样。

Spring Cloud Gray admin权限

Spring Cloud Gray owner权限

灰度实例管理

查看、编辑服务的灰度实例,修改实例状态等。

Spring Cloud Gray 灰度实例管理

在线实例列表

查看指定服务在注册中心注册的实例,点击【Add】按钮,可快速添加为实例实例

Spring Cloud Gray 在线实例列表

编辑灰度策略

从实例列表点击【策略】按钮进入灰度策略列表,可在策略列表中添加灰度策略和灰度决策。
实例的灰度策略,包含可多个灰度决策。
策略是从灰度实例列表进入。一个实例可以有多个灰度策略,策略与策略之间是”或”的关系。就是说,一个请求只要满足实例的任意一个灰度策略,这个请求被路由到该实例上。
决策是灰度中进行比对的最小项。它定义一种规则,对请求进行比对,返回true/false。当请求调用时,灰度调用端可以根据灰度实例的灰度决策,进行对比,以判断灰度实例是否可以受理该请求。多个决策是”与”的关系。

Spring Cloud Gray 灰度策略

Spring Cloud Gray 灰度决策列表

编辑灰度追踪

动态编辑追踪信息字段,使其透传到请求的完整调用链路中,从服务列表点击【追踪】按钮进入

Spring Cloud Gray 编辑灰度追踪

改变实例状态

可在实例列表中,通过【实例状态】按钮修改实例状态。提前是实例得依赖了灰度客户端的jar包,并且uri没有设置前缀(server.servlet.context-path)

Spring Cloud Gray 改变实例状态

操作审记

所有的POST,PUT,DELETE操作都会被记录下来,可能通过操作记录查询,用于事后审计。

Spring Cloud Gray 操作审记

查询维度包括:

  • StartTime - EndTime 记录时间
  • Operator Id 操作人Id
  • ApiRes Code 接口返回的ApiRes Code
  • Operate State 操作的结果
  • Request Hander spring mvc 的接口(Controller/Handler)的类名和方法
  • URI 接口的uri
  • IP http请求(操作人)的ip

项目扩展

项目已经实现了灰度的内核,如果要与其它的注册中心或者负载均衡中间件集成,只需实现相应的plugin即可,Spring Cloud Gray已经提供了EurekaRibbonFeignZuul以及Spring Cloud GatewaySpring Cloud Streamplugin,添加相应的plugin依赖即可。

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2021 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :