Spring Cloud Gateway 是一个基于 Spring Boot 2.x 和 Spring WebFlux 的 API 网关。它提供了统一的 API 管理入口,支持请求路由、限流、日志记录、安全控制等功能。本文将介绍 Spring Cloud Gateway 的架构和核心组件,并给出示例说明。
架构
Spring Cloud Gateway 的架构如下图所示:
代码语言:javascript复制 ------------------------
| Spring WebFlux App |
------------------------
|
v
------------------------
| Gateway Handler |
| (处理请求的核心组件) |
------------------------
|
v
------------------------
| Gateway Filter Chain |
| (处理请求前后的过滤器) |
------------------------
|
v
------------------------
| Upstream HTTP Server |
| (被代理的后端服务) |
------------------------
Spring Cloud Gateway 的核心组件包括 Gateway Handler 和 Gateway Filter Chain 两部分。其中,Gateway Handler 是处理请求的核心组件,负责路由、限流、日志记录、安全控制等功能,而 Gateway Filter Chain 则是处理请求前后的过滤器。
核心组件
Gateway Handler
Gateway Handler 是处理请求的核心组件,负责将请求转发到对应的后端服务,并对请求进行处理。Gateway Handler 的处理流程如下:
- 根据请求的 URI 和配置的路由规则,将请求转发到对应的后端服务。
- 对请求进行预处理,例如添加请求头、请求参数、修改请求体等操作。
- 将请求转发到后端服务。
- 对后端服务返回的响应进行处理,例如修改响应头、响应体等操作。
- 返回响应。
下面是一个简单的 Gateway Handler 的示例代码:
代码语言:javascript复制@Component
public class MyGatewayHandler implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// 根据 URI 和路由规则,将请求转发到对应的后端服务
URI uri = exchange.getRequest().getURI();
URI newUri = URI.create("http://backend-service" uri.getPath());
ServerHttpRequest request = exchange.getRequest().mutate().uri(newUri).build();
// 对请求进行预处理
HttpHeaders headers = request.getHeaders();
headers.add("X-Forwarded-For", exchange.getRequest().getRemoteAddress().toString());
headers.add("X-Forwarded-Proto", "https");
// 转发请求到后端服务
ClientHttpConnector connector = new ReactorClientHttpConnector();
WebClient client = WebClient.builder().clientConnector(connector).build();
return client.method(request.getMethod())
.uri(request.getURI())
.headers(httpHeaders -> httpHeaders.addAll(headers))
.body(BodyInserters.fromPublisher(exchange.getRequest().getBody(), DataBuffer.class))
.exchange()
.flatMap(clientResponse -> {
// 对后端服务返回的响应进行处理
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(clientResponse.statusCode());
response.getHeaders().addAll(clientResponse.headers().asHttpHeaders());
return response.writeAndFlushWith(clientResponse.bodyToFlux(DataBuffer.class));
});
}
}
在这个示例代码中,我们实现了一个简单的 Gateway Handler,它将请求转发到名为 backend-service
的后端服务,并添加了一些请求头信息。具体来说,我们通过 WebClient
将请求转发到后端服务,并在 flatMap
中对返回的响应进行处理,然后将处理后的响应返回给客户端。