一、背景介绍在分布式系统中会有这样的开发场景。不同的需求可能会涉及同一个服务的开发,所以在开发期间会有多个版本的服务并行。为了保持不同版本Isolation之间的一致性,acceptance需要将请求路由到指定版本号的服务进行处理;假设有A、B、C三个服务,B和C服务有多个版本,那么让请求按照既定的路由规则执行,可以保证研发期间的验收版本间隔离,可实现灰度部署策略;2.负载策略在微服务系统架构中,服务之间转发请求时会执行负载策略,尤其是当服务存在于多版本号的集群模式下,轮询、加权、随机化不能满足要求;自定义路由规则的设计和开发是一种常见的方式;经典应用场景:发起请求时,可以通过Header、Cookie、Parameter等不同方法携带路由规则和参数执行匹配逻辑,从而将请求路由到指定版本的服务;默认主分支路由通常请求在主分支上执行,或者其他分支路由规则不匹配也可以通过标识配置来判断主分支是否负责底线,甚至是任何存活的服务;存活的服务可能有多个版本,但主分支Master是否存活是服务健康的基本标志。如果中间的路由规则不匹配,就会被Master服务覆盖;versionnumberunifiedroutingrequest携带branchnumber进行统一版本路由是一种常见的轻量级方案,即如果请求携带2.0.0的branch,则优先匹配相关版本的servicerouting,不匹配masterservice可以处理;服务自定义路由在请求或配置中指定每个服务的路由分支号,也是常见的匹配方案,如上图请求时指定服务B由1.0.0分支执行,服务C执行由3.0.0分支执行,其余服务在主分支上执行;路由规则可以看作是可用服务的匹配过滤器,如果过滤器将出站服务部署在集群中,则需要执行相应的负载均衡策略。例如上图中服务C的3.0.0分支为集群时,路由匹配到该版本后,会通过负载均衡策略选择其中一个服务处理请求;3.灰度部署当能够按照定制开发的规则实施负载均衡策略时,服务的灰度发布就会容易很多,可以在不影响已有服务的情况下发布新的服务。同时,根据规则分发请求。新服务验收完成后,即可更换旧版本;分布式系统中有很多子服务,版本开发通常只涉及其中的一部分。该模式在线部署相关服务,不影响主线服务,只有在启用特定配置时才会将请求分发到灰度服务;流程细节1、做好路由配置和管理,请求默认在主服务中执行;2.部署版本涉及的相关服务默认不会在灰度级处理Request;3、根据接受阶段的配置,将指定规则的请求路由到灰度层;4、常用规则:携带分行号、灰度用户群、比例拆分、IP等;5、完成灰度服务验收后,将相关服务标记为主要服务;6、老主服务下线后,上线过程完全完成;7、如果发现灰度服务无法接受,可以移除灰度图层或者修改;灰度发布模式取决于自定义路由规则和负载均衡时服务权重比例的倾斜。这些都可以在配置中心管理,测试时动态修改;在这种模式下,灰度服务的在线或离线几乎没有明显的感知。如果是比较简单的流程,测试人员可以接受灰层服务。如果是复杂流程,放开一定比例的用户流量,在流程观察没有问题后完成升级;四、实践方案1、流程设计在灰度方案的实现过程中,通常客户端会携带路由规则的标识,从而将请求发送到指定的服务。当规则无法正常匹配时,由主服务处理。对于某些核心交换机ID统一维护在配置中心;2、RoutingID的获取通常在请求头中携带RoutingID,这样更便于统一管理。常用的传输格式如下:版本号统一路由:routeId:2.0。0,即所有请求优先在2.0.0分支上执行;服务自定义路由:serverC:3.0.0,请求服务C时优先在3.0.0分支执行;在微服务组件中获取请求头的方式有很多种。例如Gateway网关中的路由过滤器或者服务中的拦截器,可以获取请求的相关参数信息来执行路由规则;标识管理自定义路由规则需要客户端标识,虽然获取请求中的标识并不复杂,但是将标识传递给路由规则涉及上下文参数管理:写阶段:在过滤或拦截中获取路由标识,并写入进入上下文容器;读取阶段:路由时从容器中读取Identification,根据配置信息执行规则;请求从进入网关开始,服务之间的通信会涉及到负载均衡策略。在过滤器或拦截器中,将标识写入上下文容器,路由规则的执行需要读取上下文容器。如果标识不存在,则默认选择主服务执行请求;3、微服务之间通信选择服务时,选择服务执行请求的逻辑比较复杂,尤其是在灰度模式下,涉及到路由规则的转换,即策略指定的服务优先选择;1、在注册中心查询对应服务可用列表;2.基于路由规则,匹配请求标识符匹配的服务;3、对过滤后的结果列表进行负载均衡,选择服务;在整个路由机制中,都会涉及匹配规则的自定义修改。从常规手段,将版本的分支号加载到服务的元数据信息中,结合服务名称或IP地址,实现服务列表的多维过滤,可以支持实现最轻量级的灰度策略。5.参考源码应用仓库:https://gitee.com/cicadasmile/butte-flyer-parent组件打包:https://gitee.com/cicadasmile/butte-frame-parent
