探索新的Spring Cloud Gateway

2023/05/13

1. 概述

在本教程中,我们将探讨Spring Cloud Gateway项目的主要功能,这是一个基于Spring 5、Spring Boot 2和Project Reactor的新API。

该工具提供开箱即用的路由机制,通常用于微服务应用程序,作为将多个服务隐藏在单个外观后面的一种方式。

关于不使用Spring Cloud Gateway项目的网关模式的解释,请查看我们之前的文章。

2. 路由处理程序

专注于路由请求,Spring Cloud Gateway将请求转发到网关处理程序映射(Gateway Handler Mapping),网关处理程序映射决定应该如何处理与特定路由匹配的请求。

让我们从一个快速示例开始,说明网关处理程序如何使用RouteLocator解析路由配置:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("r1", r -> r.host("**.tuyucheng.com")
            .and()
            .path("/tuyucheng")
            .uri("http://tuyucheng.com"))
        .route(r -> r.host("**.tuyucheng.com")
            .and()
            .path("/myOtherRouting")
            .filters(f -> f.prefixPath("/myPrefix"))
            .uri("http://othersite.com")
            .id("myOtherID"))
    .build();
}

请注意我们如何使用此API的主要构建块:

  • Route:网关的主要API。它由给定的标识(ID)、目的地(URI)以及一组谓词和过滤器定义
  • Predicate:Java 8 Predicate—用于使用标头、方法或参数匹配HTTP请求
  • Filter:一个标准的Spring WebFilter

3. 动态路由

就像Zuul一样,Spring Cloud Gateway提供了将请求路由到不同服务的方法。

可以使用纯Java(RouteLocator,如第2节中的示例所示)或使用属性配置来创建路由配置:

spring:
    application:
        name: gateway-service
    cloud:
        gateway:
            routes:
                -   id: tuyucheng
                    uri: tuyucheng.com
                -   id: myOtherRouting
                    uri: localhost:9999

4. 路由工厂

Spring Cloud Gateway使用Spring WebFlux HandlerMapping基础设施匹配路由。

它还包括许多内置的路由谓词工厂。所有这些谓词都匹配HTTP请求的不同属性。多个路由谓词工厂可以通过逻辑“与(and)”组合起来。

路由匹配既可以通过编程方式应用,也可以使用不同类型的路由谓词工厂通过配置属性文件应用。

我们的文章Spring Cloud Gateway路由谓词工厂更详细地探讨了路由工厂。

5. WebFilter工厂

路由筛选器使修改传入HTTP请求或传出HTTP响应成为可能。

Spring Cloud Gateway包括许多内置的WebFilter工厂以及创建自定义过滤器的可能性。

我们的文章Spring Cloud Gateway WebFilter Factories更详细地探讨了WebFilter工厂。

6. Spring Cloud DiscoveryClient支持

Spring Cloud Gateway可以轻松地与服务发现和注册库集成,例如Eureka Server和Consul:

@Configuration
@EnableDiscoveryClient
public class GatewayDiscoveryConfiguration {

    @Bean
    public DiscoveryClientRouteDefinitionLocator discoveryClientRouteLocator(DiscoveryClient discoveryClient) {

        return new DiscoveryClientRouteDefinitionLocator(discoveryClient);
    }
}

6.1 LoadBalancerClient过滤器

LoadBalancerClientFilter使用ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR在交换属性中查找URI。

如果URL具有lb方案(例如lb://tuyucheng-service),它将使用Spring Cloud LoadBalancerClient将名称(即tuyucheng-service)解析为实际主机和端口。

未修改的原始URL放在ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性中。

7. 监控

Spring Cloud Gateway使用Actuator API,这是一个著名的Spring Boot库,它提供了多种开箱即用的服务来监控应用程序。

安装和配置Actuator API后,可以通过访问/gateway/端点来可视化网关监控功能。

8. 实施

现在,我们将创建一个使用Spring Cloud Gateway作为使用路径谓词的代理服务器的简单示例。

8.1 依赖关系

Spring Cloud Gateway目前位于里程碑仓库中,版本为2.0.0.RC2。这也是我们在这里使用的版本。

要添加项目,我们将使用依赖管理系统:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-gateway</artifactId>
            <version>2.0.0.RC2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

接下来,我们将添加必要的依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

8.2 代码实现

现在我们在application.yml文件中创建一个简单的路由配置:

spring:
    cloud:
        gateway:
            routes:
                - id: tuyucheng_route
                  uri: http://tuyucheng.com
                  predicates:
                      - Path=/tuyucheng/
management:
    endpoints:
        web:
            exposure:
                include: "*"

这是网关应用程序代码:

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

应用程序启动后,我们可以访问url http://localhost/actuator/gateway/routes/tuyucheng_route来检查创建的所有路由配置:

{
    "id": "tuyucheng_route",
    "predicates": [
        {
            "name": "Path",
            "args": {
                "_genkey_0": "/tuyucheng"
            }
        }
    ],
    "filters": [],
    "uri": "http://tuyucheng.com",
    "order": 0
}

我们看到相对url “/tuyucheng”被配置为路由。因此,点击url http://localhost/tuyucheng,我们将被重定向到“http://tuyucheng.com”,正如我们示例中所配置的那样。

9. 总结

在本文中,我们探讨了Spring Cloud Gateway的一些功能和组件。这个新的API为网关和代理支持提供开箱即用的工具。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章