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

统一服务入口——Spring Cloud Gateway

一、快速上手

1.1 准备工作

API网关也是一个服务

一、创建网关服务


二、添加依赖

        <!--⽹关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--基于nacos实现服务发现依赖,网关支持动态路由,需要服务发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--网关服务也需要loadbalancer将服务名转换为对应的IP地址--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

三、编写启动类

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class,args);}
}

四、添加配置

server:port: 10030
spring:application:name: gatewaycloud:nacos: #将网关服务注册到nacosdiscovery:server-addr: 110.41.17.130:8848gateway:routes: #网关路由设置- id: order-service #路由规则id,随便起,不重复即可uri: lb://order-service/ #目标服务地址predicates: #路由条件- Path=/order/**,/feign/**

其中,id可以随便起一个,uri中的lb表示负载均衡,predicates表示路由条件(在当前配置表示所有路径符合Path规则的请求,都会代理到uri参数指定的地址)


1.2 测试

(1)访问订单服务

(2)访问商品服务

可以看到,只有已配置的路由才可以通过gateway服务访问,未配置的路由无法访问


二、Route Predicate Factories

我们可能对于配置中的一些配置存有疑问,现在我们深入了解上述配置的predicates

2.1 Predicate

Predicate是Java8提供的一个函数式编程接口,它接收一个参数并返回一个布尔值,用于条件过滤、请求参数的校验。

使用示例:

/*
* 判断字符串是否为空
* 空 -true
* 非空 -false
* */
public class StringPredicate implements Predicate<String> {@Overridepublic boolean test(String s) {return s == null || s.isEmpty();}
}

接下来,调用方法进行测试:

    public void test(){Predicate<String> predicate = new StringPredicate();System.out.println(predicate.test(""));}

Predicate的其它方法:


2.2  Route Predicate Factories

Route Predicate Factories(路由断言工厂),由Predicate提供路由规则的匹配机制。

在配置文件中所写得断言规则只是字符串,这些字符串被Route Predicate Factories处理后转变为路由得判断条件,如:下图的Path属性就是匹配url前缀是product/  或 feign/ 的请求

Spring Cloud Gateway 默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请求的不同属性,并且多个Predicate通过and逻辑进行组合

 在前面的代码中已经测试了Path属性,现在再添加一个Predicate After:

          predicates: #路由条件- Path=/order/**,/feign/**- After=2026-01-20T17:42:47.789-07:00[America/Denver]

可以看到After属性配置为2026年后才可访问,现在再次测试:

注释After配置,访问成功:


2.3 Gateway Filter Factories(网关过滤工厂)

Predicate决定了请求由哪个路由处理,如果需要再请求前后加上一些逻辑,就需要使用Filter。

Filter分为两种类型:

1> Pre 类型过滤器:请求处理前执行,可以做鉴权、限流等工作

2> Post 类型过滤器:请求处理后、返回客户端前执行

Spring Cloud Gateway中内置很多Filter,用于拦截和链式处理Web请求(权限校验、访问超时等处理),Spring Cloud Gateway 将Filter分为两类:

GatewayFilte(应用到单个路由或一个分组路由上)

GlobalFilter(应用到所有路由)

2.3.1 GatewayFilter

这里以其中一个Filer(AddRequestParam)为例

一、添加配置

      routes:- id: order-service #路由规则id,随便起,不重复即可uri: lb://order-service/ #目标服务地址predicates: #路由条件- Path=/order/**,/feign/**filters:- AddRequestParameter=userName, wangwu

与predicates同级,这个Filter给Path中指定请求添加一个参数userName


二、修改feign/o1代码(添加一个参数userName)


三、测试

成功添加参数userName

想了解其它过滤器可以访问Spring官网: GatewayFilter Factories :: Spring Cloud Gateway


2.3.2 GlobalFilter

Spring Cloud Gateway中内置的全局过滤器也有很多,如:

Gateway Metrics Filter:网关指标,提供监控指标 

Forward Routing Filter:用于本地forword,请求不转发到下游服务器

LoadBalancer Client Filter:针对下游服务,实现负载均衡

更多全局过滤器可参考官网:Global Filters :: Spring Cloud Gateway

这里我们只练习使用 Gateway Metrics Filter:

一、添加依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

二、添加配置

spring:cloud:gateway:metrics:enabled: true
management:endpoints:web:exposure:include: "*"endpoint:health:show-details: alwaysshutdown:enabled: true

三、测试

访问127.0.0.1:10030/actuator,显示所有监控的信息链接:


2.4 过滤器执行顺序

一个项目中既有GatewayFilter又有GlobalFilter时,执行的先后顺序是什么呢?

请求路由后,网关会将当前的GatewayFilter和GlobalFilter合并到一个过滤器链中,进行排序,依次执行过滤,每一个过滤器都必须指定⼀个int类型的order值,默认值为0,表示该过滤的优先级。order值越小,优先级越高,执行顺序越靠前

• Filter通过实现Order接口或者添加@Order注解来指定order值。

• Spring Cloud Gateway提供的Filter由Spring指定。用户也可以自定义Filter,由用户指定。

• 当过滤器的order值⼀样时,会按照 defaultFilter > GatewayFilter > GlobalFilter的顺序执行。

http://www.dtcms.com/a/294204.html

相关文章:

  • 大模型【进阶】(四)QWen模型架构的解读
  • linux中如何清除history命令
  • 【WRF】根据自动安装脚本安装 WRF / WRF-CHEM等
  • Java学习---Spring及其衍生(上)
  • 【机器学习】组合优化问题combination-optimization概述
  • 【2025/07/23】GitHub 今日热门项目
  • AI入门学习-Python 最主流的机器学习库Scikit-learn
  • 游戏盾和传统防火墙有什么区别?
  • 可视化机器学习实验全生命周期管理工具链wandb.ai
  • LLC协议通过其帧结构和控制机制实现流量控制与错误控制
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-10,(知识点:电感与磁珠的特性对比)
  • Modbus TCP转Devicenet:水泥厂PLC与多类仪表的自动化通信实践
  • 前端资源缓存优化案例:深入探讨 Nginx 配置中的 Cache-Control 头部叠加问题
  • Dify实战,获取禅道需求,编写测试用例到禅道
  • 什么是5G-A三防平板?有什么特点?哪些领域能用到?
  • 幂等性简单介绍
  • 网络与信息安全有哪些岗位:(2)渗透测试工程师
  • 耐达讯自动化EtherCAT转RS232:示波器连接的“开挂秘籍”
  • 在mac 上zsh 如何安装最新的 go 工具
  • CGA老年人能力评估师:提升老年生活质量
  • SOLIDWORKS2025教育版集成了电气与自动化设计功能
  • iOS上使用WebRTC推拉流的案例
  • RabbitMQ有多少种Exchange?
  • 微软2025教育AI报告:教育群体采用AI的比例显著提升
  • 【lucene】实现knn
  • Vue TodoList案例
  • Task 01 学习笔记
  • 若依前后端分离版学习笔记(二)——系统菜单介绍
  • 在写作软件中画地图,Canvas 绘图在地图设计中应用
  • 音视频学习(四十三):H264无损压缩