使用 Zuul 构建微服务网关
使用 Zuul 构建微服务网关
一、功能简介
zuul 的核心是一系列的过滤器,这些过滤器可以完成以下功能。
- 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求。
- 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
- 动态路由:动态的将请求路由到不同的后端集群。
- 压力测试:逐渐增加指向集群的流量,以了解性能。
- 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
- 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。
- 多区域弹性:跨越 AWS Region 进行请求路由,旨在实现 ELB(Elastic Load Balancing)使用的多样化,以及让系统的边缘更加贴近系统的使用者。
二、简单使用
1、步骤
1)、添加依赖
2)、在启动类上添加 @EnableZuulProxy 注解,表示以代理模式启动 Zuul ,该代理默认使用 Ribbon 来定位注册在 Eureka Server 中的微服务;同时,该代理还整合了 Hystrix,从而实现了容错。
3)、编写配置文件
4)、启动 application 即可使用 zuul 。
2、路由规则
1)访问 http://zuul-ip:zuul-port/miscro-service-name/**,请求将被转发到 http://miscro-service-name-ip-port/** 。
默认情况下 zuul 会代理 Eureka Server 上的所有微服务。
3、Zuul 的路由端点
当 @EnableZuulProxy 与 Spring Boot Actuator 配合使用的时候,Zuul 会暴露一个路由管理端点 /actuator/routes,可以查看已暴露的路由端点。
使用 GET ip:port/actuator/routes 返回 Zuul 当前映射的路由列表,使用 POST 可以强制刷新 Zuul 当前映射的路由列表。
4、路由配置详解
这部分主要会讲如何让 zuul 代理部分微服务,或者需要对 URL 进行更精确的控制。
1)自定义微服务访问地址
配置 zuul.routes.指定微服务 serviceId = 指定路径 即可。
这样 http://zuul_ip:port/microservice/**
就会被映射到普通配置下的 http://zuul_ip:port/service/**
地址
2)忽略指定地址
3) 忽略所有微服务,仅路由指定微服务
这样 zuul 只会路由 microservice1 微服务。
4)同时指定微服务的 serviceId 和对应路径。
user-route 只是给路由一个名称,可随意起名。
此配置会将普通配置下的 http://zuul_ip:port/microservice-user
映射到 http://zuul_ip:port/user
5)同时指定 path 和 URL,例如
这样就可以将 http://localhost:8080/
映射到 http://zuul_id:port/user/**
需要注意的是,使用这种方式配置的路由不会作为 HystrixCommand 执行,同时不能使用 Ribbon 来负载均衡多个 URL。
6)同时指定 path 和 URL,并且不破坏 Zuul 的 Hystrix、Ribbon 的特性。
这样就可以既指定 path 与 URL,又不破坏 Zuul 的 Hystrix 与 Ribbon 特性了。
7)使用正则表达式指定 Zuul 的路由匹配规则
借助 PatternServiceRouteMapper,实现从微服务到映射路由的正则配置。
8)路由前缀
这样,访问 http://zuul_ip:port/api/microservice-provider-user/1
路径,请求将会被转发到 microservice-provider-user/api/1
这样访问 Zuul 的 /user/1 路径,请求将会被转发到 microservice-provider-user 的 /user/1
即:http://zuul_ip:port/user/1
===>> http://microservice-provider-user-ip-port/user/1
== 普通模式下的 http://zuul_ip:port/microservice-provider-user/user/1
9)忽略某些路径
如果想让 zuul 代理某个微服务,同时又想保护该微服务的某些敏感路径,此时,可使用 ignored-Patterns,指定忽略的正则。例如
5、Zuul 的安全与 Header
1)敏感 Header 的设置
为了防止敏感 Header 外泄,需要为路由指定一系列敏感 Header 列表。
也可用用 zuul.sensitive-headers 全局指定 Header,例如
2)忽略 Header
也可使用 zuul.ignoreHeaders 丢弃一些 Header
设置后,Header1,Header2就不会传播到其他的微服务中。
默认情况下,zuul.ignored-headers 是空值,但如果 Spring Security 在项目的 classpath 中,那么 zuul.ignored-headers 的默认值就是 Pragma,Cache-Control,X-Frame-Options,X-Content-Type-Options,X-XSS-Protection,Expires。所以,当 Spring Security 在 classpath 中时,如果需要下游微服务使用 Header 时,可以将 zuul.ignoreSecurity-Headers 设置为 false。
6、使用 Zuul 上传文件
对于小文件(1M 以内),无须任何处理,对于大文件上传,需要为上传路径添加 /zuul 前缀。也可使用 zuul.servlet-path 自定义路径。
如果使用了 Ribbon 做负载均衡,那么对于超大文件,还需提升超时设置:
使用文件上传功能时,最好设置:
7、Zuul 的过滤器
1)过滤器类型与请求生命周期
Zuul 的大部分功能都是通过过滤器来实现的。Zuul 中定义了四种标准过滤器类型。
- PRE:在请求被路由之前调用。可利用这种过滤器实现身份认证、在集群中选择请求的微服务、记录调试信息等
- ROUTING:这种过滤器将请求路由到微服务。这种过滤器用来构建发送给微服务的请求,并使用 Apache HttpClient 或 Netfilx Ribbon 请求微服务。
- POST:这种过滤器在路由到微服务以后执行。这种过滤器可以用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
- ERROR:在其他阶段发生错误时执行该过滤器。
- Zuul 允许自定义过滤器类型,例如,可以定制一种 STATIC 类型的过滤器,直接在 Zuul 中生成响应,而不是将请求转发到后端的微服务。
Zuul 请求的生命周期图:
2)编写 Zuul 过滤器
编写 zuul 过滤器非常简单,仅需实现 import com.netflix.zuul.ZuulFilter 接口接口
上面的过滤器仅实现了打印日志的功能。
3)禁用 Zuul 过滤器
Spring Cloud 默认为 Zuul 编写并启用了一些过滤器,例如 DebugFilter、 FormBodyWrapperFilter 等。
如果想要禁用过滤器,仅需配置zuul.<SimpleClassName/>.<filterType>.disable=true
即可
8、Zuul 的容错与回退
zuul 默认已经开启了 Hystrix ,并且 zuul 的容错的粒度是微服务,要实现回退,我们仅需实现 org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider
接口并将其作为 SpringBoot 组件,如下所示:
9、Zuul 的高可用
1)第一种情况,Zuul 客户端也注册在微服务上
这种情况不用多说,必然高可用。
2)第二种情况,zuul 客户端未注册到微服务上
在现实中,基本都是这种情况,因为不可能把所有客户端都注册到 Eureka 上。
这种情况下,可以借助一个额外的负载均衡器来实现 zuul 的高可用,例如 Nginx、HAProxy、F5 等。
如下图,Zuul 客户端将请求发送到负载均衡器,负载均衡器将请求转发到其代理的其中一个 Zuul 节点。这样,就可以实现 Zuul 的高可用。
10、使用 Zuul 聚合微服务
这部分主要使用了 Rxjava 来进行异步请求微服务,当请求完成时,zip
微服务的返回结果,将其发送给客户端。
1、首先在微服务中创建 RestController ,该 controller 为用户提供聚合服务
AggregationService 接口
AggregationServiceImpl 类
使用浏览器请求 localhost:port/aggregate/test/id 即可观察到结果。
__EOF__

本文链接:https://www.cnblogs.com/zolmk/p/14073935.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义