目录
-
- 一、概述简介
-
- 1.1. Gateway是什么
- 1.2. Gateway能干嘛
- 1.3. Zuul和gateway
- 1.4. gateway三大核心概念
- 1.5. gateway工作流程
- 二、实战练习
-
- 2.1. 入门demo
- 2.2. 关路由两种配置方式
- 2.3. 配合注册中心使用
- 三、Predicate的使用
-
- 3.1. Predicate是什么/li>
- 3.2. 12个Predicate使用讲解
- 四、Filter的使用
-
- 4.1. Filter是什么/li>
- 4.2. 常用的GatewayFilter
- 4.3. 自定义全局过滤器
- 4.4. 实现指定路由跳过全局过滤器
- 五、Http超时配置
-
- 5.1. 全局超时
- 5.2. 每条路由超时
- 六、执行器API
- 七、故障排除-日志级别
一、概述简介
官 :https://docs.spring.io/spring-cloud-gateway/docs/3.1.3/reference/html/
1.1. Gateway是什么
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的 关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的 关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了 关基本的功能,例如:安全,监控/埋点,和限流等。
什么是 关/strong>
关(Gateway)又称 间连接器, 关在 络层实现服务之间 络互连。用程序的话来说就是。他就好比小区的门一样,你想进来小区,必须通过门才能进来。为什么要有这个门了方便管理以及安全考虑,就好比现在疫情期间,动不动小区封了,假如小区没有门,想要封小区还得费特别大的劲将小区给围住。
再回到程序当中,现在非常流行微服务系统,将整体应用拆分为了多个模块,那么问题来了,前端页面肯定会涉及到调用不同微服务的接口,一个微服务就代表着一个端口的应用,每个微服务都是独立的,那么前端在调用的时候不可能将访问地址设置成多个呀。设置成多个当然也可以,弊端就是开发过程当中我们涉及到环境(域名服务器ip)的切换,那还得改多个,因此 关为解决这个问题而生, 关可以将多个微服务访问的地址进行聚拢起来,你要访问哪个微服务的接口,直接访问 关, 关负责给你转发到对应的微服务地址上,因此前端只需要知道 关的地址服务地址就可以了。
Gateway和Nginx两个 关的区别
在学习Gateway 关的时候很容易联想到Nginx,甚至刚接触的时候会好奇很多架构图上面 画的两个 关竟然都用到了,那么他们两个到底有什么关联性/p>
下图当中圈出来的就是Gateway所在的位置。而Nginx属于在Gateway上层。甚至可以在外部请求的上层,因为Nginx可以用来做 关层的负载均衡,同时他还可以用来做流量入口。因为他本身就是服务器,实际开发当中都是通过Nginx来做流量入口的。
什么是流量入口/strong>
流量入口的意思就是假如我有个html放到linux当中,那么外面的人怎么才能访问到linux当中的页面呢ginx可以用来解决这个问题,他本身就是一个服务器,使用过程就是开启端口然后监听请求,当请求来了,可以将请求 指向本机的任意可访问的html文件。
1.2. Gateway能干嘛
- 反向代理
- 鉴权
- 限流
- 熔断
- 日志监控
1.3. Zuul和gateway
目前在cloud官 当中新版本已经将zuul彻底移除了。,而Gateway是SpringCloud团队研发的,是亲儿子产品,值得信赖。而且很多功能Zuul都没有用起来也非常的简单便捷。在版本选型上我们基本上不会再考虑zuul了。
Zuul 1.x 基于Servlet 2. 5使用(如 WebSocket) Zuul 的设计模式和Nginx较像,每次 I/ O 操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别是Nginx 用C++ 实现,Zuul 用 Java 实现,而 JVM 本身会有第一次加载较慢的情况,使得Zuul 的性能相对较差。
Zuul 2.x理念更先进,想基于Netty非阻塞和支持长连接,但SpringCloud目前还没有整合。 Zuul 2.x的性能较 Zuul 1.x 有较大提升。在性能方面,根据官方提供的基准测试, Spring Cloud Gateway 的 RPS(每秒请求数)是Zuul 的 。
Spring Cloud Gateway 建立 在 Spring Framework 5、 Project Reactor 和 Spring Boot 2 之上, 。Spring Cloud Gateway , 并且与Spring紧密集成拥有更好的开发体验
1.4. gateway三大核心概念
- Route(路由):路由是构建 关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
- Predicate(断言):参考的是Java8的,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
- Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会执行业务逻辑。
Filter在“pre”类型的过滤器可以做,在“post”类型的过滤器中可以做有着非常重要的作用。
核心逻辑:路由转发+执行过滤器链
二、实战练习
2.1. 入门demo
假如我有个8001端口的服务,然后他有以下两个接口,但是我又不想让别人通过8001端口访问,我想让他通过9527访问怎么办简单通过Gateway搭建一个 关服务即可解决该问题。
接下来搭建一个9527端口的Gateway入门级别的 关服务
1、以下是使用到的核心依赖,一般都会采用聚合工程,由父工程存放dependencyManagement当中的依赖,其他子模块引入使用的组件即可,单纯的练习图省劲的话,创建一个独立可运行的boot项目也可以。
关于搭建聚合我这里就尽量减省步骤了,不会搭建的可以看我的这一篇文章:https://blog.csdn.net/weixin_43888891/article/details/125267683pm=1001.2014.3001.5502
2、添加配置
3、测试访问:http://localhost:9527/payment/get/1
4、总结
通过以上示例,我们可以基本的掌握Gateway到底是干什么的,说白了就是请求转发。
如果程序引用了,但不希望启用 关,请设置
设置完之后再想通过 关来转发请求,会直接404。
2.2. 关路由两种配置方式
java代码配置:
配置文件配置
这两种可以实现同样的结果,假如两个都存在,并且Path是一样的,代码配置的要比配置文件配置的级别高,这时候会路由到代码配置的uri当中。
实际开发当中我们基本上都会用配置文件的方式来配置,很少会用java配置。
2.3. 配合注册中心使用
以上示例是直接将请求转发到了ip+端口服务上。只有配合注册中心使用,才能来调用完成微服务的负载均衡。
如果对注册中心不是很了解的可以去看一下我之前的文章,有Eureka、Consul、zookeeper注册中心教程,所谓的注册中心我们可以把它当做就是一个map,服务的ip+端口 (或者是域名)就是value,而服务名称当做key。然后调用者通过服务名称来获取到调用服务的域名。这样假如微服务是集群,但是他们的服务名称是一样的,这样就可以很轻松的通过服务名来获取集群的ip+端口,有了ip+端口,就剩下负载均衡轮询调用了。
这里我直接就是通过Eureka注册中心来进行演示了。正常情况下,我们可以选择将 关服务注册到注册中心,也可以不进行注册, 关服务最重要的是要具备服务发现功能,至于要不要注册上去我们可以根据自己的业务场景来决定。
1.引入依赖
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!