在现代微服务架构中,API网关作为服务之间的入口和出口,承担着请求路由、安全验证、流量控制等多种重要功能。Spring Cloud Gateway是一个基于Spring生态系统的API网关,实现了请求路由及过滤功能,同时支持高度可定制化的请求处理机制。本文将介绍如何使用Spring Cloud Gateway创建简单的网关并配置全局拦截器。
一、创建项目
首先,创建一个Spring Boot项目,并添加依赖。可以在pom.xml
中添加以下依赖:
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
注: 需要在
<dependencyManagement>
中配置 Spring Cloud 的版本,例如:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二、配置网关路由
在application.yml
中配置路由,例如将请求转发到不同的微服务:
spring:
cloud:
gateway:
routes:
- id: service1
uri: http://localhost:8081
predicates:
- Path=/service1/**
- id: service2
uri: http://localhost:8082
predicates:
- Path=/service2/**
这里配置了两个路由,当请求路径为/service1/**
时,会转发到http://localhost:8081
;当请求路径为/service2/**
时,转发到http://localhost:8082
。
三、实现全局拦截器
全局拦截器用于对所有进来的请求进行统一处理,例如记录请求日志或进行身份验证。我们可以通过实现GlobalFilter
接口来创建全局拦截器。
下面是一个简单的全局拦截器示例:
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.RewritePathGatewayFilterFactory;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class GlobalLoggingFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilter chain) {
// 记录请求路径
String path = exchange.getRequest().getURI().getPath();
System.out.println("Received request for path: " + path);
// 可以在此处添加认证等逻辑
// 继续处理请求
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 记录响应状态码
int statusCode = exchange.getResponse().getStatusCode().value();
System.out.println("Response status code: " + statusCode);
}));
}
}
在这个全局拦截器中,我们记录了请求的路径和响应的状态码。通过实现filter
方法,我们可以在请求处理的不同阶段插入自定义逻辑。
四、启动应用
最后,启动Spring Boot应用。在代码中完成了全局拦截器的实现,同时配置了网关的基本路由。在启动后,访问http://localhost:8080/service1/
或http://localhost:8080/service2/
,就会看到请求经过了网关,并触发了全局拦截器。
总结
通过本文,我们简单地介绍了如何利用Spring Cloud Gateway构建API网关并配置全局拦截器。全局拦截器不仅可以帮助我们记录日志、进行身份验证,还可以实现更复杂的请求处理逻辑。Spring Cloud Gateway的灵活性使得开发者可以轻松应对微服务架构中的各种挑战。