spring boot 集成Zuul
spring boot 集成Zuul
- 1. 为什么需要Zuul
- 2. Zuul的工作原理
- 3. spring boot集成
- 3.1 创建
- 3.2 配置
- 3.3 注解
- 3.4 启动
- 3.5 指定url转发
- 3.6 自定义转发列表
- 4. Zuul配置API接口版本号
- 5. 在Zuul上配置熔断器
- 6. 在Zuul中使用过滤器
git地址
https://github.com/a18792721831/studySpringCloud.git
1. 为什么需要Zuul
Zuul 作为路由网关组件,在微服务架构中有着非常重要的作用,主要体现在以下6个方面。
- Zuul、Ribbon 以及Eureka 相结合,可以实现智能路由和负载均衡的功能,Zuul能够将请求流量按某种策略分发到集群状态的多个服务实例。
- 网关将所有服务的API接口统一聚合,并统一对外暴露。外界系统调用API接口时,都是由网关对外暴露的 API 接口,外界系统不需要知道微服务系统中各服务相互调用的复杂性。微服务系统也保护了其内部微服务单元的 API 接口,防止其被外界直接调用,导致服务的敏感信息对外暴露。
- 网关服务可以做用户身份认证和权限认证,防止非法请求操作API接口,对服务器起到保护作用。
- 网关可以实现监控功能,实时日志输出,对请求进行记录。
- 网关可以用来实现流量监控,在高流量的情况下,对服务进行降级。
- API接口从内部服务分离出来,方便做测试。
2. Zuul的工作原理
Zuul 是通过 Servlet 来实现的,Zuul 通过自定义的 ZuulServlet(类似于 Spring MVC 的DispatchServlet)米对请求进行控制。Zaul的核心是一系列过遗器,可以在Http请求的发起和响应返回期间执行一系列的过滤器。Zuu包括以下4种过滤器。
- PRE 过滤器:它是在请求路由到具体的服务之前执行的,这种类型的过滤器可以做安全验证,例如身份验证、参数验证等。
- ROUTING过滤器:它用于将请求路由到具体的微服务实例。在默认情况下,它使用Http Client 进行网络请求。
- POST过滤器:它是在请求已被路由到微服务后执行的。一般情况下,用作收集统计信息、指标,以及将响应传输到客户端。
- ERROR过滤器:它是在其他过滤器发生错误时执行的。
Zuul采取了动态读取、编译和运行这些过滤器。过滤器之间不能直接相互通信,而是通过RequestContext 对象来共享数据,每个请求都会创建一个RequestContext对象。Zuul过滤器具有以下关键特性。 - Type(类型):Zuul过滤器的类型,这个类型决定了过滤器在请求的哪个阶段起作用,例如Pre、Post阶段等。
- Execution Order(执行顺序):规定了过滤器的执行顺序,Order的值越小,越先执行。
- Criteria(标准):Filter执行所需的条件。
- Action(行动):如果符合执行条件,则执行Action(即逻辑代码)。
当一个客户端 Request请求进入Zuul网关服务时,网关先进入“prefilter”,进行一系列的验证、操作或者判断。然后交给“routing filter”进行路由转发,转发到具体的服务实例进行逻辑处理、返回数据。当具体的服务处理完后,最后由“post filter”进行处理,该类型的处理器处理完之后,将Response信息返回给客户端。
ZuulServlet 是 Zuul 的核心 Servlet。ZuulServlet 的作用是初始化 ZuulFiher,并编排这些ZmulFiher的执行顺序。该类中有一个service(方法,执行了过滤器执行的逻辑。
首先执行preRoute()方法,这个方法执行的是PRE类型的过滤器的逻辑。如果执行这个方法时出错了,那么会执行 error(e)和 postRoute()。然后执行route()方法,该方法是执行ROUTING类型过滤器的逻辑。最后执行 postRoute(),该方法执行了 POST类型过滤器的逻辑。
3. spring boot集成
3.1 创建
3.2 配置
3.3 注解
3.4 启动
启动eureka-server、eureka-client多个、ribbon、feign、zuul。
访问直连
再次请求
说明zuul路由转发也做了负载均衡。
访问ribbon
访问feign
3.5 指定url转发
增加配置
验证
多次访问依然是同一个
3.6 自定义转发列表
增加配置
启动验证
多次访问依然是指定的列表。
4. Zuul配置API接口版本号
配置
启动验证
不加版本号是无法访问的。
5. 在Zuul上配置熔断器
在Zuul中实现熔断功能需要实现FallbackProvider的接口。该接口主要有两个方法:一个是匹配的url的getRounte()方法,用于指定熔断功能应用于哪些路由的服务;另一个是fallbackResponse()方法,是当目标方法不可用时的处理方法。
启动验证
这里有一个坑,配置了url的路由无法进行熔断,会直接异常,截止文章发表,未找到直接证据,但是根据步骤可以复现。
具体见
https://blog.csdn.net/a18792721831/article/details/104655867
https://github.com/Netflix/zuul/issues/737
首先两个服务都能访问
接着关闭eureka-client、ribbon、feign。
然后访问
6. 在Zuul中使用过滤器
如何实现自定义过滤,以及在自定义过滤中加入业务逻辑。
实现过滤器很简单,只需要继承ZuulFilter,并实现ZuulFilter中的抽象方法,包括filterType()和filterOrder(),以及IZuulFilter的 shouldFilter()和Object run()的两个方法。其中,filterType()即过滤器的类型,它有4种类型,分别是“pre”“post”“routing”和“error”。filterOrder是过滤顺序,它为一个Int类型的值,值越小,越早执行该过滤器。
shouldFilter()表示该过滤器是否过滤逻辑,如果为true,则执行run()方法;如果为false,则不执行run()方法。run()方法写具体的过滤的逻辑。
首先创建自定义的过滤器
PRE过滤器
post
ps:Routing和error未验证触发(error直接转发到/error了,routing直接进入eureka-client中了)
注意:使用getOutputStream,如果使用getWriter会有异常getWriter() has already been called for this response
启动验证
日志
spring boot 集成Zuul相关推荐
- spring boot 集成sleuth
spring boot 集成sleuth 1. 理论 1.1 sleuth是什么 1.2 sleuth有哪些 1.3 链路追踪的一些基本概念 1.4 zipkin的组成 2. zipkin 实例 2. ...
- Spring Boot集成Swagger导入YApi@无界编程
接口APi开发现状 现在开发接口都要在类似YApi上写文档,这样方便不同的团队之间协作,同步更新接口,提高效率. 但是如果接口很多,你一个个手工在YApi去录入无疑效率很低. 如果是使用Spring ...
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- 6.3 Spring Boot集成mongodb开发
6.3 Spring Boot集成mongodb开发 本章我们通过SpringBoot集成mongodb,Java,Kotlin开发一个极简社区文章博客系统. 0 mongodb简介 Mongo 的主 ...
- springboot(十八):使用Spring Boot集成FastDFS
上篇文章介绍了如何使用Spring Boot上传文件,这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中. 这个项目会在上一个项目的基础上进行构建. 1.pom包 ...
- Spring Boot集成Hazelcast实现集群与分布式内存缓存
2019独角兽企业重金招聘Python工程师标准>>> Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品,提供弹性可扩展.高性能的分布式内存计算.并通过提供诸 ...
- Spring Boot 集成 Swagger 生成 RESTful API 文档
原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...
- 【Java进阶】Spring Boot集成ES
目录 spring boot集成ES ElasticSearchConfig 测试文档的基本操作 Elasticsearch Clients 文档 spring boot集成ES Java REST ...
- Spring Boot集成Jasypt安全框架
Jasypt安全框架提供了Spring的集成,主要是实现 PlaceholderConfigurerSupport类或者其子类. 在Sring 3.1之后,则推荐使用PropertySourcesPl ...
最新文章
- 深入了解line-height
- Linux怎么关闭ssh和ftp服务,linux ftp启用和停用及vsftpd安装 ssh 启用和停用命令及ssh的安装...
- python装饰器类-python_类装饰器
- linux安装mysql字符_Linux下MySQL的彻底卸载和安装配置字符集
- JavaScrip有哪些优点
- Java-消息框显示两整数加减乘除
- python del 函数
- 基于Zabbix的校园网核心监控系统设计与实现
- honor magicbook 16pro
- java 5分钟_java计算下一个整5分钟时间点
- 信息学奥赛一本通 1362:家庭问题(family)
- 一加 Ace 竞速版什么时候发布 一加 Ace 竞速版配置怎么样
- Mysql设置别名(表名和列名)
- 2022年Servlect课时十七——什么是监听器@@回顾过滤器@@Servlect
- Ubuntu Kylin系统中配置Apache服务器
- python的seaborn用于可视化分析_Python数据分析-可视化“大佬”之Seaborn
- 九零后看什么网络电视
- Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initia
- 2023中央财经大学MTI英语翻译硕士专业考研成功经验分享
- HI3559V200获取IMX458摄像头数据_(2)sdk例程sample_vio
热门文章
- 博世(BOSCH) ECU BootLoader设计思路
- Win32窗口机制和消息机制整体流程
- 指尖江湖服务器维护,指尖江湖服务器修复第一日,玩家重新审视游戏:我觉得海星...
- 网页要让它自适应各种手机屏幕宽度大小要怎么设置
- xwiki部署_Xwiki 使用总结
- 关于通用mapper的使用
- python通过Excel表格读取存储数据
- Wordpress清新扁平风格阿里百秀XIU v7.5博客主题全解密
- pso算法matlab程序,基本PSO算法的matlab源程序
- 六级核心词汇61~100