118. Configuration

Spring Cloud Gateway 的配置由 RouteDefinitionLocator 的集合驱动。

RouteDefinitionLocator.java.

public interface RouteDefinitionLocator {
	Flux<RouteDefinition> getRouteDefinitions();
}

默认情况下,PropertiesRouteDefinitionLocator使用 Spring Boot 的@ConfigurationProperties机制加载属性。

上面的所有配置示例都使用一种快捷方式符号,该快捷方式符号使用位置参数而不是命名参数。以下两个示例是等效的:

application.yml.

spring:
  cloud:
    gateway:
      routes:
      - id: setstatus_route
        uri: http://example.org
        filters:
        - name: SetStatus
          args:
            status: 401
      - id: setstatusshortcut_route
        uri: http://example.org
        filters:
        - SetStatus=401

对于网关的某些用法,属性将是足够的,但是某些生产用例将受益于从外部源(例如数据库)加载配置。Future 的里程碑版本将基于 Spring Data Repository 提供RouteDefinitionLocator实现,例如 Redis,MongoDB 和 Cassandra。

118.1 Fluent Java Routes API

为了在 Java 中进行简单配置,在RouteLocatorBuilder bean 中定义了一个流畅的 API。

GatewaySampleApplication.java.

// static imports from GatewayFilters and RoutePredicates
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder, ThrottleGatewayFilterFactory throttle) {
    return builder.routes()
            .route(r -> r.host("**.abc.org").and().path("/image/png")
                .filters(f ->
                        f.addResponseHeader("X-TestHeader", "foobar"))
                .uri("http://httpbin.org:80")
            )
            .route(r -> r.path("/image/webp")
                .filters(f ->
                        f.addResponseHeader("X-AnotherHeader", "baz"))
                .uri("http://httpbin.org:80")
            )
            .route(r -> r.order(-1)
                .host("**.throttle.org").and().path("/get")
                .filters(f -> f.filter(throttle.apply(1,
                        1,
                        10,
                        TimeUnit.SECONDS)))
                .uri("http://httpbin.org:80")
            )
            .build();
}

此样式还允许更多自定义谓词 assert。 RouteDefinitionLocator bean 定义的谓词使用逻辑and组合。通过使用流畅的 Java API,您可以在Predicate类上使用and()or()negate()运算符。

118.2 DiscoveryClient 路由定义定位器

可以将网关配置为基于在DiscoveryClient兼容服务注册表中注册的服务来创建路由。

要启用此功能,请设置spring.cloud.gateway.discovery.locator.enabled=true并确保DiscoveryClient实现在 Classpath 上并已启用(例如 Netflix Eureka,Consul 或 Zookeeper)。

118.2.1 为 DiscoveryClient 路由配置谓词和filter

默认情况下,网关为通过DiscoveryClient创建的路由定义单个谓词和filter。

默认谓词是使用模式/serviceId/**定义的路径谓词,其中serviceIdDiscoveryClient中服务的 ID。

默认filter是带有正则表达式/serviceId/(?<remaining>.*)和替代/${remaining}的重写路径filter。这只是在将请求发送到下游之前从路径中剥离服务 ID。

如果您想自定义DiscoveryClient路由所使用的谓词和/或filter,可以通过设置spring.cloud.gateway.discovery.locator.predicates[x]spring.cloud.gateway.discovery.locator.filters[y]来实现。这样做时,如果要保留该功能,则需要确保在上面包含默认谓词和filter。以下是其外观的示例。

application.properties.

spring.cloud.gateway.discovery.locator.predicates[0].name: Path
spring.cloud.gateway.discovery.locator.predicates[0].args[pattern]: "'/'+serviceId+'/**'"
spring.cloud.gateway.discovery.locator.predicates[1].name: Host
spring.cloud.gateway.discovery.locator.predicates[1].args[pattern]: "'**.foo.com'"
spring.cloud.gateway.discovery.locator.filters[0].name: Hystrix
spring.cloud.gateway.discovery.locator.filters[0].args[name]: serviceId
spring.cloud.gateway.discovery.locator.filters[1].name: RewritePath
spring.cloud.gateway.discovery.locator.filters[1].args[regexp]: "'/' + serviceId + '/(?<remaining>.*)'"
spring.cloud.gateway.discovery.locator.filters[1].args[replacement]: "'/${remaining}'"