首页 文章详情

学懂微服务网关系统-SpringCloudZuul之后,你又说我掌握的太浅了

愿天堂没有BUG | 121 2022-02-16 02:27 0 0 0
UniSMS (合一短信)

上文给大家介绍的内容是网关的主要功能和技术选型,本文将给大家介绍SpringCloudZuul网关!

Spring Cloud Zuul网关

Spring Cloud Zuul是Spring Cloud在Netflix开源的Zuul网关的基础上,经过整合与增强实现的生产级别的微服务网关系统。

Netflix架构总监Adrian Cockcroft曾表示:在Netflix的开源项目中,Zuul网关是一个容易被忽略但是最强大的基础服务之一。Zuul网关主要用于支持智能路由、安全认证、区域和内容感知,将多个底层服务聚合成统一对外暴露的API。Zuul网关的一大亮点是动态可编程,配置可以秒级生效。Netflix对Zuul的官方介绍:Zuul是从设备和网站到后端应用程序所有请求的门面(Facade),它为内部服务提供可配置的对外URL到服务的映射,及基于JVM的后端路由器。它具备以下功能。

● 动态路由:Zuul可以无缝对接Eureka服务发现中心,通过配置路由匹配规则,将符合匹配条件的请求转发到对应的后端服务上。

● 负载分配:为每一种负载类型分配对应的容量,并弃用超出限定值的请求。默认情况下,Zuul的负载均衡使用的是Ribbon的ZoneAwareLoadBalancer。该类的算法就是对服务发现中可用实例的轮询,成功追踪到响应的可用区域。

● 压力测试:逐渐增加指向集群的负载流量,从而计算性能水平。

● 静态响应处理:在边缘位置直接建立部分响应,从而避免其流入内部集群。

● 多区域弹性:跨越AWS(亚马逊云服务)区域进行请求路由,旨在实现负载均衡使用多样化并保证边缘位置与使用者尽可能接近。

● 验证与安全保障:识别面向各类资源的验证要求并拒绝那些与要求不符的请求。

● 审查与监控:在边缘位置追踪数据及统计结果,从而为我们提供准确的生产状态。

Zuul1的功能相对比较简单,它本质上是基于Spring MVC框架开发的一个Web Servlet应用。Zuul1的核心模块是一系列Filter过滤器,使用阻塞式的I/O,通过线程池技术实现请求的并发处理。每个请求都对应独立的线程,处理后端的业务逻辑。如下图所示是Zuul1的主要编程模型。


Zuul1的线程模型决定了Zuul1在高并发场景下存在性能瓶颈,所以Netflix为了解决网关的I/O瓶颈,开发了基于NIO(非阻塞I/O)模式的Zuul2。下图是Zuul2基于Reactor模式的架构实现。


Zuul2的设计相对复杂,采用了Netty框架实现异步非阻塞的编程模型,Zuul2虽然在性能上比Zuul1有明显的优势,然而Zuul2的问题是在编程模型和代码调试、排查问题上复杂性比较高。另外Zuul2的线程异步特性也给以本地线程方式进行请求跟踪和监控工作带来了麻烦。

在生态上,Spring Cloud Finchley继续沿用了Zuul1,没有采用Zuul2,一方面是因为Zuul2的改动比较大,从生态稳定性和兼容性上来讲,Zuul1有明显的优势,另一方面是因为Spring Cloud已经基于Spring Boot 2.0和Reactor实现了Spring Cloud Gateway异步网关。

Zuul1目前与Eureka、Ribbon、Hystrix都实现了无缝的对接融合,具备更多额外能力,Zuul1已经部署在很多在生产环境中,经过大规模验证,同时Zuul1可以使用Servlet 3.0规范支持的AsyncServlet进行优化,可以实现前端异步,支持更多的连接数,达到和Zuul2一样的效果,但是不用引入太多异步复杂性。

Spring Cloud Zuul1的接入与配置

1.添加Maven依赖


2.配置文件


3.定义Zuul网关启动类


Zuul的路由配置方式

默认情况下,在application.yml中配置Zuul的路由,主要有三种主要的路由配置方式。

● 单实例serviceId映射

配置文件如下:


上面的路由配置是一个从/users/**到user-service服务的映射规则,我们可以把它简化为一个较简单的配置,映射规则与serviceId都不 用 写 , 可 以 通 过 http://localhost :8080/userservice/user/test?id=1来调用。Zuul会给user-service添加一个默认的映射规则/user-service/**,相当于:


● 单实例URL映射

除了路由到服务,Zuul还能路由到物理地址,将serviceId替换成URL即可:


● 多实例路由

默认情况下,Zuul会使用Eureka中集成的基本负载均衡功能,如果想使用Ribbon的负载均衡功能,就需要指定一个serviceId,此操作需要禁止Ribbon使用Eureka,在E版之后新增了负载均衡的配置。



● forward本地跳转

Zuul支持在网关内部跳转,即本地跳转,在网关中写好一个接口,例如:


配置以下信息即可实现本地跳转:


本文给大家讲解的内容是微服务网关:Spring Cloud Zuul网关

  1. 下篇文章给大家讲解的内容是微服务网关:Zuul的主要工作原理

  2. 觉得文章不错的朋友可以转发此文关注小编;

  3. 感谢大家的支持!

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter