使用 Spring Web MVC 或 WebFlux 的代理交换网关

以下描述了一种替代风格的网关。Spring Cloud Gateway Server 的任何文档都不适用于以下内容。

如何引入 Spring Cloud Gateway 代理交换

要在您的项目中包含 Spring Cloud Gateway 代理交换,对于 MVC 代理交换,请使用 Group ID 为 org.springframework.cloud 且 Artifact ID 为 spring-cloud-gateway-proxyexchange-webmvc 的构件。对于 WebFlux 代理交换,请使用 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-webmvcspring-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

对“敏感”头(默认为 cookieauthorization)和“跳过”头(默认为 content-lengthhost)提供了第一类支持,这些头不会传递到下游,并且对“代理”(x-forwarded-*)头也提供了支持。“跳过”头的想法是,当复制到下游请求时,它们可能会导致问题。例如:由于 ProxyExchange 调用下游端点的方式,内容的长度可能已经改变,甚至可能使用 Transfer-Encoding: chunked 而不是 Content-Length 头。

© . This site is unofficial and not affiliated with VMware.