18. 使用 Spring MVC 或 Webflux 构建一个简单的网关
下面介绍了另一种样式的网关。前面的文档均不适用于以下内容。 |
Spring Cloud Gateway 提供了一个名为 的实用程序对象。
你可以在常规的 Spring Web 处理程序中将其用作方法参数。
它通过镜像 HTTP 动词的方法支持基本的下游 HTTP 交换。
使用 MVC,它还支持通过该方法转发到本地处理程序。
要使用 ,请在 Classpath 中包含正确的模块(或 )。ProxyExchange
forward()
ProxyExchange
spring-cloud-gateway-mvc
spring-cloud-gateway-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();
}
}
上的便捷方法使处理程序方法能够发现和增强传入请求的 URI 路径。
例如,您可能希望提取 path 的尾随元素以将它们传递到下游:ProxyExchange
@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 中的声明来限制传入请求。
有关这些功能的更多详细信息,请参见 Spring MVC 中的文档。@RequestMapping
您可以使用 上的方法将标头添加到下游响应中。header()
ProxyExchange
您还可以通过向方法(和其他方法)添加映射器来操作响应标头(以及响应中您喜欢的任何其他内容)。
映射器是一个获取传入并将其转换为传出的映射器。get()
Function
ResponseEntity
为“敏感”头(默认情况下为 and)提供一流的支持,这些头不会传递到下游,以及“proxy” () 头。cookie
authorization
x-forwarded-*