122. 使用 Spring MVC 或 Webflux 构建简单网关
Spring Cloud Gateway 提供了一个名为ProxyExchange
的实用程序 object,您可以在常规的 Spring web 处理程序中使用它作为方法参数。它通过镜像 HTTP 谓词的方法支持基本的下游 HTTP 交换。使用 MVC,它还支持通过forward()
方法转发到本地处理程序。要使用ProxyExchange
,只需在 classpath 中包含正确的模块(spring-cloud-gateway-mvc
或spring-cloud-gateway-webflux
)。
MVC example(代理请求“/test”下游到 remote 服务器):
@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 路径。对于 example,您可能希望提取路径的尾随元素以将其传递到下游:
@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 的所有 features 都可用于 Gateway 处理程序方法。因此,您可以 inject 请求 headers 和查询参数,例如,您可以使用映射 annotation 中的声明来约束传入的请求。有关这些 features 的更多详细信息,请参阅 Spring MVC 中@RequestMapping
的文档。
Headers 可以使用ProxyExchange
上的header()
方法添加到下游响应中。
您还可以通过向get()
等方法添加映射器来操作响应_header(以及响应中您喜欢的任何其他内容)。映射器是Function
,它接收传入的ResponseEntity
并将其转换为传出的ResponseEntity
。
第一个 class 支持是为“敏感”headers(默认情况下为“cookie”和“授权”)提供的,它们不向下游传递,也为“proxy”headers(x-forwarded-*
)提供。