Java Routes API

Spring Cloud Gateway Server MVC uses the Spring WebMvc.fn RouterFunctions.Builder as the default way to create Routes, which are WebMvc.fn RouterFunction instances.

A RouterFunctions.Builder instance is obtained by calling RouterFunctions.route()

GatewaySampleApplication.java
import static org.springframework.web.servlet.function.RouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;

class SimpleGateway {
    @Bean
    public RouterFunction<ServerResponse> getRoute() {
        return route().GET("/get", http("https://httpbin.org")).build();
    }
}

There are methods in RouterFunctions.Builder for each HTTP methods (GET, POST, etc…​) combined with a path predicate, such as /get as above. The final parameter is the HandlerFilterFunction, in this case HandlerFunctions.http(). There are overloaded methods for each HTTP method for additional RequestPredicate parameters as well as a generic route(RequestPredicate, HandlerFunction) method for general use.

Gateway MVC implementation of RouterFunctions.Builder

Some advanced filters require some metadata to be added to request attributes. To accommodate this, there is a org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions class. GatewayRouterFunctions.route(String routeId) creates a `RouterFunctions.Builder instance then adds a 'before' filter to add the routeId as request metadata.

GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;

class SimpleGateway {
    @Bean
    public RouterFunction<ServerResponse> getRoute() {
        return route("simple_route").GET("/get", http("https://httpbin.org")).build();
    }
}

Gateway MVC Handler Functions

Various RouterFunctions.Builder methods require a HandlerFunction<ServerResponse>. To create a route that is proxied by the MVC Gateway, HandlerFunction implementations are supplied in org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions. The most basic is the http() HandlerFunction. If a URI is supplied as a parameter, that is the URI used as the downstream target for sending the HTTP requests (as seen in the example above). If no parameter is passed, the function looks for a URI in the org.springframework.cloud.gateway.server.mvc.common.MvcUtils.GATEWAY_REQUEST_URL_ATTR request attribute. This allows for dynamic targets such as load balancing to set the URI.