微服务学习|Gateway网关:网关作用、快速入门、路由断言工厂、路由过滤器配置、全局过滤器、过滤器执行顺序、跨域问题处理

为什么需要网关

网关功能:

1.身份认证和权限校验

2.服务路由、负载均衡

3.请求限流

网关的技术实现

在SpringCloud中网关的实现包括两种:gateway、zuul

Zuul是基于Servlet的实现,属于阻塞式编程。而SprinaCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

搭建网关服务

搭建网关服务的步骤:

1.创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖

2.编写路由配置及nacos地址

3.访问相关接口,端口为网关设置端口,发现都可以调用,网关设置成功

路由断言工厂Route Predicate Factory

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件

例如Path=/user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handlerpredicate.PathRoutePredicateFactory类来处理的

像这样的断言工厂在SpringCloudGateway还有十几个

Spring提供了11种基本的Predicate工厂:

使用After,访问orderservice微服务的请求,2031年后的请求才可以通过

调用orderservice微服务的接口,发现访问不了了已经

改成Before,也就是2031年以前的请求就可以通过

成功访问

PredicateFactory的作用是什么?

读取用户定义的断言条件,对请求做出判断

Path=/user/**是什么含义?

路径是以/user开头的就认为是符合的

路由过滤器 GatewayFilter

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理

过滤器工厂 GatewayFilterFactory

Spring提供了31种不同的路由过滤器工厂。例如:

案例:给所有进入userservice的请求添加一个请求头

给所有进入userservice的请求添加一个请求头: Truth=itcastis freaking awesome!

实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器

在userservice的一个方法中加入获取到请求头的一个参数,并将该参数打印

调用该接口,发现在控制台中成功打印出参数,说明请求头中确实加入了我们设置的信息

默认过滤器

如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下

过滤器的作用是什么?

对路由的请求或响应做加工处理,比如添加请求头

配置在路由下的过滤器只对当前路由的请求生效

defaultFilters的作用是什么?

对所有路由都生效的过滤器

全局过滤器 GlobalFilter

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。定义方式是实现GlobalFilter接口。

案例:定义全局过滤器,拦截并判断用户身份

需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

参数中是否有authorization

authorization参数值是否为admin

如果同时满足则放行,否则拦截

调用该接口并携带响应参数,发现可以调用

参数携带错误,发现调用不了

全局过滤器的作用是什么?

对所有路由都生效的过滤器,并且可以自定义处理逻辑

实现全局过滤器的步骤?

实现GlobalFilter接口

添加@Order注解或实现Ordered接口

编写处理逻辑

过滤器执行顺序

请求进入网关会碰到三类过滤器: 当前路由的过滤器、DefaultFilter、GlobalFilter

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器

每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前

GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定

路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增

当过滤器的order值一样时,会按照 defaultFilter >路由过滤器>GlobalFilter的顺序执行

路由过滤器、defaultFilter、全局过滤器的执行顺序?

order值越小,优先级越高

当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器

相关推荐
猿究院_夏燊2 小时前
Spring Bean 生命周期
java·后端·spring
Wang's Blog2 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
信誓旦旦的程序猿3 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河3 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
Jlzn88883 小时前
华东电芯分选通道数怎么配才不堵线
java·人工智能·架构·自动化·制造
香吧香3 小时前
GRPC连接机制---长连接分析
java·网络与传输协议
CCblandy4 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
我是人✓4 小时前
SpringBoot项目的五种创建方式
java·spring boot·后端
Wang's Blog4 小时前
Java 项目实战: 交友项目 - 阿里云 OSS 入门案例:从创建 Bucket 到上传拿到可访问 URL
java·阿里云·交友
裕晟资质规划5 小时前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全