学习 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 中添加身份验证、日志记录或请求修改等功能。希望这篇文章能对你有所帮助,祝你在微服务开发的道路上越走越远!