微服务网关之Zuul下

article/2025/9/22 6:27:11

上一篇博客介绍了Zuul网关如何与Hystrix、Apollo、CAT等集成,此篇博客将介绍如何在spring-cloud上使用zuul作为网关,以及zuul网关部署的一些建议。

在Spring cloud中引入zuul网关非常简单,首先在pom.xml文件中引入依赖的jar包(Demo地址)。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId></dependency>

接着自定义四种类型的Filter,在spring cloud中Filter不再是groovy的脚本文件,而是java class。但写法上和groovy中无区别。如下图所示,所有的Filter都继承自ZuulFilter。在run()中编写具体的Filter逻辑。

接着在启动类中增加@EnableZuulProxy,并注入编写的Filter class,即在服务启动时就加载好这些Filter的class。

在application.properties中定义路由规则,如下所示,当访问zuul的服务地址时,实际路由会跳转到localhost:9700服务上。

按照Demo上的提示,启动student服务,student服务监听在9700端口上,此时访问8080端口,即zuul网关所在的服务端口,路由会自动跳转到student的9700端口上。结果如下所示

 查看zuul网关服务,打印了相关的信息,这些信息是封装到pre/post/route Filter中,说明各种类型的Filter都生效。

上面是简单的zuul网关路由定义,实际中可以根据api中的url信息,将请求路由到不同的服务上。下面是Zuul路由的一些常见配置。

zuul: routes: user-route:         # 该配置方式中,user-route 只是给路由一个名称,可以任意起名。service-id: provider-microservice-userpath: /user/**      # service-id 对应的路径zuul:routes:user-route:     # 该配置方式中,user-route 只是给路由一个名称,可以任意起名。url: http://localhost:8000/     # 指定的urlpath: /user/**     # url对应的路径   zuul: prefix: /apistrip-prefix: falseroutes: microservice-provider-user: /user/**       
访问Zuul的/api/xx/1路径,请求会被转发到micro-service-provider-user的/api/1
如果strip-profix:true,那么请求会被转发到micro-service-provider-user的/1  zuul: ignored-services: microservice-provider-user, microservice-consumer-movie#忽略上面的两个服务,只代理其他服务

可以看到,在spring cloud中使用zuul网关非常简单,那么为什么还要学习Netflix原生提供的Zuul呢?第一:学习原生提供的Zuul网关更能透彻理解Zuul工作原理,第二:spring cloud封装后,确实对开发人员非常友好,但是自定义的空间就变小了,第三:spring cloud上不支持Filter的动态加载机制,故项目中还需结合实际来选择使用spring cloud还是原生的zuul。

上面介绍了Spring cloud中如何引入zuul,接着介绍在实际项目中zuul的部署。Zuul作为网关是非常关键的服务,实际项目中也会采用多实例集群部署方式,故在zuul网关前面还需加一层负载均衡机制,常用的是f5加nginx的方式来完成zuul多实例的负载均衡等功能。具体如下图所示 :可以根据业务类型部署不同的网关集群,不同的网关集群管理内部的微服务。另外构建过滤器管理站点,管理各种Filter文件,Zuul原生提供的Filter管理页面非常简陋,实际项目中还需开发自定义的管理平台。IT人员可通过管理平台随时发布过滤器。

因为所有请求都会先经过网关,再转发到内部的微服务上,故可以在网关上集成各种能力,例如:授权认证,服务配置管理,服务注册发现,限流降级,链路监控,日志管理,监控告警等。 这样可完成80%左右的服务治理工作。具体如下图所示,项目中可结合实际选择适配的网关工具和各类服务治理工具。

在网关中路由管理是非常重要的一部分,上面的Demo是个简单的例子,路由直接配置在applicaiton.properties文件上,实际项目中当服务很多时需要统一管理路由信息,另外,在管理路由信息时,不能直接配置内部服务的IP地址,因为服务重启后IP地址可能就改变了,需要配置成服务名称才行,那么在管理路由信息方面有哪些方式呢?

方式一:基于服务注册发现的方式来管理路由信息

所有的服务都会自注册到Eureka上,Zuul网关获取服务信息,Zuul的路由配置信息上直接配置服务名称,而非IP地址。另外,Zuul本身的路由配置信息可以由统一的配置管理工具来管理,例如可以引入Apollo来管理路由配置信息。

方式二:基于域名解析的方式来管理路由信息

服务名称与服务域名间映射管理进行统一的管理,Zuul网关上配置路由信息时,只配置服务名称,定期从管理平台拉取映射关系信息,当读取到服务名称后,先查找映射关系表,转换成服务的域名,再发送到DNS服务器进行解析,转换成服务的IP地址,然后将信息发送到对应的服务器上。具体关系如下所示,另外,路由配置信息也需要配置管理平台统一管理

方式三:通过配置平台管理服务名称与服务地址关系信息

以上就是路由管理的实现方式,前面介绍Zuul时都是按照Zuul1.0的特性介绍的,下面再简要介绍下Zuul2.0的功能。Zuul1.0本质上是一个同步Servlet,采用多线程阻塞模型。即每来一个请求,Servlet容器为该请求分配一个线程负责处理这个请求,直到响应返回客户端,这个线程才会被释放返回容器线程池。如果后台服务调用比较耗时,那么这个线程就会被阻塞,阻塞期间线程资源被占用。Servlet容器线程池的大小是有限制的,当前端请求量大,而后台慢服务比较多时,很容易耗尽容器线程池内的线程,造成容器无法接收新的请求,Netflix为此还专门研发了Hystrix熔断组件来解决慢服务耗尽资源问题。相比较zuul1.0,zuul2.0一个亮点特性是支持异步高并发。异步模式的本质是使用队列Queue(或称总线Bus),如下图所示,可以简单理解为前端有一个队列专门负责处理用户请求,后端有个队列专门负责处理后台服务调用,中间有个事件环线程(Event Loop Thread),它同时监听前后两个队列上的事件,有事件就触发回调函数处理事件。

这种模式下需要的线程比较少,基本上每个CPU核上只需要一个事件环处理线程,前端的连接数可以很多,连接来了只需要进队列,不需要启动线程,事件环线程由事件触发,没有多线程阻塞问题,非阻塞模式下可以接受的连接数大大增加。下图是Zuul2.0的架构概览图

和Zuul1.0相比较,Zuul2.0有两点变化。

  • 前端用Netty Server代替Servlet,目的是支持前端异步。后端用Netty Client代替Http Client,目的是支持后端异步。
  • 过滤器换了一下名字,用Inbound Filters代替Pre-routing Filters,用Endpoint Filter代替Routing Filter,用Outbound Filters代替Post-routing Filters。

Zuul2为了支持异步高并发模式,代码复杂度上比Zuul1高很多。比如:异步模型没有一个明确清晰的请求->处理->响应的执行流程(call flow),它的流程是通过事件触发,请求处理的流程随时可能被切换断开,内部实现要通过一些关联id机制才能把整个执行流再串联起来,这就给开发调试、运维引入了复杂性。总结而言,异步非阻塞模式比较适用于IO密集型(IO bound)场景,这种场景下系统大部分时间在处理IO,CPU计算比较轻,少量事件环线程就能处理。项目中需结合实际情况来选择使用Zuul1.0还Zuul2.0。Zuul1.0开源时间比较久了,有多个大公司落地案例,相对而言比较可靠、稳定。另外,大部分公司达不到Netflix的量级,Netflix需要应对每日千亿级流量,故它们才研发异步模式,一般公司亿级可能都不到。如果选用Zuul1.0可集成Hystrix进行熔断限流,从而避免后端服务响应太慢造成线程池资源耗尽引发的雪崩效应。


http://chatgpt.dhexx.cn/article/Ku1NJA4c.shtml

相关文章

Zuul2.1 sample程序启动篇

Zuul2.1 sample程序启动篇 问题UML解决 问题 不使用AWS环境&#xff0c;Zuul2.1的sample程序是无法启动的。报错如下&#xff1a; WARN com.netflix.discovery.internal.util.Archaius1Utils [main] Cannot find the properties specified : eureka-client. This may be oka…

API Gateways – An Evaluation of Zuul 2

https://www.novatec-gmbh.de/en/blog/api-gateways-an-evaluation-of-zuul-2/ API Gateways – also known as Edge Service – are a fundamental part of a cloud-native microservice architecture. They represent the central access point for all requests for the bac…

Netflix正式开源其API网关Zuul 2--转

微信公众号&#xff1a;聊聊架构 5 月 21 日&#xff0c;Netflix 在其官方博客上宣布正式开源微服务网关组件 Zuul 2。Netflix 公司是微服务界的楷模&#xff0c;他们有大规模生产级微服务的成功应用案例&#xff0c;也开源了相当多的微服务组件&#xff08;详见 GitHub 主页&a…

Netflix正式开源其API网关Zuul 2

5 月 21 日&#xff0c;Netflix 在其官方博客上宣布正式开源微服务网关组件 Zuul 2。Netflix 公司是微服务界的楷模&#xff0c;他们有大规模生产级微服务的成功应用案例&#xff0c;也开源了相当多的微服务组件&#xff08;详见 GitHub 主页&#xff09;&#xff0c;受到了业内…

Zuul 2是如何动态加载Filter的?

Zuul 2沿用了Zuul 1的责任链模式的设计&#xff0c;其网关核心功能还是通过Filter链来实现的。要熟练使用和扩展Zuul 2的功能&#xff0c;必须要了解其Filter的加载和执行机制。另外&#xff0c;Zuul 2使用Guice作为依赖注入工具&#xff0c;因此在开始分析之前&#xff0c;我们…

Zuul2.1文档

Zuul2.1文档 What is Zuul?Why did we build Zuul?How We Use Zuul At NetflixGetting Started 2.0How It Works 2.0Architectural OverviewFilters Server ConfigurationServer ModesHTTPHTTP/2Mutual TLS FiltersIncomingEndpointOutgoingAsyncExtracting Body ContentUsef…

【微服务网关Zuul2】网关Zuul原理与实战

一、参考资料 Spring Cloud Netflix Zuul官方文档翻译 — Jbonehttps://jbone.cn/translate/spring-cloud-netflix-zuul/Spring Cloud Netflixhttps://docs.spring.io/spring-cloud-netflix/docs/2.2.9.RELEASE/reference/html/#router-and-filter-zuul

Zuul2 的 线程模型

Zuul2 的 线程模型 转自&#xff1a;https://www.jianshu.com/p/cb413fec1632 Zuul 2相对zuul 1 由同步改进为异步机制&#xff0c;没有了同步阻塞&#xff0c;全部基于事件驱动模型编程&#xff0c;线程模型也变得简单。 zuul做为一个网关接受客户端的请求–服务端&#xf…

Spring Cloud Gateway VS Netflix Zuul2

最近公司要引入统一网关&#xff0c;自己也参与调研了几种&#xff0c;当在研究Netflix的Zuul2和SpringCloudGateway时被网络上杂七杂八的材料跟震惊了&#xff0c;不客气地说很多国内博客都是在误人子弟&#xff0c;充斥着那些基于SpringCloud全家桶号称自己使用的是zuul2的“…

Zuul1和Zuul2该如何选择?

介绍 在今年5月中&#xff0c;Netflix终于开源了它的支持异步调用模式的Zuul网关2.0版本&#xff0c;真可谓千呼万唤始出来。从Netflix的官方博文[附录1]中&#xff0c;我们获得的信息也比较令人振奋&#xff1a; The Cloud Gateway team at Netflix runs and operates more t…

Zuul 2: Netflix的异步、无阻塞系统之旅

作者: Netflix Technology Blog 译者: java达人 来源: https://medium.com/netflix-techblog/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c Zuul 2和它的“前辈”做了同样的事情—充当Netflix服务器基础设施的前门&#xff0c;处理来自全…

微服务架构:Zuul 1.0 和 2.0 我们该如何选择?

作者&#xff1a;架构师杨波 来源&#xff1a;波波微课 在今年5月中&#xff0c;Netflix终于开源了它的支持异步调用模式的Zuul网关2.0版本&#xff0c;真可谓千呼万唤始出来。从Netflix的官方博文[附录1]中&#xff0c;我们获得的信息也比较令人振奋&#xff1a; The Cloud Ga…

Zuul2核心架构

Zuul2的核心架构就是就是两大体系&#xff0c;netty体系和filter体系。 1 Netty体系 Zuul2底层采用Netty的事件响应模式&#xff0c;要掌握zuul2就必须先要掌握Netty。 1.1 Channel、Event、EventLoop、EventLoopGroup、ChannelHandler Channel&#xff1a;每一次通信就会启…

【Zuul2】网关Zuul控制台DashBoard

目录 一、需求背景 二、实现方案 一、源码获取 二、源码分析 三、效果展示 三、相关问题 一、需求背景 用JAVA为开发语言的流控网关主要分为以下三种&#xff1a; Netflix Zuul/Zuul2Spring Cloud GateWayAlibaba Sentinel 从定位上来看&#xff0c;Zuul2与SpringClou…

【Zuul2】Zuul2网关介绍及案例(非spring集成)

目录 一.使用缘由 二.项目介绍 1.核心内容 (1)三种过滤器 Inbound、Endpoint 、Outbound (2)配置文件application.properties (3)动态配置application.properties 2.参考文档 一.使用缘由 公司需要在springcloudgateway和zuul2间做一次较为完整的调研对比&#xff0c;…

time_t c语言 2038,什么是2038问题?

什么是2038问题 不知道你有没有听过2038问题?无论你是否听过,本文将带你认识什么是2038问题。 Unix时间戳 定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。 而在C语言中,常用time_t来表示。举个例子: #include #in…

MySQL的时间戳2038年问题还有16年,最好在设计上的时候使用datetime就可以了,不要使用时间戳字段了,即使用了也不要用int类型进行映射,使用long类型映射即可

目录 前言1&#xff0c;关于MySQL时间戳的2038年BUG2&#xff0c;使用Docker创建MySQL 模拟下3&#xff0c;总结 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/127455169 未经博主允许不得转载。 博主CSDN地址是&#xff1a;https://blog.csdn.n…

计算机为什么不用三十二进制,32位进制导致2038年问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作。所有使用UNIX时 间表示时间的程序都将受其影响,因为它们以自1970年1月1日经过的秒数(忽略闰秒)来表示时间。 这种时间表示法在类Unix(Unix-like)操作系统上是…

2038年问题 linux内核5.6,Linux Kernel 5.6 开发者已率先做好准备 应对 2038 年问题

新十年伊始&#xff0c;Linux Kernel 5.6的开发者已经准备好着手解决将在下一个十年到来的2038年问题(又称“Y2038”或“Unix Y2K”问题)。Linux 5.6也成为第一个为32位系统准备运行到2038年之后的主线内核。 2038年问题与千年虫问题类似&#xff0c;它可能会导致某些软件在203…

mysql 2038年问题_时间戳(UnixTimestamp)与 《2038年问题》

时间戳是从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。 现在时间戳的长度是十位(1435113975--2015/6/24 10:46:15)。 要到 2286/11/21 01:46:40 才会变成11位(10000000000)&#xff0c;距离现在还有 271年。 不同时区获取的…