在現代微服務架構中,API 閘道至關重要。它為多個服務提供單一入口點,使我們能夠管理路由、安全、速率限制、負載平衡等等。在本文中,我們將探索如何使用 Spring Cloud Gateway 設定基本的 API 網關,並根據路徑將請求定向到不同的端點。我們還將示範如何使用篩選器動態操作路徑。
讓我們深入研究程式碼!
要跟隨,您需要:
建立一個新的 Spring Boot 專案並包含 Spring Cloud Gateway 依賴項。您可以透過在 Spring Initializr 上設定一個新項目,在依賴項下選擇 Spring Boot 和 Reactive Spring Cloud Gateway 來輕鬆完成此操作。
這是 pom.xml 片段:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-contract-stub-runner</artifactId> <scope>test</scope> </dependency> </dependencies>
讓我們設定網關來處理三個不同路徑的請求:
「我們將使用 REST Country API 來模擬我們架構中的其他微服務。」
我在應用程式的主檔案附近建立了一個名為 router 的資料夾。在其中,我們將建立一個名為 Routes.java 的文件,在其中定義路由、配置每個路徑並將篩選器應用於動態直接請求。
package dev.mspilari.api_gateway.router; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class Routes { @Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() .route("country_route", p -> p .path("/get/country/{name}") .filters(f -> f.setPath("/v3.1/name/{name}")) .uri("https://restcountries.com")) .route("language_route", p -> p .path("/get/language/{name}") .filters(f -> f.setPath("/v3.1/lang/{name}")) .uri("https://restcountries.com")) .route("subregion_route", p -> p .path("/get/subregion/{name}") .filters(f -> f.setPath("/v3.1/subregion/{name}")) .uri("https://restcountries.com")) .build(); } }
路線定義:我們使用route方法定義每條路線,該方法採用標識符(例如country_route)和定義路徑的lambda。
路徑匹配:.path("/get/country/{name}") 用於匹配傳入的 URL 模式。 {name} 是一個變量,可以動態替換為任何值,例如“巴西”等國家名稱。
過濾器:我們使用 SetPath 來修改傳出請求路徑。例如, .setPath("/v3.1/name/{name}") 將 /get/country/{name} 改寫為 /v3.1/name/{name},即 REST Country API 所需的端點。
URI:我們將 uri 設定為 https://restcountries.com,作為基本 URL。 Spring Cloud Gateway 會將修改後的路徑傳送至此 URI。
啟動您的 Spring Boot 應用程式。現在,您可以向網關發出請求,它會將它們轉送到正確的端點。
在終端機中嘗試以下指令來測試路由:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-contract-stub-runner</artifactId> <scope>test</scope> </dependency> </dependencies>
網關將根據路徑和參數將每個請求路由到對應的 REST 國家/地區 API 端點。
如果一切配置正確,您應該會看到與直接呼叫 REST 國家/地區 API 所獲得的回應相符的回應。
例如:
package dev.mspilari.api_gateway.router; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class Routes { @Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() .route("country_route", p -> p .path("/get/country/{name}") .filters(f -> f.setPath("/v3.1/name/{name}")) .uri("https://restcountries.com")) .route("language_route", p -> p .path("/get/language/{name}") .filters(f -> f.setPath("/v3.1/lang/{name}")) .uri("https://restcountries.com")) .route("subregion_route", p -> p .path("/get/subregion/{name}") .filters(f -> f.setPath("/v3.1/subregion/{name}")) .uri("https://restcountries.com")) .build(); } }
此設定涵蓋了 Spring Cloud Gateway 路由的基礎知識。在接下來的文章中,我們將探索其他功能,例如:
以上是使用 Spring Cloud Gateway 建立簡單的 API 網關的詳細內容。更多資訊請關注PHP中文網其他相關文章!