20. 通过使用 Spring MVC 或 Webflux 构建一个简单的网关

以下介绍了一种替代风格的网关。之前的相关文件都不适用于接下来的内容。

Spring Cloud Gateway 提供了一个名为代理交换. 你可以在普通的 Spring Web handler 里把它当作方法参数使用。 它支持通过镜像HTTP动词的方法进行基本的下游HTTP交换。 MVC 还支持通过forward()方法。 使用代理交换,在你的类路径中包含正确的模块(或Spring-Cloud-gateway-mvcSpring-Cloud-Gateway-WebFlux).spring-doc.cadn.net.cn

以下 MVC 示例代理请求至/测试下游到远程服务器:spring-doc.cadn.net.cn

@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 做了同样的作:spring-doc.cadn.net.cn

@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路径。 例如,你可能想提取路径的尾部元素,使其下游:spring-doc.cadn.net.cn

@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 的所有功能都可供网关处理方法使用。 因此,你可以注入请求头和查询参数,并且可以通过映射注释中的声明约束来请求。 请参阅相关文档@RequestMapping春季MVC将获取更多相关细节。spring-doc.cadn.net.cn

你可以通过使用头部()方法代理交换.spring-doc.cadn.net.cn

你还可以通过在get()方法(以及其他方法)。 映射器是功能那就拿走了来的响应实体并将其转换为外出电。spring-doc.cadn.net.cn

为“敏感”头提供一流支持(默认情况下,饼干授权),这些不被下游传递,对于“代理”(转发-*) 头部。spring-doc.cadn.net.cn