Spring Cloud Gateway 是一个基于 Spring 生态的网关框架,用于构建微服务架构中的API网关。它可以对请求进行路由、过滤、限流等操作,是Spring Cloud微服务体系中常用的组件之一。下面介绍 Spring Cloud Gateway 的核心概念、应用场景以及简单的示例。
Spring Cloud Gateway的核心概念
-
Route(路由):
- 路由是网关的核心组成部分,定义了请求的转发规则。每个路由都由一个ID、目标URI、Predicates(断言)和Filters(过滤器)组成。
- 断言用来判断请求是否匹配该路由,过滤器用来对请求进行处理或修改。
-
Predicate(断言):
- 断言是基于请求的特定条件进行判断的功能组件。Spring Cloud Gateway 提供了丰富的断言工厂,比如根据请求路径、请求头、查询参数等进行匹配。
- 常用的断言包括
Path
、Host
、Method
、Query
等。
-
Filter(过滤器):
- 过滤器可以在请求被路由到目标服务之前或之后进行某些处理。比如权限验证、请求日志记录、限流等。
- Spring Cloud Gateway 支持两类过滤器:全局过滤器(对所有路由生效)和局部过滤器(只对特定路由生效)。
Spring Cloud Gateway的应用场景
-
请求路由与负载均衡:
- 将请求根据路径或其他条件路由到不同的微服务,并与负载均衡组件(如Spring Cloud LoadBalancer)结合,分发请求到多个服务实例。
-
API限流与安全:
- 可以通过过滤器实现对接口的限流,防止过多请求涌入后端服务。
- 结合OAuth 2.0或JWT等方式进行认证与鉴权,确保只有合法用户能够访问内部服务。
-
日志与监控:
- 通过全局过滤器可以实现请求日志的记录。
- 可以与监控系统(如Prometheus、Grafana)结合,实现对网关流量、健康状况的监控。
-
缓存和请求头修改:
- 对于某些不需要实时刷新的接口,可以通过缓存来减少对后端服务的请求压力。
- 修改请求头或响应头,如增加特定的安全性标志或调试信息。
Spring Cloud Gateway 简单示例
假设我们有多个微服务,分别处理不同的业务需求。我们可以通过 Spring Cloud Gateway 路由请求到不同的服务。
1. 添加依赖
在 pom.xml
中添加 Spring Cloud Gateway 的依赖:
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
确保 Spring Cloud 的版本管理:
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version> <!-- 选择适合的Spring Cloud版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. 简单路由配置
在 application.yml
中配置一个简单的路由,将请求 /service-a/**
路由到服务A:
yaml
spring:
cloud:
gateway:
routes:
- id: service-a
uri: http://localhost:8081
predicates:
- Path=/service-a/**
- id: service-b
uri: http://localhost:8082
predicates:
- Path=/service-b/**
这个配置表示:
- 当用户访问
/service-a/**
路径时,Spring Cloud Gateway 会将请求转发到http://localhost:8081
的微服务实例。 - 同样,访问
/service-b/**
路由时会转发到另一个服务http://localhost:8082
。
3. 基于断言与过滤器的复杂路由
我们可以添加更多的断言和过滤器,例如根据请求的头信息路由,或者实现限流。
yaml
spring:
cloud:
gateway:
routes:
- id: service-c
uri: http://localhost:8083
predicates:
- Path=/service-c/**
- Header=X-Request-Id, \d+ # 根据请求头X-Request-Id判断是否路由
filters:
- AddRequestHeader=X-Gateway, MyGateway # 在请求中添加一个头信息
- AddResponseHeader=X-Response-Time, '#{T(java.time.LocalTime).now()}' # 在响应中添加处理时间
- RequestRateLimiter=key-resolver=#{@myKeyResolver}, redis-rate-limiter.replenishRate=10, redis-rate-limiter.burstCapacity=20 # 限流
上述配置表示:
- 请求路径是
/service-c/**
并且请求头X-Request-Id
是数字格式的情况下,转发到localhost:8083
。 - 在请求头中添加
X-Gateway
,并在响应头中添加当前时间。 - 使用 Redis 实现限流,每秒最多允许10个请求,并且最多可以瞬时处理20个请求。
4. 全局过滤器
除了在特定路由中配置过滤器,还可以添加全局过滤器,处理所有经过网关的请求。全局过滤器可以在Java代码中定义:
java
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import org.springframework.web.server.ServerWebExchange;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component
public class LoggingFilter implements GlobalFilter {
private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class);
@Override
public Mono<Void> filter(ServerWebExchange exchange, org.springframework.cloud.gateway.filter.GatewayFilterChain chain) {
logger.info("Request URI: " + exchange.getRequest().getURI());
return chain.filter(exchange);
}
}
总结
Spring Cloud Gateway 是一个强大的API网关解决方案,能够有效地处理微服务架构中的请求路由、限流、安全、日志等任务。通过断言和过滤器的灵活配置,你可以根据业务需求自定义各种路由策略,实现高效、可扩展的微服务网关系统。