7. Configuration
Prev |  | Next

# 7. Configuration

Configuration for Spring Cloud Gateway is driven by a collection of `RouteDefinitionLocator`s.

RouteDefinitionLocator.java.

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

By default, a `PropertiesRouteDefinitionLocator` loads properties using Spring Boot’s `@ConfigurationProperties` mechanism.

The configuration examples above all use a shortcut notation that uses positional arguments rather than named ones. The two examples below are equivalent:

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

For some usages of the gateway, properties will be adequate, but some production use cases will benefit from loading configuration from an external source, such as a database. Future milestone versions will have `RouteDefinitionLocator` implementations based off of Spring Data Repositories such as: Redis, MongoDB and Cassandra.

## 7.1 Fluent Java Routes API

To allow for simple configuration in Java, there is a fluent API defined in the `Routes` class.

GatewaySampleApplication.java.

    // static imports from GatewayFilters and RoutePredicates
    @Bean
    public RouteLocator customRouteLocator(ThrottleGatewayFilterFactory throttle) {
        return Routes.locator()
                .route("test")
                    .predicate(host("**.abc.org").and(path("/image/png")))
                    .addResponseHeader("X-TestHeader", "foobar")
                    .uri("http://httpbin.org:80")
                .route("test2")
                    .predicate(path("/image/webp"))
                    .add(addResponseHeader("X-AnotherHeader", "baz"))
                    .uri("http://httpbin.org:80")
                .route("test3")
                    .order(-1)
                    .predicate(host("**.throttle.org").and(path("/get")))
                    .add(throttle.apply(tuple().of("capacity", 1,
                         "refillTokens", 1,
                         "refillPeriod", 10,
                         "refillUnit", "SECONDS")))
                    .uri("http://httpbin.org:80")
                .build();
    }

This style also allows for more custom predicate assertions. The predicates defined by `RouteDefinitionLocator` beans are combined using logical `and`. By using the fluent Java API, you can use the `and()`, `or()` and `negate()` operators on the `Predicate` class.

Prev |  | Next
6. Global Filters | Home | 8. Actuator API