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

统一服务入口——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.xdnf.cn/news/16057.html

相关文章:

  • Unreal5从入门到精通之使用 Python 编写虚幻编辑器脚本
  • 旧手机部署轻量级服务器
  • 什么是MySQL 视图
  • MySQL binlog解析
  • 2.1 为什么定义tensor数据结构?
  • 前端面试专栏-工程化:29.微前端架构设计与实践
  • [Semantic Seg][KD]FreeKD: Knowledge Distillation via Semantic Frequency Prompt
  • Elasticsearch是什么?
  • SQL语句中锁的使用与优化
  • 计算机底层入门 05 汇编学习环境通用寄存器内存
  • 【菜狗处理脏数据】对很多个不同时间序列数据的文件聚类—20250722
  • PyTorch常用工具
  • c++day05(ASCII)
  • 【RK3576】【Android14】MIC开发调试
  • ES--为什么没有完全删除?
  • 【科研绘图系列】R语言绘制柱状堆积图
  • 程序是如何生成的-以c语言为例
  • 阶段1--Linux中的文件服务器(FTP、NAS、SSH)
  • 从零构建实时通信引擎:Freeswitch源码编译与深度优化指南
  • Socket套接字
  • 【React-Three-Fiber实践】放弃Shader!用顶点颜色实现高性能3D可视化
  • 项目复盘核心要点
  • ndarray的创建(小白五分钟从入门到精通)
  • 引擎动画系统设计
  • Google Gemini 体验
  • AI一周事件(2025年7月15日-7月21日)
  • C语言符号可见性控制与工程实践——深入理解 __attribute__((visibility)) 和 -fvisibility=hidden
  • repmgr+vip实现对业务透明的高可用切换
  • 【金融机器学习】第四章:风险-收益权衡——Bryan Kelly, 修大成(中文翻译)
  • 92套毕业相册PPT模版