学习 Java 网关 GlobalFilter 的实现
在现代微服务架构中,API 网关常常作为内外系统的中介,负责处理所有进入和离开的请求。Spring Cloud Gateway 是一个流行的解决方案,而其核心功能之一就是提供 GlobalFilter。GlobalFilter 可以让我们在请求和响应的生命周期中添加自定义逻辑,比如身份验证、请求日志、响应修改等。
实现步骤概览
为了更好地理解如何实现 GlobalFilter,我们将整个流程进行分解,如下表所示:
步骤 | 描述 | 代码示例 |
---|---|---|
1. 创建 Maven 项目 | 初始化项目及依赖 | pom.xml 文件 |
2. 添加依赖 | 引入 Spring Cloud Gateway 依赖 | spring-cloud-starter-gateway |
3. 创建 GlobalFilter | 实现 GlobalFilter 接口 | MyGlobalFilter.java |
4. 注册 Filter | 在 Spring Boot 应用中注册 Filter | @Component 注解 |
5. 运行项目 | 启动 Spring Boot 应用 | Application.java |
接下来我们将详细阐述每一步所需的代码和实现。
1. 创建 Maven 项目
首先,我们需要创建一个新的 Maven 项目。在项目目录下,建立一个 pom.xml
文件:
<project xmlns="
xmlns:xsi="
xsi:schemaLocation="
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>gateway-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
<spring-cloud.version>2.2.1.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
这个 pom.xml
文件引入了 Spring Boot,Spring Web 和 Spring Cloud Gateway 的相关依赖。
2. 添加依赖
在项目的 pom.xml
中已经添加了 spring-cloud-starter-gateway
,这是构建网关的基础。
3. 创建 GlobalFilter
接下来,我们需要创建一个自定义的 GlobalFilter 实现。在 src/main/java/com/example/gatewaydemo
目录下创建 MyGlobalFilter.java
文件:
package com.example.gatewaydemo;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.RewritePathGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class MyGlobalFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 在此处理逻辑,您可以获取请求信息
String requestPath = exchange.getRequest().getURI().getPath();
System.out.println("Request Path: " + requestPath);
//您还可以在此处修改请求
//例如:可以在请求头中添加一些内容
return chain.filter(exchange) //继续到下一个过滤器
.then(Mono.fromRunnable(() -> {
// 可以在这里执行响应打日志逻辑
System.out.println("Response sent for path: " + requestPath);
}));
}
}
这个 MyGlobalFilter
类实现了 GlobalFilter
接口。我们重写了 filter
方法,可以打印请求路径并进行其他操作。
4. 注册 Filter
在 Spring Boot 中,使用 @Component
注解自动注册 MyGlobalFilter
。实际上,只需要确保该类在 Spring 扫描的包下,即可完成自动注册。
5. 运行项目
最后,我们需要创建启动类,并确保项目可以正常运行。在 src/main/java/com/example/gatewaydemo
目录下创建 Application.java
文件:
package com.example.gatewaydemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
到此,基本的 GlobalFilter 实现完成了。你可以使用 mvn spring-boot:run
命令来启动你的 Spring Boot 应用。
代码执行流程
使用序列图来展示代码的执行流程:
sequenceDiagram
participant Client
participant Gateway
participant Service
Client->>Gateway: 发起请求
Gateway->>MyGlobalFilter: filter
MyGlobalFilter->>Gateway: 继续到下一个过滤器
Gateway->>Service: 转发请求
Service-->>Gateway: 返回响应
Gateway->>MyGlobalFilter: 响应处理
MyGlobalFilter-->>Client: 返回最终响应
总结
在本文中,我们详细阐述了如何在 Java 中实现一个简单的 GlobalFilter。通过创建 Maven 项目、添加依赖、实现 GlobalFilter 接口、注册该过滤器以及启动应用,我们完成了基本的网关功能。同时,我们也展示了代码执行的流程图,并强调了 GlobalFilter 的重要性。
如需进一步拓展,可以考虑在 GlobalFilter 中添加身份验证、日志记录或请求修改等功能。希望这篇文章能对你有所帮助,祝你在微服务开发的道路上越走越远!