建个视频网站多少钱,助君网络,更换wordpress后台域名,做百度网站每年的费用多少本文主要总结Spring Gateway的基础用法#xff0c;内容包括网关、Spring Gateway工作流程、Spring Cloud Gateway搭建、路由配置方式、负载均衡实现、断言工厂这几个部分 目录
1. 网关
1.1 网关介绍
1.2 网关对比
1.3 Spring Gateway
1.4 核心概念
1.6 总结
2. Spring … 本文主要总结Spring Gateway的基础用法内容包括网关、Spring Gateway工作流程、Spring Cloud Gateway搭建、路由配置方式、负载均衡实现、断言工厂这几个部分 目录
1. 网关
1.1 网关介绍
1.2 网关对比
1.3 Spring Gateway
1.4 核心概念
1.6 总结
2. Spring Gateway工作流程
2.1 官网上的核心工作流程
核心流程
核心点
2.2 Spring Gateway执行流程
总结
3. Spring Cloud Gateway搭建
3.1 Gateway搭建
3.2 总结
4. Gateway路由配置方式
4.1 Gateway Config
4.2 通过yml文件配置
5. Gateway实现负载均衡
5.1 什么是负载均衡
5.2 自动负载均衡
5.3 手动负载均衡
6. Gateway断言Predicate
6.1 断言种类
7. Gateway的Filter
7.1 内置Filter
7.1.1 内置过滤器分类
7.1.2 内置过滤器配置
7.2 自定义Filter 1. 网关
1.1 网关介绍
在微服务架构中一个系统会被拆分为多个微服务那么作为客户端如何去调用这些微服务呢如果没有网关的存在我们只能在客户端记录每个微服务的地址然后分别去调用这样会产生很多问题
客户端多次请求不同的微服务增加了客户端代码或配置编写的复杂性认证复每个微服务需要独立认真存在跨域问题在一定场景下处理相对复杂
为了解决上述问题引入了网关概念所谓的API网关就是指系统的统一入口提供内部服务的路由中转为客户端提供统一的服务一些与业务本身功能无关的公共逻辑可以在这里实现例如认证、鉴权、监控、路由转发等。 1.2 网关对比
Zuul、NginxLua 和 Spring Cloud Gateway 都可以用作API网关但它们在不同方面有一些不同之处包括性能、扩展性、功能和用途。以下是它们的主要比较 Zuul 2. 性能Zuul性能较低特别是在处理大量并发请求时。它使用的是阻塞I/O每个请求都会占用一个线程。 3. 扩展性Zuul的扩展性相对较低。定制功能需要使用过滤器这可能不够灵活。 4. 功能Zuul是Netflix OSS的一部分提供基本的路由、负载均衡、重试等功能。然而它的功能相对有限。 5. 用途适合小规模的、非高并发的应用或者作为微服务架构中的较早版本API网关。 NginxLua 2. 性能Nginx以其出色的性能而闻名。NginxLua的组合可以在处理高并发请求时提供高性能特别适合于需要低延迟的应用。 3. 扩展性NginxLua提供了强大的扩展性。使用Lua脚本你可以定制和扩展其功能以适应各种需求。 4. 功能Nginx是一个功能强大的反向代理服务器可以处理负载均衡、缓存、SSL终端、请求重写、安全性等各种功能。 5. 用途适合高并发的生产环境特别是需要高性能和低延迟的应用一般用于一层网关。 Spring Cloud Gateway 2. 性能Spring Cloud Gateway在性能方面表现不错它使用基于反应性的编程模型充分利用非阻塞I/O。 3. 扩展性Spring Cloud Gateway提供了很好的扩展性它是基于Spring Framework构建的因此可以与Spring生态系统的其他组件无缝集成。 4. 功能Spring Cloud Gateway提供了路由、过滤器、限流、熔断等功能可以满足大多数API网关的需求。 5. 用途适合构建微服务架构中的API网关特别是在使用Spring Boot和Spring Cloud的应用中。
1.3 Spring Gateway
Spring Cloud Gateway是一个用于构建API网关的开源项目它是Spring Cloud生态系统的一部分。API网关是微服务架构中的关键组件之一用于管理和路由传入的请求提供了一种集中化的访问点可以实现诸如路由、负载均衡、身份验证、安全性、监控、限流、重试等功能。Spring Cloud Gateway提供了一种现代、动态、灵活且功能强大的方式来处理这些任务。
以下是Spring Cloud Gateway的一些主要特点和功能 动态路由Spring Cloud Gateway允许你根据需要动态配置路由这意味着你可以在不停止网关的情况下修改路由规则。路由配置通常存储在配置中心如Spring Cloud Config中从而实现灵活的路由管理。 过滤器Gateway提供了一组预定义的过滤器用于请求和响应的修改、校验、验证和监控。你还可以编写自定义过滤器以适应特定需求。 负载均衡Gateway集成了Spring Cloud LoadBalancer可实现请求的负载均衡。你可以将请求路由到多个后端服务实例实现高可用和扩展性。 限流和熔断Spring Cloud Gateway支持通过集成Hystrix来实现限流和熔断功能以保护后端服务免受过多的请求压力。 安全性可以与Spring Security或其他身份验证和授权机制集成实现安全的API访问。 监控和指标Spring Cloud Gateway集成了Spring Boot Actuator提供了各种有用的监控和度量信息可以使用Micrometer将这些信息导出到多个监控系统。 WebSockets支持Gateway支持WebSockets因此可以处理实时通信的需求。 HTTP/2支持可以通过配置启用HTTP/2协议以提高性能。 自定义路由规则除了使用配置外你还可以编写自定义的路由规则以实现更复杂的路由需求。
Spring Cloud Gateway是建立在Spring Framework和Spring Boot的基础上的因此与Spring生态系统的其他组件无缝集成。它为构建微服务架构中的API网关提供了灵活、高性能和现代的解决方案。
特点 性能强大是Zuul性能的1.6倍功能强大内置了很多实用功能如转发、监控、限流等设计优雅易于拓展
1.4 核心概念
在Spring Gateway中 路由Route路由是网关的基本构建单元包括以下属性 ID标识路由的唯一标识。URI目标URI定义路由请求将被转发到的目标URI。断言Predicates一组谓词用于匹配HTTP请求的属性如路径、主机、标头等。过滤器Filters一组过滤器用于在请求到达目标URI之前或响应返回之前对请求和响应进行修改。举例定义一个路由将匹配/example路径的请求将其转发到http://example.com
id: example_route uri: example.com predicates: Path/example 断言Predicate谓词是用于匹配HTTP请求的条件。谓词可以基于请求的各种属性如路径、主机、标头等。例如Path谓词可以匹配请求路径。 举例定义一个谓词要求请求路径必须以/api开头
predicates:
Path/api/** 过滤器Filter过滤器是网关中的处理器它们可以在请求到达目标URI之前或响应返回之前对请求和响应进行修改。过滤器可以用于添加标头、修改请求体、记录日志等操作。 举例定义一个过滤器向响应标头中添加X-Custom-Header标头
filters:
AddResponseHeaderX-Custom-Header, Gateway
这些组件一起构成了Spring Gateway的核心功能允许您定义路由规则、请求匹配条件以及请求和响应的处理操作。
1.6 总结
SpringCloud Gateway使用的是WebFlux中的reactor-netty响应式编程组件底层使用Netty通讯框架。
2. Spring Gateway工作流程
2.1 官网上的核心工作流程
核心流程图如下 核心流程
客户端Gateway Client向 Spring Cloud Gateway发送请求。如果Gateway Handler Mapping确定请求与路由匹配则将其发送到Gateway Web Handler处理程序。接着处理程序通过特定于请求的Filter链过滤请求。Filter被虚线分隔的原因是Filter可以在发送代理请求之前pre和之后post运行逻辑。执行所有pre过滤器逻辑然后进行代理请求发送代理请求之后运行“post”过滤器逻辑 过滤器作用 Filter在pre类型的过滤器可以做参数校验权限校验、流量监控、日志输出和协议转换等。Filter在Post类型的过滤器可以做响应内容、响应头的修改、日志输出和流量监控等
核心点
Route路由路由是构建网关的基础模块儿它由ID目标URI包括一系列的断言喝过滤器组成如果断言为True则匹配该路由。Predicate断言开发人员可以匹配http请求中的所有内容如请求头或请求参数请求与断言匹配则进行路由。Filter过滤指Spring框架中GatewayWayFilter的实例使用过滤器可以在请求被路由前或者之后对请求进行修改。三个核心点连起来当用户的请求到达GatewayGateway会通过一些匹配条件定位到真正的服务节点并在这个转发过程前后进行一些细化控制。其中Predicate就是我们的匹配条件Filter可以理解为一个过滤器有了这两点再加上目标URI就可以实现一个具体路由了
2.2 Spring Gateway执行流程 如上图所示当使用Spring Gateway处理请求时它经历以下流程 Client向Gateway Server发送请求: 客户端例如浏览器、移动应用或其他服务发送HTTP请求到Spring Gateway服务器这是请求的起始点。 请求会被HttpWebHandlerAdapter提取组装成网关上下文: 请求进入Spring Gateway后首先被HttpWebHandlerAdapter处理。这个组件负责提取HTTP请求信息并将其组装成网关上下文对象其中包括请求的各种信息如HTTP头、请求参数等。 网关上下文会传递到DispatcherHandler: 组装好的网关上下文被传递到DispatcherHandler它是Spring Gateway的核心处理器。DispatcherHandler的任务是将请求分发到合适的处理程序。 RoutePredicateHandlerMapping负责路由查找并根据路由断言判断路由是否可用: RoutePredicateHandlerMapping负责路由查找它将根据网关上下文中的信息选择适当的路由。每个路由都包括一个或多个路由断言这些断言是用来判断该路由是否适用于当前请求的条件。 如果断言成功由FilteringWebHandler创建过滤器链并调用:
如果路由断言成功表示当前请求匹配了某个路由规则。此时将会由FilteringWebHandler创建一个过滤器链并按照链的顺序调用这些过滤器。过滤器可以在请求到达后端服务之前或响应返回给客户端之前对请求进行修改、验证或记录日志等操作。
这个流程允许Spring Gateway进行请求的路由和过滤以实现对请求的控制和处理。通过配置不同的路由规则和过滤器可以根据请求的性质来决定如何处理请求例如路由到不同的后端服务、添加安全性措施或改变请求和响应的内容。
总结
Gateway的核心流程就是路由转发执行过滤器链
3. Spring Cloud Gateway搭建
3.1 Gateway搭建
搭建一个cloud-alibaba-gateway项目因为使用了spring cloud 所以需要注意版本间的匹配这里可以通过阿里的云原生脚手架去获取适合的版本[start.aliyun.com/]
搭建Spring Gateway项目之前需要一些前置搭建微服务注册中心NacosConsulEureka等这里我使用Nacos进行演示Nacos的搭建流程可以参考[juejin.cn/post/705471…]
该案例的完整代码可以在gitee项目中获取[gitee.com/lei-qinghua…] pom
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.ts/groupIdartifactIdcloud-alibaba-gateway/artifactIdversion0.0.1-SNAPSHOT/versionnamecloud-alibaba-gateway/namepropertiesjava.version1.8/java.versionproject.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncodingspring-boot.version2.6.13/spring-boot.versionspring-cloud-alibaba.version2021.0.5.0/spring-cloud-alibaba.versionspring-cloud.version2021.0.5/spring-cloud.version/propertiesdependenciesdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesdependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring-boot.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationsource1.8/sourcetarget1.8/targetencodingUTF-8/encoding/configuration/pluginplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdversion${spring-boot.version}/versionconfigurationmainClasscom.ts.demo.DemoApplication/mainClassskiptrue/skip/configurationexecutionsexecutionidrepackage/idgoalsgoalrepackage/goal/goals/execution/executions/plugin/plugins/build
/project注意引入Gateway一定要删除spring-boot-starter-web依赖否则会发生冲突无法引入。
yml
server:port: 9999spring:application:name: cloud-gateway-servicecloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 开启了spring gatewayroutes:- id: nacos-provider #服务id对应nacos中注册的服务名uri: http://localhost:9003/nacos-provider #访问的uri地址predicates:- Path/ts/** #断言对请求进行匹配只有包含/ts的路径才能通过断言 controller (微服务cloud-alibaba-provider-9003) 这里我们搭建了另外一个微服务cloud-alibaba-provider-9003作为服务的提供者来验证网关是否生效这个微服务的逻辑非常简单使用HashMap模拟一个一个数据库的获取操作如下
RequestMapping(/ts)
RestController
public class DataController {Value(${server.port})String serverPort;public static HashMapLong,String hashMap new HashMap();static {hashMap.put(1l,鼠标);hashMap.put(2l,键盘);hashMap.put(3l,耳机);}GetMapping(info/{id})public JsonResultString msbSQL(PathVariable(id) Long id) {JsonResultString result new JsonResult(200,ServerPort: serverPort:hashMap.get(id));return result;}GetMapping(/timeout)public JsonResultString timeout(){try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}return new JsonResult(200,ServerPort: serverPort);}
}测试[http://localhost:9999/ts/timeout] 如下图所示我们通过微服务提供者的url对服务进行访问而是通过gateway网关的路径对微服务进行访问成功了就说明我们的网关搭建成功了。 3.2 总结
这里以一个简单的例子展示了Spring Gateway网关的基础搭建和测试过程相关的服务搭建都是在本地完成的完整的代码请参考我的gitee项目[gitee.com/lei-qinghua…]
4. Gateway路由配置方式
在第三节中我们用yml文件对Gateway的路由方式进行了配置实际上Gateway还可以通过Java代码的方式来进行路由配置。
4.1 Gateway Config
通过Bean 注入一个RouteLocator代码如下
package com.example.cloudalibabagateway.config;import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class GatewayConfig {Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){RouteLocatorBuilder.Builder routes routeLocatorBuilder.routes();routes.route(path_ts,r - r.path(/ts/**).uri(http://localhost:9003/nacos-provider));return routes.build();}
}4.2 通过yml文件配置
server:port: 9999spring:application:name: cloud-gateway-servicecloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:enabled: trueroutes:- id: nacos-provideruri: http://localhost:9003/nacos-providerpredicates:- Path/ts/**5. Gateway实现负载均衡
5.1 什么是负载均衡
微服务系统的负载均衡是一种机制用于在微服务架构中均匀分配网络请求和流量到不同的微服务实例以确保各个服务的资源充分利用提高系统的性能、可用性和稳定性。在微服务架构中通常存在多个相同或相似的微服务实例每个实例都提供相同的服务接口但可能运行在不同的主机或容器上。
以下是微服务系统中负载均衡的一些关键概念和特点 服务实例均衡分配微服务负载均衡确保来自客户端的请求均匀分布到不同的服务实例上以防止某些实例过载而其他实例处于空闲状态。 多种负载均衡策略微服务负载均衡可以采用不同的策略如轮询、随机、最少连接等以选择目标服务实例。每种策略有其用途根据具体情况选择合适的策略。 健康检查负载均衡器定期检查每个服务实例的健康状态以确定哪些实例可以接收请求。如果某个实例不健康或不可用负载均衡器将停止将请求路由到该实例。 自动扩展微服务系统的负载均衡应该支持自动扩展。当系统负载增加时可以自动添加新的服务实例以处理更多请求。这有助于应对流量波动和系统的横向扩展。 故障转移如果某个服务实例出现故障负载均衡器应该自动将流量转移到其他健康的实例以确保系统的可用性。 会话粘附在某些情况下需要确保同一客户端的多个请求被路由到同一服务实例以维护会话一致性。这称为会话粘附一些负载均衡器支持此功能。
微服务系统的负载均衡是确保整个系统运行顺畅的重要组成部分。它有助于避免单点故障提高系统的可用性并允许系统根据需求自动扩展。选择适当的负载均衡策略和工具对于构建稳健的微服务系统至关重要。
5.2 自动负载均衡
Gateway还提供了和Zuul类似的自动路由规则具体配置如下
gateway.discovery.locator.enabled true 这个配置默认为false但是如果设置为true就是开启了通过serviceID转发到具体的服务实例。配置好之后可以直接通过服务名称来进行访问Nacos中注册的服务和对应接口。Gateway在开启了自动路由之后还自带负载均衡功能。
server:port: 9999spring:application:name: cloud-gateway-servicecloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:enabled: true # 开启自动路由功能根据服务名自动创建routes测试[http://localhost:9999/nacos-provider/info/1] 我们直接通过spring gateway的服务地址和服务提供者nacos-provider的服务名组成的url地址就可以以负载均衡的方式访问nacos-provider的服务。
5.3 手动负载均衡
自动负载均衡存在一个问题就是需要暴露每一个服务的服务名称因此可以采用手动负载均衡的方式来避免暴露微服务的服务名称。
yml配置
server:port: 9999spring:application:name: cloud-gateway-servicecloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:enabled: trueroutes:- id: nacos-provideruri: lb://nacos-provider # 开启负载均衡服务名称为nacos-providerpredicates: # 断言放开所有路径- Path/**lb:// 代表开启负载均衡测试[http://localhost:9999/info/1]
6. Gateway断言Predicate
Gateway断言可以理解为当满足条件后才会进行转发总结就是Predicate就是为了实现一组匹配规则让请求过来找到相应的Route进行处理。
6.1 断言种类
Spring Cloud Gateway支持多种路由断言Route Predicates类型用于匹配和路由HTTP请求。以下是一些常见的路由断言类型
Path Route Predicate路径匹配根据请求的路径进行匹配。
predicates:
Path/api/**
这将匹配所有以/api/开头的路径。
Host Route Predicate主机匹配根据请求的主机名进行匹配。
predicates:
Hostexample.com
这将匹配主机名为example.com的请求。
Method Route PredicateHTTP方法匹配根据HTTP请求方法进行匹配。
predicates:
MethodGET
这将匹配HTTP GET请求。
Header Route Predicate请求头匹配根据请求头信息进行匹配。
predicates:
HeaderAuthorization, Bearer .
这将匹配包含Authorization头且值以Bearer开头的请求。
Query Route Predicate查询参数匹配根据请求的查询参数进行匹配。
predicates:
Queryname, john
这将匹配包含namejohn的查询参数的请求。
Cookie Route PredicateCookie匹配根据请求的Cookie信息进行匹配。
predicates:
CookiesessionId, .
这将匹配包含名为sessionId的Cookie的请求。
Combining Predicates组合匹配你可以组合多个路由断言来创建更复杂的匹配条件。
predicates:
Path/api/**Hostexample.com
这将匹配主机为example.com且路径以/api/开头的请求。
这些路由断言允许你根据请求的不同属性如路径、主机、请求头、HTTP方法等进行匹配和路由从而更灵活地控制请求的路由和处理。你可以在Spring Cloud Gateway的路由配置中定义这些路由断言以满足你的具体需求。
7. Gateway的Filter
路由过滤器允许以某种方式修改传入的http请求或传出的HTTP响应路由过滤器的范围是特定的路由Spring Cloud Gateway包含许多内置的Gateway Filter工厂。
7.1 内置Filter
7.1.1 内置过滤器分类
Gateway内置的Filter生命周期分为两种pre业务逻辑之前、post业务逻辑之后
Gateway本身自带的Filter分为2种GateWayFilter单一、GlobalFilter全局
Spring Cloud Gateway提供了多个内置的过滤器Filters这些过滤器允许你在请求和响应的生命周期中执行各种操作例如请求路由、修改请求和响应、增加头信息等。以下是一些常见的内置过滤器 Forward Routing Filter用于路由请求到后端服务。 LoadBalancerClient Filter通过LoadBalancerClient执行负载均衡请求。 AddRequestHeader Filter在请求中添加头信息。 AddRequestParameter Filter在请求中添加查询参数。 RewritePath Filter重写请求路径用于修改请求的路径。 SetStatus Filter设置HTTP响应状态码。 AddResponseHeader Filter在响应中添加头信息。 Hystrix Filter用于Hystrix断路器的支持。 WebSockets Filter用于WebSocket代理。 ModifyResponseBody Filter修改响应体内容。 PreserveHostHeader Filter保留原始主机头信息。 RequestRateLimiter Filter实现请求速率限制。
这些内置过滤器可以通过Spring Cloud Gateway的路由配置文件进行配置从而对请求和响应进行自定义处理。你可以根据具体需求组合和配置这些过滤器以满足你的应用程序的需求。此外你也可以编写自定义过滤器来执行更高度定制的操作。过滤器在Gateway中扮演了非常重要的角色帮助你实现请求的路由和处理逻辑。
7.1.2 内置过滤器配置
Spring Gateway提供了许多内置的过滤器用于执行常见的网关任务例如鉴权、请求转发、重定向等。你可以在Spring Gateway的配置中添加这些内置过滤器来满足你的需求。以下是如何配置内置过滤器的一些示例
鉴权过滤器用于对请求进行身份验证和授权你可以使用AddRequestHeader过滤器来添加认证信息到请求头中。
spring:cloud:gateway:default-filters:- name: AddRequestHeaderargs:X-Request-Auth: some-auth-token
3. 重定向过滤器用于将请求重定向到其他路径或URL。你可以使用RedirectTo过滤器来执行重定向操作。
spring:cloud:gateway:routes:- id: my_redirect_routeuri: http://example.compredicates:- Path/redirectfilters:- RedirectTo302:http://new-location.com
4. 请求转发过滤器用于将请求转发到其他服务或路径。你可以使用ForwardTo过滤器来执行请求转发。
spring:cloud:gateway:routes:- id: my_forward_routeuri: http://example.compredicates:- Path/forwardfilters:- ForwardTohttp://forward-service.com
5. 添加响应头过滤器用于在响应中添加额外的头信息。你可以使用AddResponseHeader过滤器来添加响应头。
spring:cloud:gateway:default-filters:- name: AddResponseHeaderargs:X-Response-Header: some-value
这只是一些内置过滤器的示例Spring Gateway提供了更多的内置过滤器你可以根据你的需求在配置中使用它们。通过合理配置内置过滤器你可以实现许多常见的网关功能而无需自行编写复杂的逻辑。
7.2 自定义Filter
要创建自定义过滤器Custom Filter来扩展Spring Cloud Gateway的功能你需要遵循一些步骤。自定义过滤器可以用于执行各种自定义操作例如鉴权、日志记录、修改请求和响应等。以下是创建自定义过滤器的一般步骤 创建一个自定义过滤器类首先你需要创建一个Java类实现GatewayFilter或GlobalFilter接口。这两个接口分别用于创建局部过滤器和全局过滤器。 局部过滤器 (GatewayFilter) 会应用于特定路由的请求。 全局过滤器 (GlobalFilter) 会应用于所有路由的请求。
下面我们以创建一个全局过滤器来展示如何创建自定义过滤器要创建自定义的全局过滤器你需要实现Spring Cloud Gateway的 GlobalFilter 接口。以下是创建一个简单的全局自定义过滤器的步骤 创建一个类实现 GlobalFilter 接口。 在该类上添加 Component 注解以便Spring容器可以扫描并管理它。 实现 filter 方法该方法包含你自定义过滤器的逻辑。
以下是一个示例自定义全局过滤器的代码
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {Overridepublic Monolt;Voidgt; filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 在请求处理之前执行自定义逻辑ServerHttpRequest request exchange.getRequest();ServerHttpResponse response exchange.getResponse();// 在响应中添加自定义的HTTP头response.getHeaders().add(X-Custom-Header, CustomHeaderValue);// 修改请求或响应内容ServerHttpRequest modifiedRequest request.mutate().header(X-Modified-Header, ModifiedValue).build();ServerWebExchange modifiedExchange exchange.mutate().request(modifiedRequest).build();// 执行链中的下一个过滤器或处理器return chain.filter(modifiedExchange).then(Mono.fromRunnable(() -gt; {// 在请求处理完成后执行自定义逻辑// 这里可以对响应进行进一步处理}));}Overridepublic int getOrder() {// 指定过滤器的执行顺序可以是负数、零、正数数字越小执行顺序越靠前return Ordered.HIGHEST_PRECEDENCE;}
}在上面的示例中CustomGlobalFilter 是一个全局过滤器它在请求处理前和请求处理后执行自定义逻辑。你可以在 filter 方法中访问请求、响应修改它们的内容添加自定义HTTP头以及执行其他自定义逻辑。getOrder 方法用于指定过滤器的执行顺序数字越小执行顺序越靠前。
确保将 CustomGlobalFilter 类放在Spring Boot应用程序的类路径下Spring会自动识别并应用它。这样你的自定义全局过滤器就会在请求到达Spring Cloud Gateway时生效。