首页 >Java >java教程 >使用 Spring Cloud Gateway 构建简单的 API 网关

使用 Spring Cloud Gateway 构建简单的 API 网关

Patricia Arquette
Patricia Arquette原创
2024-11-03 12:14:02543浏览

在现代微服务架构中,API 网关至关重要。它为多个服务提供单一入口点,使我们能够管理路由、安全、速率限制、负载平衡等等。在本文中,我们将探索如何使用 Spring Cloud Gateway 设置基本的 API 网关,并根据路径将请求定向到不同的端点。我们还将演示如何使用过滤器动态操作路径。

让我们深入研究代码!

Building a Simple API Gateway with Spring Cloud Gateway

哦不!!

先决条件

要跟随,您需要:

  • Java 11 或更高版本
  • Spring Boot(推荐3.0或更高版本)
  • 响应式 Spring Cloud Gateway

项目设置

创建一个新的 Spring Boot 项目并包含 Spring Cloud Gateway 依赖项。您可以通过在 Spring Initializr 上设置一个新项目,在依赖项下选择 Spring BootReactive 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>

构建 API 网关

让我们配置网关来处理三个不同路径的请求:

  1. /get/country/{name} – 获取有关国家/地区的详细信息。
  2. /get/language/{name} – 根据语言获取信息。
  3. /get/subregion/{name} – 检索特定子区域的数据。

“我们将使用 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 的好处

  1. 单一入口点:所有请求都通过网关,简化客户端交互和 API 管理。
  2. 灵活路由:可以使用路径参数和过滤器轻松自定义路由。
  3. 动态路径重写:网关允许我们动态调整请求路径,无需更改客户端代码即可轻松与外部 API 集成。

下一步

此设置涵盖了 Spring Cloud Gateway 路由的基础知识。在接下来的文章中,我们将探索其他功能,例如:

  • 身份验证和授权 – 通过与 OAuth 或 JWT 集成来保护路由。
  • 速率限制和断路器 – 使用内置过滤器增加弹性。
  • 负载平衡 – 在多个实例之间分配请求以获得更好的性能。
  • 日志记录和可观察性 – 深入了解应用程序行为和性能,并通过分布式跟踪和集中式日志记录监控流量模式。

?参考

  • Spring 云网关
  • 构建网关

?跟我说话

  • 领英
  • Github
  • 投资组合

以上是使用 Spring Cloud Gateway 构建简单的 API 网关的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn