Java 路由 API

Spring Cloud Gateway Server MVC 使用 Spring WebMvc.fn RouterFunctions.Builder 作為建立路由的預設方式,這些路由是 WebMvc.fn RouterFunction 例項。

透過呼叫 RouterFunctions.route() 獲取一個 RouterFunctions.Builder 例項

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

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

RouterFunctions.Builder 中有針對每個 HTTP 方法(GET、POST 等)與路徑謂詞(如上面的 /get)組合的方法。最後一個引數是 HandlerFilterFunction,在此示例中是 HandlerFunctions.http()。對於額外的 RequestPredicate 引數,以及用於一般用途的通用 route(RequestPredicate, HandlerFunction) 方法,每個 HTTP 方法都有過載方法。

RouterFunctions.Builder 的 Gateway MVC 實現

一些高階過濾器需要將一些元資料新增到請求屬性中。為了適應這一點,存在一個 org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions 類。GatewayRouterFunctions.route(String routeId) 建立一個 RouterFunctions.Builder 例項,然後新增一個 'before' 過濾器,將 routeId 新增為請求元資料。

GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.uri;
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())
            .before(uri("https://example.org"))
            .build();
    }
}

Gateway MVC Handler Functions

各種 RouterFunctions.Builder 方法需要一個 HandlerFunction<ServerResponse>。為了建立由 MVC 閘道器代理的路由,org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions 中提供了 HandlerFunction 實現。最基本的是 http() HandlerFunction。該函式會在 org.springframework.cloud.gateway.server.mvc.common.MvcUtils.GATEWAY_REQUEST_URL_ATTR 請求屬性中查詢 URI。這允許動態目標(例如負載均衡)設定 URI

從 4.1.7 版本開始,HandlerFunctions.http(String)HandlerFunctions.http(URI) 已被棄用。請改用 HandlerFunctions.http()BeforeFilterFunctions.uri() 過濾器組合的方式。這解決了處理路由 url 請求屬性時的一致性問題。