使用 Spring Web MVC 或 WebFlux 的代理交換閘道器
| 以下描述了一種替代風格的閘道器。Spring Cloud Gateway Server 的任何文件都不適用於以下內容。 |
如何引入 Spring Cloud Gateway 代理交換
要在您的專案中包含 Spring Cloud Gateway 代理交換,對於 MVC 代理交換,請使用 Group ID 為 org.springframework.cloud 且 Artifact ID 為 spring-cloud-gateway-proxyexchange-webmvc 的構件。對於 WebFlux 代理交換,請使用 Group ID 為 org.springframework.cloud 且 Artifact ID 為 spring-cloud-gateway-proxyexchange-webflux 的構件。
有關使用當前的 Spring Cloud Release Train 設定構建系統的詳細資訊,請參閱 Spring Cloud 專案頁面。
使用代理交換
Spring Cloud Gateway 提供了一個名為 ProxyExchange 的實用物件。您可以將其作為方法引數在常規 Spring Web 處理器中使用。它透過映象 HTTP 動詞的方法支援基本的下游 HTTP 交換。對於 MVC,它還透過 forward() 方法支援轉發到本地處理器。要使用 ProxyExchange,請在您的類路徑中包含正確的模組(spring-cloud-gateway-proxyexchange-webmvc 或 spring-cloud-gateway-proxyexchange-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();
}
}
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 的文件。
您可以使用 ProxyExchange 上的 header() 方法將頭新增到下游響應。
您還可以透過向 get() 方法(和其他方法)新增對映器來操作響應頭(以及響應中您喜歡的任何其他內容)。對映器是一個 Function,它接受傳入的 ResponseEntity 並將其轉換為傳出的 ResponseEntity。
對“敏感”頭(預設為 cookie 和 authorization)和“跳過”頭(預設為 content-length 和 host)提供了第一類支援,這些頭不會傳遞到下游,並且對“代理”(x-forwarded-*)頭也提供了支援。“跳過”頭的想法是,當複製到下游請求時,它們可能會導致問題。例如:由於 ProxyExchange 呼叫下游端點的方式,內容的長度可能已經改變,甚至可能使用 Transfer-Encoding: chunked 而不是 Content-Length 頭。