使用 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-webmvcspring-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

對“敏感”頭(預設為 cookieauthorization)和“跳過”頭(預設為 content-lengthhost)提供了第一類支援,這些頭不會傳遞到下游,並且對“代理”(x-forwarded-*)頭也提供了支援。“跳過”頭的想法是,當複製到下游請求時,它們可能會導致問題。例如:由於 ProxyExchange 呼叫下游端點的方式,內容的長度可能已經改變,甚至可能使用 Transfer-Encoding: chunked 而不是 Content-Length 頭。

© . This site is unofficial and not affiliated with VMware.