123. 使用 Spring MVC 或 Webflux 构建简单的网关
Spring Cloud Gateway 提供了一个名为ProxyExchange
的 Util 对象,您可以在常规 Spring Web 处理程序中将其用作方法参数。它通过镜像 HTTP 动词的方法支持基本的下游 HTTP 交换。使用 MVC,它还支持通过forward()
方法转发到本地处理程序。要使用ProxyExchange
,只需在 Classpath 中包含正确的模块(spring-cloud-gateway-mvc
或spring-cloud-gateway-webflux
)。
MVC 示例(将请求“代理”到远程服务器的下游“ /测试”):
@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 的所有功能。因此,例如,您可以注入请求 Headers 和查询参数,并且可以使用 Map 注解中的声明来约束传入的请求。有关这些功能的更多详细信息,请参见 Spring MVC 中的@RequestMapping
文档。
可以使用ProxyExchange
上的header()
方法将 Headers 添加到下游响应中。
您还可以通过将 Map 器添加到get()
etc.方法来操纵响应头(以及响应中您喜欢的任何其他内容)。Map 器是Function
,它接收传入的ResponseEntity
并将其转换为传出的ResponseEntity
。
为不传递到下游的“敏感”Headers(默认情况下为“ cookie”和“授权”)以及“代理”Headers(x-forwarded-*
)提供了一流的支持。