当前位置: 首页 > news >正文

4、Gateway

Spring Cloud Gateway主要功能:

  • 反向代理
  • 认证鉴权
  • 流量控制
  • 熔断
  • 日志监控

官方解释:

客户端SpringCloud Gateway发出请求,然后在Gateway Handler Mapping中找到与之请求相匹配的路由,将其发送到Gateway Web Handler,Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会发在代理请求之前(“pre”)或之后(“post”)执行业务逻辑,这样,Filter在“pre”类型的过滤器可以做参数校验,权限校验,流量监控,日志输出,协议转换等;在“post”类型的过滤器可以做响应内容,响应头的修改,日志的输出,流量监控等有着非常重要的作用


一、安装

1、新建一个微服务

1.1、新建gateway子模块

1.2、引入依赖
gateway服务依赖

<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies>
2、配置服务

2.1、创建启动类

@SpringBootApplicationpublicclassMdxShopGateWayApplication{publicstaticvoidmain(String[]args){SpringApplication.run(MdxShopGateWayApplication.class,args);}}

2.2、创建application.yml配置文件

spring:application:name:gatewaycloud:nacos:server-addr:http://192.168.88.139:8848discovery:username:nacospassword:nacosserver:port:80

二、配置路由规则

springcloud 提供了两种方式

  • 通过配置文件的方式进行配置
  • 通过编码的方式进行配置

1、配置文件

创建application-route.yml文件

application-route.yml:

spring:cloud:gateway:routes:-id:order-serviceuri:lb://service-order#lb = load balancer(负载均衡)predicates:# 断言-Path=/order/**order:0# 路由的优先级, 越小优先级越高(默认为0)-id:product-serviceuri:lb://service-productpredicates:-Path=/product/**

记得在application.yml中引入:

spring:profiles:include:route
基础原理

路由断言主要用来判断路由的规则。
配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理。
例如Path=/user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理。

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

名称说明示例
After是某个时间点后的请求- After=2022-01-20T14:32:27.789-07:00[Asia/Shanghai]
Before是某个时间点之前的请求- Before=2022-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between是某两个时间点之前的请求- Between=2021-01-20T17:42:47.789-07:00[Asia/Shanghai], 2023-01-21T17:42:47.789-07:00[Asia/Shanghai]
Cookie请求必须包含某些cookie- Cookie=chocolate
Header请求必须包含某些header- Header=asd, cas
Host请求必须是访问某个host(域名)- Host=baidu.com, jd.com
Method请求方式必须是指定方式- Method=GET,POST
Path请求路径必须符合指定规则- Path=/user/{params},/card/**
Query请求参数必须包含指定参数- Query=name, Jack
RemoteAddr请求者的ip必须是指定范围- RemoteAddr=192.168.1.1/24
Weight权重处理

实际使用时,根绝业务要求选择使用即可。
不过一般来讲,最常用的是使用Path这种断言工厂,仅用它就能满足常见的需求了。

2、编码配置


三、过滤器

过滤器执行的顺序:

  1. 请求先 依次通过每个过滤器的前置过滤
  2. 然后 倒序的通过每个过滤器的后置过滤

常用的几个有:

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果中移除有一个响应头
RequestRateLimiter限制请求的流量
RewritePath进行路由转发

1、局部过滤器

2、全局过滤器

spring:cloud:gateway:routes:-id:user-serviceuri:lb://userservicepredicates:-Path=/user/**default-filters:# 默认过滤器配置-AddRequestHeader=token,test# 添加请求头

四、自定义全局路由过滤器

有时候SpringCloudGateWay提供的过滤器工厂不能满足自己的要求。
可能有时候需要在过滤时做一些其它的逻辑操作。
那么这时候可以选择使用java代码自定义全局过滤器。

代码示例:

@Component@Slf4jpublicclassRtGlobalFilterimplementsGlobalFilter,Ordered{@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){ServerHttpRequestrequest=exchange.getRequest();ServerHttpResponseresponse=exchange.getResponse();StringrequestURI=request.getURI().getPath();longstartTime=System.currentTimeMillis();log.info("请求【{}】开始:时间:{}",requestURI,startTime);// =========== 以上是前置逻辑 ===========Mono<Void>filter=chain.filter(exchange).doFinally((result)->{// =========== 以下是后置逻辑 =========== long endTime = System.currentTimeMillis();log.info("请求【{}】结束时间:{},耗时:{}ms",requestURI,endTime,endTime-startTime);});// 放行returnfilter;}@OverridepublicintgetOrder(){return0;}}

当有多个过滤器时,Order的值决定了过滤器的执行顺序。

数值越大优先级越低, 负的越多, 优先级越高。
主要有两种方式
1,如上述代码这样
2,使用@Order注解

五、全局跨域

只需要修改一下配置即可

spring:cloud:gateway:globalcors:cors-configurations:'[/**]':# 匹配所有路径allowed-origin-patterns:"*"# 允许所有源allowed-headers:"*"# 允许所有请求头allowed-methods:"*"# 允许所有请求方法

请求就携带了 跨域的请求头

http://www.cnnetsun.cn/news/68695.html

相关文章:

  • 泛型实例化陷阱频发?资深架构师总结的6大避坑法则
  • hot100 2.字母异位词分组
  • R语言Cox回归避坑指南(临床数据建模常见错误TOP5)
  • 是德 N9041B UXA 频谱分析仪在真空环境完成卫星信号分析
  • 用是德DSOX1204A示波器快速捕捉与调试信号的实用指南
  • 连接器EMC测试不过关?5步定位干扰源头,快速通过认证
  • 为什么90%的物联网项目卡在部署阶段?真相令人震惊
  • 你还在用线性回归预测产量?R语言随机森林模型已全面超越
  • Laravel 13发布后必须掌握的技能:多模态任务队列的7种高级用法
  • some 知识点 knowledge
  • Gson和Jackson是怎么解决泛型实例化的?源码级剖析告诉你答案
  • 重新发现深圳,找个咖啡/羽毛球搭子一起探索城市的AB面
  • 请求拦截不再难,Symfony 8拦截器实现原理与最佳实践全解析
  • RAG文本分块策略:优化LLM的知识访问效率
  • 桌面那么点大,性能它偏要狂
  • 基于51单片机的智能水表系统设计
  • 基于单片机的交通控制系统
  • 永磁同步电机PMSM 5 - 7次谐波注入降低转矩脉动实践
  • 万字长文梳理如何扩展大语言模型的上下文长度:算法原理、实现方法与适用场景(RoPE、YaRN、优化Attention、RAG等)
  • 特征提取+概率神经网络 PNN 的轴承信号故障诊断模型
  • 单元测试基础知识,面试用得上...
  • 美国国务院恢复 Times New Roman 字体
  • 【万字长文】LLM+KG:大模型与知识图谱融合的黄金时代,技术前景与实现路径全解析!
  • ionet 25.2 发布
  • 谁还不知道!2025年这4款免费AI写歌工具
  • OpenNJet v3.3.1.3
  • 续约上港!张琳芃 400 万冲第 12 冠
  • 2023A卷,区块链文件转储系统
  • 动态图表自由切换,R Shiny多输入控件协同设计全解析
  • 基于单片机的视力保护器设计