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)。