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/**
定义的路径谓词,其中serviceId
是DiscoveryClient
中服务的 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}'"