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

The following describes an alternative style gateway. None of the prior documentation applies to what follows.

Spring Cloud Gateway 提供了一个名为 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();
    }

}

Spring 框架上的便捷方法ProxyExchange可让处理程序方法发现并增强传入请求的 URI 路径。例如,您可能需要提取路径的尾随元素以将其传递给下游: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 的功能都可用于网关处理方法。 因此,您可以注入请求头和查询参数,例如,并可通过映射注解中的声明来约束传入请求。 有关这些功能的更多详情,请参见 Spring MVC 中 @RequestMapping 的文档。spring-doc.cadn.net.cn

你可以通过在 header() 上使用方法向下游响应添加头信息 ProxyExchangespring-doc.cadn.net.cn

你还可以通过向get()方法(以及其他方法)添加映射器来操作响应头(以及您想要的任何内容)。 映射器是将传入的ResponseEntity转换为出站对象的Functionspring-doc.cadn.net.cn

提供对“敏感”标头(默认值为 0 和 1)的第一类支持,这些标头不会传递到下游,并且提供对“代理”(2)标头的支持。spring-doc.cadn.net.cn