跳到主要内容
Spring Cloud Gateway 核心功能与配置实战 | 极客日志
Java java
Spring Cloud Gateway 核心功能与配置实战 综述由AI生成 Spring Cloud Gateway 作为微服务网关的作用,包括权限控制、动态路由、负载均衡和限流。详细讲解了 Gateway 服务的搭建步骤,Route Predicate Factories 的路由断言配置,以及 Filter Factories 的请求过滤逻辑。同时涵盖了 GlobalFilter 的全局监控功能及 Filter 执行顺序,提供了基于 Nacos 注册中心的配置示例。
星落 发布于 2026/3/24 更新于 2026/5/4 18 浏览一、什么是网关
在微服务架构中,网关类似于前台,所有进入微服务的请求通常都需要先到网关,由网关进行一些处理后,再转发到相关服务上。
网关的处理具体包括以下几个方面:
权限控制 :对请求进行权限校验,校验失败则直接将请求拦截。
动态路由 :根据请求信息将请求转发到对应的微服务上。
负载均衡 :当请求的目标服务有多个时,根据情况进行负载均衡。
限流 :将请求按照设定的最大流量进行限流,以免各服务压力过大。
目前市面上大多数都是使用 Gateway 来作为微服务的网关。
二、Gateway 的使用
Gateway 服务的搭建
在微服务项目中创建一个新的模块。
引入依赖,具体如下:
<dependencies >
<dependency >
<groupId > org.springframework.cloud</groupId >
<artifactId > spring-cloud-starter-gateway</artifactId >
</dependency >
<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 >
</dependencies >
此时,一个网关模块就创建好了,但当前网关还没有设置任何处理请求的功能,下面我们来看一下如何设置网关的功能。
Route Predicate Factories 在 Java 8 中提供了一个函数式接口 Predicate,这个接口能够校验请求中的参数,具体为通过接受一个字符串,根据字符串的特点返回一个布尔值,用来进行条件过滤。下面我们来具体使用一下这个接口。
在 test 中我们可以定义一些逻辑来进行条件判断,例如我们这里定义成字符串为空返回 false,不为空返回 true。
在 Predicate 中还包含了许多其它方法,例如 and 方法,它的参数为 Predicate 类型,返回值为一个新的 Predicate,这个新的 Predicate 的 test 方法返回的则是前两个 Predicate 的 test 返回值取'&&'的结果。其它方法可以参考下面的内容:
isEqual(Object targetRef):比较两个对象是否相等,参数可以为 Null
and(Predicate other):短路与操作,返回一个组成 Predicate
or(Predicate other):短路或操作,返回一个组成 Predicate
test(T t):传入一个 Predicate 参数,用来做判断
negate():返回表示此 Predicate 逻辑否定的 Predicate
Gateway 给我们提供了一个 Route Predicate Factories(路由断言工厂),里面包含了很多的 Predicate 来对路由进行一些规则匹配,例如 Path,它能匹配指定规则的路径,Method 能够匹配指定的请求方法,还有其它的一些 Predicate,大家可以去下面这个链接进行查询:
我们可以在我们创建的 Gateway 模块的配置文件中来使用这些 Predicate,具体使用的配置如下:
gateway:
routes:
- id: product-service
uri: lb://product-service
predicates:
- Path=/product/**
- id: order-service
uri: lb://order-service
predicates:
- Path=/order/**
配置好之后,当请求的 url 与 predicates 中对于的路由规则 path 匹配时,就会依据 id 中的服务名称,去注册中心获取对应的服务地址,然后负载均衡出一个地址并构建对应的请求去访问目标服务。
此时请求就会来到网关,在网关中进行 predicate 的条件判断,判断通过后去 Nacos 获取服务信息并负载均衡,然后去访问目标服务。上面地址的访问结果如下:
可以发现成功返回了数据,由此可以推断,请求成功通过网关访问到了目标服务。
我们也可以配置多个 predicate,例如我们再配置一个 Method,用来匹配请求的方法。
此时只要请求同时匹配这两个规则才能够去访问对应的服务。
Gateway Filter Factories
Filter Predicate 能够设置一些请求的匹配规则,而 Filter 则能在请求被目标服务处理前后,添加一些逻辑。例如,我们可以在请求发送到目标服务之前,让请求新增一个参数。Filter 在生效时机上可以分为 Post 类型和 Pre 类型。
Pre 类型的 Filter 中定义的逻辑在请求处理前执行,而 Post 类型的则是在请求处理完成之后,数据返回给用户之前执行。在生效范围上,又可以把 Filter 分为 GatewayFilter(作用于单个路由或者同一个分组的路由上,也就是匹配到的 id 是一样的)、GlobalFilter(对于每一个路由都生效,也就是每一个请求都生效)。
Gateway Filter Factories(路由过滤工厂)中为我们提供了很多的 Filter,例如 AddRequestParameter,它能在请求被处理之前在请求中添加一个参数,下面我们来具体使用以下。
Filter 和 Predicate 一样,也是需要在配置文件中进行配置,具体如下:
server:
port: 10030
gateway:
routes:
- id: product-service
uri: lb://product-service
predicates:
- Path=/product/**
- id: order-service
uri: lb://order-service
predicates:
- Path=/order/**
filters:
- AddRequestParameter=userName, bite
这里我们配置了 AddRequestParameter,他在请求中添加了一个 username 字段,值为 bite。
下面我们通过一个接口来测试一下是否真的添加了该参数。
我们启动对应的服务来访问一下这个接口,打印的日志如下:
可以发现成功获取到 Filter 添加的参数了。在路由过滤工厂中还有许多其他的 Filter,如果大家想了解更多,可以访问如下地址:
前面我们配置的 Filter 只能对当前的单一路由生效,如果我们想对所有路由都生效,就需要配置 default-filter,具体配置项如下:
server:
port: 10030
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 182.92 .242 .181 :8848
gateway:
metrics:
enabled: true
routes:
- id: order-service
uri: lb://order-service/
predicates:
- Path=/order/**
- After=2024-03-20T00:00:22.370856700+08:00[Asia/Shanghai]
filters:
- AddRequestParameter=userName, bite
- name: Custom
args:
name: test_custom
- id: product-service
uri: lb://product-service/
predicates:
- Path=/product/**
default-filters:
- name: Retry
args:
retries: 3
statuses: BAD_GATEWAY
此时配置的 Filter 就对对所有路径都生效了。
GlobalFilter 在 Gateway 中提供了很多全局过滤器(GlobalFilter),用来实现安全监控,日志记录等功能。常见的有
Gateway Metrics Filter:网关指标,提供监控指标
Forward Routing Filter:用于本地 forward,请求不转发到下游服务器
LoadBalancer Client Filter:针对下游服务,实现负载均衡
使用 GlobalFilter 进行监控等功能需要引入下面这个依赖
<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: always
shutdown:
enabled: true
Filter 的执行顺序 在一个路由下,可能会有多个 Filter,他们的执行顺序如何呢?我们来看一下。
在请求发送到对应的服务之前,网关会去获取当前请求需要使用到的所有 Filter,并将其按照 Order 值排序(每个 Filter 都必须指定一个 Order 值,Order 值越大,执行的顺序则越靠前,反之则越靠后,路由过滤工厂给我们提供的 Filter 都是已经设置好 Order 值了),根据顺序执行 Filter。如果 Order 值一样,则按照 defaultFilter > GatewayFilter > GlobalFilter 的顺序执行。
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online