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

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

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

流畅的Java Routes API

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

GatewaySampleApplication.java

@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 bean定义的谓词使用逻辑和组合。通过使用流畅的Java API,您可以在Predicate类上使用and(),或()和negate()运算符。

DiscoveryClient Route Definition Locator

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

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

配置DiscoveryClient路由的谓词和过滤器默认情况下,Gateway为通过DiscoveryClient创建的路由定义单个谓词和过滤器。

默认谓词是使用模式/ serviceId / **定义的路径谓词,其中serviceId是DiscoveryClient中服务的id。默认过滤器是重写路径过滤器,其中包含regex /serviceId/(?<remaining>.*)和替换/ $ {remaining}。

这只是在向下游发送请求之前从路径中剥离服务ID。如果您想自定义DiscoveryClient路由使用的谓词和/或过滤器,可以通过设置spring.cloud.gateway.discovery.locator.predicates [x]和spring.cloud.gateway.discovery.locator.filters来实现。Y]。

执行此操作时,如果要保留该功能,则需要确保包含上面的默认谓词和过滤器。下面是一个这样的例子。

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}'"

Reactor Netty Access Logs

要启用Reactor Netty访问日志,请设置-Dreactor.netty.http.server.accessLogEnabled = true。(它必须是Java System属性,而不是Spring Boot属性)。可以将日志记录系统配置为具有单独的访问日志文件。

以下是一个示例logback配置:

logback.xml

<appender name="accessLog" class="ch.qos.logback.core.FileAppender">
        <file>access_log.log</file>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>
    <appender name="async" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="accessLog" />
    </appender>

    <logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false">
        <appender-ref ref="async"/>
    </logger>

CORS配置

网关可以配置为控制CORS行为。“全局”CORS配置是Spring Framework CorsConfiguration的URL模式映射。

spring:
  cloud:
    gateway:
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOrigins: "http://docs.spring.io"
            allowedMethods:
            - GET

在上面的示例中,对于所有GET请求的路径,将允许来自docs.spring.io的请求的CORS请求。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐