使用 Spring Web MVC 或 WebFlux 的代理交换网关
以下描述的是另一种风格的网关。Spring Cloud Gateway Server 文档中的内容均不适用于以下描述。
如何包含 Spring Cloud Gateway 代理交换
要在项目中包含 Spring Cloud Gateway Proxy Exchange,对于 MVC Proxy Exchange,请使用 group ID 为 org.springframework.cloud、artifact ID 为 spring-cloud-gateway-proxyexchange-webmvc 的构件。对于 WebFlux Proxy Exchange,请使用 group ID 为 org.springframework.cloud、artifact ID 为 spring-cloud-gateway-proxyexchange-webflux 的构件。
有关使用当前 Spring Cloud Release Train 设置构建系统的详细信息,请参阅 Spring Cloud 项目页面。
使用代理交换
Spring Cloud Gateway 提供了一个名为 ProxyExchange 的实用工具对象。您可以在常规的 Spring Web 处理程序中将其作为方法参数使用。它通过镜像 HTTP 动词的方法支持基本的下游 HTTP 交换。在 MVC 中,它还支持通过 forward() 方法转发到本地处理程序。要使用 ProxyExchange,请在类路径中包含正确的模块(spring-cloud-gateway-proxyexchange-webmvc 或 spring-cloud-gateway-proxyexchange-webflux)。
以下 MVC 示例将 /test 的请求代理到下游的远程服务器:
@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 实现了相同的功能:
@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();
}
}
ProxyExchange 上的便捷方法使处理程序方法能够发现并增强传入请求的 URI 路径。例如,您可能希望提取路径的尾部元素以将其传递到下游:
@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 的文档。
您可以通过在 ProxyExchange 上使用 header() 方法来向下游响应添加头部信息。
你也可以通过向 get() 方法(以及其他方法)添加一个映射器来操作响应头(以及响应中的任何其他内容)。映射器是一个 Function,它接收传入的 ResponseEntity 并将其转换为传出的 ResponseEntity。
对“敏感”头信息(默认为 cookie 和 authorization)和“跳过”头信息(默认为 content-length 和 host)提供了一流的支持,这些头信息不会向下游传递,同时对“代理”头信息(x-forwarded-*)也提供了支持。“跳过”头信息背后的理念是,当它们被复制到下游请求时可能会导致问题。例如:由于 ProxyExchange 调用下游端点的方式,内容长度可能已经改变,甚至可能使用 Transfer-Encoding: chunked 而不是 Content-Length 头信息。