118. Configuration

Spring Cloud Gateway 的 Configuration 由RouteDefinitionLocator的集合驱动。

RouteDefinitionLocator.java.

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

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

上面的 configuration 示例都使用了一个使用位置 arguments 而不是命名值的快捷符号。以下两个例子是等效的:

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

对于网关的一些用法,properties 将是足够的,但是一些 production 用例将受益于从外部源(例如数据库)loading configuration。未来的里程碑版本将基于 Spring Data Repositories 具有RouteDefinitionLocator implementations,例如:Redis,MongoDB 和 Cassandra。

118.1 Fluent Java Routes API

为了在 Java 中允许简单的 configuration,在RouteLocatorBuilder bean 中定义了一个 fluent 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();
}

此样式还允许更多自定义谓词断言。 RouteDefinitionLocator beans 定义的谓词使用逻辑and组合。通过使用 fluent Java API,您可以在Predicate class 上使用and()or()negate() operators。

118.2 DiscoveryClient Route 定义定位器

可以将网关配置为基于使用DiscoveryClient兼容服务注册表注册的服务创建 routes。

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