在现代微服务架构中,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中文网其他相关文章!