1. 概述

本文将深入探讨Spring Cloud Gateway的核心特性,这是一个基于Spring 6、Spring Boot 3和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("**.baeldung.com")
        .and()
        .path("/baeldung")
        .uri("http://baeldung.com"))
      .route(r -> r.host("**.baeldung.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(如第2节所示的RouteLocator)或属性配置实现:

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

4. 路由工厂

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

它内置了多种路由谓词工厂(Route Predicate Factories),所有这些谓词匹配HTTP请求的不同属性。多个路由谓词工厂可通过逻辑"与"组合使用。

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

关于路由工厂的详细内容,可参考我们的文章Spring Cloud Gateway路由谓词工厂

5. WebFilter工厂

路由过滤器允许修改传入的HTTP请求或传出的HTTP响应。

Spring Cloud Gateway不仅内置了多种WebFilter工厂,还支持创建自定义过滤器。

关于WebFilter工厂的详细内容,可参考我们的文章Spring Cloud Gateway 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://baeldung-service),它将使用Spring Cloud的LoadBalancerClient将服务名(即baeldung-service)解析为实际的主机和端口。

未修改的原始URL会保存在ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR属性中。

7. 监控

Spring Cloud Gateway利用了Spring Boot的Actuator API,这是一个知名库,提供了多种开箱即用的应用监控功能。

安装并配置Actuator API后,可通过访问/gateway/接口查看网关监控特性。

8. 实现示例

现在我们创建一个简单示例,展示如何使用Spring Cloud Gateway作为代理服务器,并基于路径谓词(path predicate)进行路由。

8.1. 依赖项

通过添加spring-cloud-starter-gateway依赖引入项目,它会自动拉取所有必需依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <version>4.1.0</version>
</dependency>

8.2. 代码实现

application.yml中创建简单路由配置:

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

网关应用代码如下:

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

9. 总结

本文探讨了Spring Cloud Gateway的部分核心特性与组件。这个新API为网关和代理支持提供了开箱即用的工具,特别适合微服务架构场景。✅

⚠️ 踩坑提示:配置路由时注意谓词和过滤器的顺序,否则可能导致意外行为。简单粗暴的调试方法是启用Actuator的/gateway/routes接口实时查看路由状态。


原始标题:Exploring the New Spring Cloud Gateway | Baeldung

» 下一篇: Docx4J 介绍