1.
什么是网关
网关是
微服务最边缘的服务
,
直接暴露给用户,用来做用户和微服务的桥梁
1.
没有网关:客户端直接访问我们的微服务,会需要在客户端配置很多的
ip
:
port
,如果user-service
并发比较大,则无法完成负载均衡
2.
有网关:客户端访问网关,网关来访问微服务,(网关可以和注册中心整合,通过服务名称找到目标的
ip
:
prot
)这样只需要使用
服务名称即可访问微服务
,可以实现负载均衡,可
以实现
token
拦截,权限验证,限流等操作
2.Spring Cloud Gateway
简介
它是 Spring Cloud
官方
提供的用来取代
zuul(netflix
)
的新一代网关组件
(zuul:1.0 , 2.0 ,zuul 的本质,
一组过滤器,根据自定义的过滤器顺序来执行,本质就是
web
组件
web
三大组件(监听器 过滤器
servlet
)
拦截
springmvc
)
Zuul1.0
使用的是
BIO
(Blocking IO
)
tomcat7.0
以前都是
BIO
性能一般
Zuul2.0
性能好
NIO
AIO
异步非阻塞
io a+nio = aio = async + no blocking io
它基于 spring5.x,springboot2
.x
和 ProjectReactor 等技术。
它的目地是让
路由更加简单,灵活,还提供了一些强大的过滤器功能
,例如:熔断、限流、重试,自义定过滤器等 token 校验 ip 黑名单等
SpringCloud Gateway作为Spring Cloud生态的网关,目标是替代Zuul,在SpringCloud2.0以上的版本中,没有对新版本的 zuul2.0 以上的最新高性能版本进行集成,仍然还是使用的
zuul1.x[可以看项目依赖找到]非 Reactor 模式的老版本。而为了提升网关的性能,
SpringCloud Gateway 是基于 webFlux 框架实现的,而 webFlux 框架底层则使用了高性能
的 Reactor 模式通信框架的 Netty
NIO(
非阻塞式
io) BIO
你只需要了解网关能做什么? 网关里面写什么代码 就可以了
3.Spring Cloud Gateway 工作流程
![](https://1000bd.com/contentImg/2024/04/24/b9246ad7f905c9c8.png)
客户端向 springcloud Gateway 发出请求,然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。
Handler 再通过指定的过滤器来将请求发送到我们实际的服务的业务逻辑,然后返回。 过滤
器之间用虚线分开是因为过滤器可能会在发送爱丽请求之前【pre】或之后【post】执行业务
逻辑,对其进行加强或处理。
Filter 在 【pre】 类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等
在【post】 类型的过滤器中可以做响应内容、响应头的修改、日志的输出,流量监控等有着非常重要的作用。
总结:Gateway 的核心逻辑也就是 路由转发 + 执行过滤器链
4.Spring Cloud Gateway
三大核心概念
4.1
Route(
路由
)
(重点 和
eureka
结合做动态路由)
路由信息的组成:
由一个 ID、一个目的 URL、一组断言工厂、一组 Filter 组成。
如果路由断言为真,说明请求 URL 和配置路由匹配。
4.2
Predicate(
断言
)
(就是一个返回
bool
的表达式)
Java 8 中的断言函数。
lambda
四大接口 供给形,消费性,函数型,断言型
Spring Cloud Gateway 中 的 断 言 函 数 输 入 类 型 是 Spring 5.0 框 架 中 的
ServerWebExchange。Spring Cloud Gateway 的断言函数允许开发者去定义匹配来自于Http Request 中的任何信息比如请求头和参数。
4.3
Filter(
过滤
) (
重点
)
一个标准的 Spring WebFilter。
Web
三大组件
(servlet listener filter) mvc : interceptor
Spring Cloud Gateway 中的 Filter 分为两种类型的 Filter,分别是 Gateway Filter 和Global Filter。过滤器 Filter 将会对请求和响应进行修改处理。
一个是针对某一个路由
(
路径
)
的
filter
对某一个接口做限流
一个是针对全局的
filter token ip
黑名单
5.Nginx
和
Gateway
的区别
Nginx
在做路由,负载均衡,限流之前,都有修改
nginx.conf
的配置文件,把需要负载均衡,路由,限流的规则加在里面。
Eg:
使用
nginx
做
tomcat
的负载均衡
但是
gateway
不同,
gateway
自动的负载均衡和路由
,
gateway
和
eureka
高度集成,实现
自动的路由,和
Ribbon
结合,实现了负载均衡(
lb
),
gateway
也能轻易的实现限流和权
限验证。
Nginx
(c
)比
gateway
(
java
)的性能高一点。
本质的区别呢?
Nginx (
更大 服务器级别的
)
Gateway (项目级别的)