18. 使用 Spring MVC 或 Webflux 构建一个简单的网关

下面介绍了另一种样式的网关。前面的文档均不适用于以下内容。

Spring Cloud 网关提供了一个名为ProxyExchange. 你可以在常规的 Spring Web 处理程序中将其用作方法参数。 它通过镜像 HTTP 动词的方法支持基本的下游 HTTP 交换。 使用 MVC,它还支持通过forward()方法。 要使用ProxyExchange,在类路径中包含正确的模块(或者spring-cloud-gateway-mvcspring-cloud-gateway-webflux).spring-doc.cadn.net.cn

以下 MVC 示例将请求代理到/test下游到远程服务器:spring-doc.cadn.net.cn

@RestController
@SpringBootApplication
public class GatewaySampleApplication {

    @Value("${remote.home}")
    private URI home;

    @GetMapping("/test")
    public ResponseEntity<?> proxy(ProxyExchange<byte[]> proxy) throws Exception {
        return proxy.uri(home.toString() + "/image/png").get();
    }

}

以下示例对 Webflux 执行相同的作:spring-doc.cadn.net.cn

@RestController
@SpringBootApplication
public class GatewaySampleApplication {

    @Value("${remote.home}")
    private URI home;

    @GetMapping("/test")
    public Mono<ResponseEntity<?>> proxy(ProxyExchange<byte[]> proxy) throws Exception {
        return proxy.uri(home.toString() + "/image/png").get();
    }

}

Convenience 方法。ProxyExchange启用 handler 方法以发现和增强传入请求的 URI 路径。 例如,您可能希望提取 path 的尾随元素以将它们传递到下游:spring-doc.cadn.net.cn

@GetMapping("/proxy/path/**")
public ResponseEntity<?> proxyPath(ProxyExchange<byte[]> proxy) throws Exception {
  String path = proxy.path("/proxy/path/");
  return proxy.uri(home.toString() + "/foos/" + path).get();
}

Spring MVC 和 Webflux 的所有功能都可用于网关处理程序方法。 因此,例如,您可以注入请求标头和查询参数,并且可以使用 mapping annotation 中的声明来限制传入请求。 请参阅以下文档@RequestMapping在 Spring MVC 中了解这些功能的更多详细信息。spring-doc.cadn.net.cn

您可以使用header()方法ProxyExchange.spring-doc.cadn.net.cn

您还可以通过向get()方法(和其他方法)。 映射器是一个Function这将接收传入的ResponseEntity并将其转换为传出的 URL。spring-doc.cadn.net.cn

为 “sensitive” 标头提供一流的支持(默认情况下,cookieauthorization),它们不会传递到下游,而对于 “proxy” (x-forwarded-*) 标头。spring-doc.cadn.net.cn