上文给大家介绍的内容是微服务网关:Zuul的动态路由,那么本节内容给大家介绍的是微服务网关:Zuul Filter扩展功能实现。

Zuul Filter扩展功能实现

在Zuul的工作原理中,我们已经看到Zuul主要采用基于Filter链的工作调用模式,通过自定义Filter机制可以动态扩展网关服务功能。网关的一个重要作用就是提供公共服务组件,而这些组件的功能也大都与Filter的拦截机制有关。下面我们以网关中经常会使用的灰度发布、服务限流为例,来说明如何通过Filter机制结合Ribbon和其他模块来实现。

实现灰度发布

目前常见的发布策略有蓝绿发布和灰度发布(金丝雀发布)。服务发布策略本质上是一种流量切换和流量导流策略。

● 蓝绿发布:在发布的过程中用户对服务的重启无感知,通常情况下通过新旧版本并存的方式实现,也就是说在发布的流程中,新的版本和旧的版本是相互热备的,通过切换路由权重的方式(非0即100)实现不同应用的上线或者下线。

● 灰度发布:在线上运行的服务中加入少量的新版本服务,然后从这少量的新版本服务中快速获得反馈,根据反馈决定服务最后的交付形态。

灰度发布要做的就是修改Ribbon的负载策略,基本的思路是,根据Eureka的Metadata配置设置自定义元数据(服务版本信息)与网关中设置的路由负载策略(Ribbon的Rule规则)进行匹配,选择符合路由条件的后端服务进行导流操作。

具体而言,因为Zuul使用的是基于同步线程的请求处理模式,所以我们可以通过ThreadLocal变量记录当前HTTP请求的特征数据,将特征数据与Ribbon中维护的后端服务实例的元数据进行模式匹配,再根据当前路由设置的负载策略就可以将HTTP请求映射到对应的后端服务实例。下面是主要的实现过程。

在实现灰度发布策略前,需要保证后端服务实例注册在Eureka中,并设定元数据的服务实例的版本信息。

Zuul主要依靠Filter实现HTTP拦截,执行灰度发布过滤功能,其中 ribbonHolder 存 储 的 是 后 端 路 由 ID 对 应 的 路 由 策 略 信 息 。

ribbonHolder在初始化时加载Admin配置的路由策略,篇幅所限,此处省略加载过程。routeribbonholder通过设置的路由策略可以动态执行蓝绿发布策略或者灰度发布策略,代码实现如下:

说 明 # : 灰 度 发 布 Filter 中 的 核 心 方 法 就 是 给RibbonFilterContextHolder设置当前线程上下文的后端服务版本信息。RibbonFilterContextHolder主要利用ThreadLocal变量来解决如何将灰度发布的信息传递给本地线程变量,然后当HTTP请求经过灰度发布Filter时,它可以通过Ribbon的元数据路由规则匹配对应的服务ID。下面是RibbonFilterContextHolder的实现代码:

根据Ribbon的路由规则设置,Zuul基于Spring Boot的自动化配置机制,加载spring.factories实现自定义的路由规则配置加载,主要步骤如下。

● 第一步,在
/META-INF/spring.factories下加载自动配置:

● 第二步,实现自动配置类:

然后将元数据与后端服务(Original Server)建立映射匹配规则:

● 第三步,根据元数据匹配后端服务(Original Server)规则:

● 第四步,基于元数据匹配的断言:

说明#:上述代码是元数据匹配的断言逻辑,可以看到它从Filter中设置的线程上下文中获得对应的后端服务版本信息,然后与HTTP请求中后端服务版本信息进行比对,当HTTP请求经过这个Filter时就会根据apply中设计的断言逻辑来选择符合条件的后端server,实现灰度发布功能。

实现服务限流

服务限流是微服务网关对API流量进行保护的一种常用手段,可以防止网络攻击,限制客户端的请求速度,在一定程度上可以保证后端服务不因为流量过载而宕机。后面的容错和隔离相关章节也会进一步说明限流的策略有哪些,下面说明如何通过Zuul+Guava RateLimiter实现服务限流功能。RateLimiter是Google开源的实现了令牌桶算法的限流工具。

首先引入
spring-cloud-zuul-ratelimit组件的Maven依赖:

然后自定义实现Filter类:

RateLimiter基于Guava提供的令牌桶算法的实现类,可以依据系统的实际情况来调整生成token的速度。RateLimiter.create(1000)可以理解为:每秒往桶里放入1000个令牌。RATE_LIMITER.tryAcquire方法尝试获取令牌桶里的令牌,如果有令牌表示目前流量未达上限,则返回true,同时总的令牌数减1。如果没有令牌,说明令牌桶已达到阈值,则返回false,并设置HTTP状态码返回的信息。

本文给大家讲解的内容是微服务网关:Zuul Filter扩展功能实现

  1. 下篇文章给大家讲解的内容是微服务网关:Zuul源码解析
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

程序员都应该掌握的微服务网关:ZuulFilter的扩展功能实现相关推荐

  1. 身为程序员,就应该了解微服务的未来发展趋势:云原生应用架构

    微服务发展趋势 随着Docker技术的普及和Kubernetes在互联网公司的大量部署与使用,微服务架构正在围绕应用如何易于开发交付.减少资源消耗.无侵入治理等方面进行变革和演进. 本篇我们将讲解云原 ...

  2. 微服务网关和服务注册中心

    在前面谈微服务架构的时候,已经有多篇文章都谈到过微服务网关,由于微服务网关本身也是提供代理,路由,安全,日志,负载均衡,流量控制等能力,因此我谈的最多的就是可以将微服务网关理解为轻量的ESB服务总线, ...

  3. webservice入参是一个对象_程序员技术精进:面向对象与服务的分析与设计

    面向对象分析与设计 面向对象分析与设计是指根据面向对象方法学对软件系统进行分析与设计.在面向对象分析与设计的定义中有三个关键词:面向对象.分析.设计.所以,为了更好地理解面向对象分析与设计的作用,我们 ...

  4. 程序员都在读的实战书,你看懂封面了吗?

    相比于理论知识,实战类的图书更受程序员们的喜爱.所以,几乎每个程序员的书架上都有一两本名为"XX实战"的技术图书,就算你没没有,那一定看到过Manning出版的"in A ...

  5. 技术与市场脱钩?90%的程序员都错了!

    面对日新月异的技术潮流,怎样才能避免沦为与市场脱钩.甚至被无情清退的大龄码农?很多程序员都走了弯路! 安于现状,对于学习新技术这件事有些抵触: 一再拖延,身边的同事新框架玩的飞起,自己却懒于行动: 盲 ...

  6. 技术不够硬?90%的程序员都错了!

    面对日新月异的技术潮流,怎样才能避免沦为与市场脱钩.甚至被无情清退的大龄码农?很多程序员都走了弯路! 安于现状,对于学习新技术这件事有些抵触: 一再拖延,身边的同事新框架玩的飞起,自己却懒于行动: 盲 ...

  7. 能够拿到100万年薪的程序员都具备哪些能力?

    几周前,微盟爆了个大雷,数据库让内部员工删库跑路-- 很明显,微盟的技术体系是有严重问题的, 主要体现在:运维权限管理.数据库备份.上云而不上云方案,这三点.看起来有点耸人听闻,其实你永远不知道一个人 ...

  8. Java程序员都30岁了,还剩下5年“寿命”,这就是所谓的中年危机?

    Java程序员都30岁了,还剩下5年"寿命",这就是所谓的中年危机? 30岁时,我是一个程序员,离传说中的"退休"只有5年了,为了优雅从容的所谓"光荣 ...

  9. 那些40岁左右的程序员都去哪了?

    公众号更名后第一篇文章,没有美女配图. 这些天和几位30岁左右的朋友聊天,都说自己内心很焦虑.我就纳闷了,不是35岁才焦虑么?怎么提前了?细聊以后总结出来大体的原因是: 1.一线城市买了房子后还贷压力 ...

最新文章

  1. 快速构建Windows 8风格应用27-漫游应用数据
  2. 【重读iOS】网络请求2:应用
  3. 实用插件_这些实用的PR插件你知道吗?
  4. C#进行Visio二次开发之Shape的Data1、Data2、Data3的用处
  5. 安装Nginx1.14.2过程及配置
  6. 第五次会议记录:开始进一步需求分析,及初步分工
  7. 【童心制物】一篇很硬的标新立异级别的体验测评——聊新版造物编程盒
  8. 【caffe】OpenCV Load caffe model
  9. php留言板实战,PHP留言本,非常适合新手实战操作!
  10. saltstack的状态文件
  11. leetcode205. 同构字符串 一般人一次做不对的简单题
  12. 世界手机号码格式_脑炎康复之旅——世界脑炎日病友征文
  13. Java Object类详解
  14. CentOS FTP服务(vsftpd)配置
  15. 最近想学习一下编译原理,做一个编程规范的检测工具
  16. 20210601:力扣第243周周赛(上)
  17. jqueryAjax的使用
  18. C语言交换两个变量数值的几种方法
  19. 采购者具体负责的问题
  20. 1050Ti 安装CUDA、cuDNN

热门文章

  1. mysql基础(表管理语句)
  2. kitti数据集的学习(一)发布照片
  3. 更改npm的全局安装路径npm config set prefix
  4. 又一随机视频聊天网站内侧了,地址为:http://www.17ouyu.com/
  5. Cocos游戏引擎VRDemo正式放出 助力虚拟现实游戏开发
  6. 国内NFT平台及玩法一览
  7. L1、L2范数如何解决过拟合问题
  8. 如何去官网下载JDK (JDK8 JDK1.8)
  9. 前端Vue 项目性能优化
  10. Android定位实现