0.参考

1.思路

改造gataway的### Weight Route Predicate Factory,在指定权重的同时指定每个对应权重的服务的版本号。主要需要改写的地方是要在分流之后,将版本号传给ribbon,ribbon在做负载均衡选择的时候,根据传入的版本号,与服务的eureka.matedata中的version匹配,从而达到灰度发布的目的。

gateway的配置类似如下,VersionWeight为重写的断言工厂。- id: temp_old

uri: lb://TEMPLATE

predicates:

- Path=/temp/**

- VersionWeight=group1, 10, v1

filters:

- StripPrefix=1

- id: temp_new

uri: lb://TEMPLATE

predicates:

- Path=/temp/**

- VersionWeight=group1, 1, v2

filters:

- StripPrefix=1

2.调查改造点

debug后知道了整个请求顺序客户端-> gateway filter -> LoadBalancerClientFilter -> (如果使用ribbon) RibbonLoadBalancerClient-> (某个Rule) XXXAvoidanceRule -> (对应的 Predicate) XXXAvoidancePredicate

所以选择的服务的关键就是Ribbon的rule和Predicate

步骤写一个grayContext, 基于threadlocal处理version的上下文传递。

自定义负载策略:负载策略的关键是Rule 和 Predicate, Rule 继承 PredicateBasedRule, Predicate 继承 AbstractServerPredicate, 实现Predicate 中的 apply方法 此方法是负载策略核心(逻辑:从grayContext获取version,与服务的eureka.matedata中的version匹配。匹配上则为目标服务)

改写权重断言策略:改写WeightRoutePredicateFactory,在Factory 分流完成后,把路由中配置的 version 放入到grayContext 中。并且要将vesion 放入到 request的head中,用来向下传递。

上面是对gateway的改造,经过改造后,gateway分发的时候就根据version能指定请求的服务器,接下来是微服务间通过fegin或者restTemplate调用时的改造,目的是将version继续往下传递

对request请求拦截:在微服务中对request请求进行拦截,将request中的version放到grayContext中

对fegin添加拦截器:实现RequestInterceptor,从grayContext中取出version放在头部中。fegin的loadbanced也是基于ribbon的,所以使用自定义负载策略进行分发,策略和gateway一致。

如果使用restTemplate,添加拦截器:实现ClientHttpRequestInterceptor,从grayContext中取出version放在头部中。

这样就将version串联起来,从而实现了指定流量到对应的服务。

注意点

如果断路器使用Hystrix,要注意Hystrix用信号量隔离,没问题,如果使用线程池隔离,我们基于threadlocal处理version就无效了,

hystrix有提供对应的方法 使用 HystrixRequestVariableDefault

参考文章1这篇文章中提到的使用方式,能理解HystrixRequestVariableDefault是个怎样的用法,其作用和threadlocal类似。

3.待解决问题不使用ribbon的情况,引入spring-cloud-loadbalancer, loadbalancer 和 ribbon差蛮多,不支持自动刷新serverlist,只有一个RoundRobinLoadBalancer。 会使用ReactiveLoadBalancerClientFilter,要通过实现ReactorServiceInstanceLoadBalancer 接口 来实现负载策略

感觉没太大差,但是要自己实现自动刷新serverlist。可以参考ribbon的做法来做。推荐是使用spring-cloud-loadbalancer,因为ribbon是阻塞的。

官网推荐使用CircuitBreaker, 因为Hystrix 不维护了。CircuitBreaker 只有信号量隔离,可以直接使用threadlocal。

ribbon设置权重_spring cloud gateway+ribbon 组合指定版本权重分流(简易灰度发布实现)...相关推荐

  1. csrf token invalid什么意思_Spring Cloud Gateway 实现Token校验

    在我看来,在某些场景下,网关就像是一个公共方法,把项目中的都要用到的一些功能提出来,抽象成一个服务.比如,我们可以在业务网关上做日志收集.Token校验等等,当然这么理解很狭隘,因为网关的能力远不止如 ...

  2. spring gateway 限流持久化_Spring Cloud Gateway网关如何快速实施限流方案?-Part 6

    熔断降级 在分布式系统中,网关作为流量的入口,大量请求进入网关,向后端远程系统或服务发起调用,后端服务不可避免的会产生调用失败(超时或者异常),失败时不能让请求堆积在网关上,需要快速失败并返回回去,这 ...

  3. spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流

    之前分享过 一篇 <Spring Cloud Gateway 原生的接口限流该怎么玩>, 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现 原生Request ...

  4. angularjs 让当前路由重新加载_Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单...

    一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍 Spring Clo ...

  5. gateway中的局部过滤器_Spring Cloud Gateway中的过滤器工厂:重试过滤器

    Spring Cloud Gateway基于Spring Boot 2,是Spring Cloud的全新项目,该项目提供了一个构建在Spring 生态之上的API网关.本文基于的Spring Clou ...

  6. gateway请求拦截_spring cloud gateway 拦截request Body

    在接入Spring-Cloud-Gateway时,可能有需求进行缓存Json-Body数据或者Form-Urlencoded数据的情况. 由于Spring-Cloud-Gateway是以WebFlux ...

  7. gatewayfilter详解_Spring Cloud Gateway 之 Filter

    简介 网关经常需要对路由请求进行过滤,进行一些操作,如鉴权之后构造头部之类的,过滤的种类很多,如增加请求头.增加请求 参数 .增加响应头和断路器等等功能,这就用到了Spring Cloud Gatew ...

  8. Spring Cloud Gateway——2020.x以上版本HTTP 503 或 NoLoadBalancer[负载均衡]解决方案

    问题描述 config spring:cloud:gateway:routes:- id: myRouteuri: lb://servicepredicates:- Path=/service/** ...

  9. Gateway杂谈:线上引流和灰度发布

    2019独角兽企业重金招聘Python工程师标准>>> 前言 Gateway目前支持路由,使用路由可以用来实现很多高级功能,比如线上引流和灰度发布. 线上引流 很多时候,开发的小伙伴 ...

最新文章

  1. pandas编写自定义函数、使用apply函数应用自定义函数基于Series数据生成新的dataframe
  2. 186. [USACO Oct08] 牧场旅行
  3. 动态网络表征学习在推荐领域的创新与实践
  4. mxnet创建新的操作(层)
  5. Android数据库框架-----ORMLite 的基本用法
  6. python海龟交易策略_【手把手教你】用Python量化海龟交易法则
  7. 【CSAPP笔记】11. 存储器层次结构
  8. 基于对比学习(Contrastive Learning)的文本表示模型为什么能学到语义相似度?
  9. VC++学习方法及书籍推荐(转)
  10. jeecg导出Excel
  11. 每天一道剑指offer-连续子数组的最大和
  12. 如何获得微信小游戏跳一跳源码以及源代码组合包括哪些
  13. ZEMAX | 如何进行序列模式公差分
  14. 设计项目全生命周期管理系统构建与实践
  15. 打开项目时,出现“确保已安装项目类型(.wdproj)的应用程序 ”的解决办法
  16. 外贸客户电话和邮件地址的收集
  17. Layui.open 弹出上传图片、视频预览
  18. 清华大学刘知远:知识指导的自然语言处理
  19. 又发现一个ChatGPT体验站,辅助写代码真方便
  20. 【jupyter报错】‘nb_conda_kernels.CondaKernelSpecManager‘ could not be imported

热门文章

  1. @程序员,一文掌握 Web 应用中的图片优化技巧!
  2. 挚同道合,物所不能!挚物·AIoT产业领袖峰会报名进入倒计时!
  3. 是时候“抛弃”谷歌 BERT 模型了!新型预训练语言模型问世
  4. 面对 10 亿数据量的挑战,如何对系统进行性能优化?
  5. 别怀疑,孩子在家里也能学编程!
  6. 如何避免腾讯云彻底搞丢“天价数据”事件再次发生?
  7. 新旧 iPhone 比速度,iOS 12 公开测试版发布!
  8. 智能手机下半场迎来淘汰赛:有的拼供应链,有的打起了 AI 的主意
  9. iOS 11.2 版本紧急修复黑屏 Bug,却遇 FaceID 识别错误,真实原因在此
  10. mysql 事务 注意 优化_MySQL入门详解(二)---mysql事务、锁、以及优化