Java 路由 API
Spring Cloud Gateway Server MVC 使用 Spring WebMvc.fn RouterFunctions.Builder
作為建立路由的預設方式,這些路由是 WebMvc.fn RouterFunction
例項。
透過呼叫 RouterFunctions.route()
獲取一個 RouterFunctions.Builder
例項
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
新增為請求元資料。
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 請求屬性時的一致性問題。 |