跳到主要内容

Gateway核心概念

Spring Cloud Gateway 是一个基于 Spring 5、Spring Boot 2 和 Project Reactor 的 API 网关。它为微服务架构提供了一种简单而有效的方式来路由请求、处理跨域问题、实现负载均衡以及执行其他常见的网关功能。本文将详细介绍 Spring Cloud Gateway 的核心概念,帮助初学者快速上手。

什么是API网关?

API 网关是微服务架构中的一个关键组件,它充当所有客户端请求的入口点。API 网关的主要职责包括:

  • 路由:将请求转发到正确的微服务。
  • 过滤:在请求到达目标服务之前或之后执行某些操作,例如身份验证、日志记录等。
  • 负载均衡:将请求分发到多个服务实例,以提高系统的可用性和性能。
  • 安全性:提供身份验证和授权功能,保护后端服务。

Spring Cloud Gateway 的核心概念

1. 路由(Route)

路由是 Spring Cloud Gateway 的核心概念之一。它定义了如何将请求从客户端转发到后端服务。每个路由通常包含以下信息:

  • ID:路由的唯一标识符。
  • URI:目标服务的地址。
  • 断言(Predicate):用于匹配请求的条件。
  • 过滤器(Filter):在请求到达目标服务之前或之后执行的逻辑。

以下是一个简单的路由配置示例:

yaml
spring:
cloud:
gateway:
routes:
- id: user_service_route
uri: http://localhost:8081
predicates:
- Path=/user/**
filters:
- AddRequestHeader=X-Request-User, User-Service

在这个例子中,所有以 /user 开头的请求都会被转发到 http://localhost:8081,并且在请求头中添加 X-Request-User 字段。

2. 断言(Predicate)

断言用于匹配请求的条件。Spring Cloud Gateway 提供了多种内置的断言类型,例如:

  • Path:匹配请求路径。
  • Method:匹配请求方法(GET、POST 等)。
  • Header:匹配请求头。
  • Query:匹配查询参数。

以下是一个使用 Path 断言的示例:

yaml
predicates:
- Path=/user/**

这个断言表示所有以 /user 开头的请求都会被匹配。

3. 过滤器(Filter)

过滤器用于在请求到达目标服务之前或之后执行某些操作。Spring Cloud Gateway 提供了多种内置的过滤器类型,例如:

  • AddRequestHeader:在请求头中添加字段。
  • AddResponseHeader:在响应头中添加字段。
  • RewritePath:重写请求路径。
  • Retry:在请求失败时重试。

以下是一个使用 AddRequestHeader 过滤器的示例:

yaml
filters:
- AddRequestHeader=X-Request-User, User-Service

这个过滤器会在请求头中添加 X-Request-User 字段,并将其值设置为 User-Service

4. 全局过滤器(Global Filter)

全局过滤器应用于所有路由,而不需要显式配置。它们通常用于实现跨路由的通用逻辑,例如身份验证、日志记录等。

以下是一个简单的全局过滤器示例:

java
@Component
public class LoggingGlobalFilter implements GlobalFilter {

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("Request received: " + exchange.getRequest().getURI());
return chain.filter(exchange);
}
}

这个过滤器会在每个请求到达时打印请求的 URI。

实际应用场景

场景 1:路由请求到不同的微服务

假设你有两个微服务:user-serviceorder-service。你可以使用 Spring Cloud Gateway 将请求路由到不同的服务:

yaml
spring:
cloud:
gateway:
routes:
- id: user_service_route
uri: http://localhost:8081
predicates:
- Path=/user/**
- id: order_service_route
uri: http://localhost:8082
predicates:
- Path=/order/**

在这个配置中,所有以 /user 开头的请求会被路由到 user-service,而以 /order 开头的请求会被路由到 order-service

场景 2:实现身份验证

你可以使用全局过滤器来实现身份验证逻辑:

java
@Component
public class AuthGlobalFilter implements GlobalFilter {

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || !isValidToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}

private boolean isValidToken(String token) {
// 实现验证逻辑
return true;
}
}

这个过滤器会检查请求头中的 Authorization 字段,如果无效则返回 401 状态码。

总结

Spring Cloud Gateway 是一个功能强大的 API 网关,它通过路由、断言和过滤器等核心概念,帮助开发者轻松构建高效的微服务架构。通过本文的介绍,你应该已经掌握了 Spring Cloud Gateway 的基本用法,并能够在实际项目中应用这些概念。

附加资源

练习

  1. 创建一个 Spring Cloud Gateway 项目,并配置两个路由,分别指向不同的微服务。
  2. 实现一个全局过滤器,记录每个请求的响应时间。
  3. 使用 RewritePath 过滤器,将 /api/v1/** 的请求重写为 /v1/**

通过完成这些练习,你将进一步巩固对 Spring Cloud Gateway 的理解。