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-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();
}
}
Spring 框架上的便捷方法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 的文档。
你可以通过在 header() 上使用方法向下游响应添加头信息 ProxyExchange。
你还可以通过向get()方法(以及其他方法)添加映射器来操作响应头(以及您想要的任何内容)。
映射器是将传入的ResponseEntity转换为出站对象的Function。
提供对“敏感”标头(默认值为 0 和 1)的第一类支持,这些标头不会传递到下游,并且提供对“代理”(2)标头的支持。