Java ルート API

Spring Cloud Gateway サーバー MVC は、ルートを作成するデフォルトの方法として Spring WebMvc.fn RouterFunctions.Builder (Javadoc) を使用します。これは、WebMvc.fn RouterFunction (Javadoc) インスタンスです。

RouterFunctions.Builder (Javadoc) インスタンスは、RouterFunctions.route() (Javadoc) を呼び出すことによって取得されます。

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 には、上記の /get など、パス述語と組み合わせた各 HTTP メソッド (GET、POST など) のメソッドがあります。最後のパラメーターは HandlerFilterFunction で、この場合は HandlerFunctions.http() です。追加の RequestPredicate パラメーター用の各 HTTP メソッドのオーバーロードされたメソッドと、一般的に使用される汎用の route(RequestPredicate, HandlerFunction) メソッドがあります。

RouterFunctions.Builder のゲートウェイ MVC 実装

一部の高度なフィルターでは、属性をリクエストするためにメタデータを追加する必要があります。これに対応するために、org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions クラスがあります。次に、GatewayRouterFunctions.route(String routeId) creates a `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();
    }
}

ゲートウェイ MVC ハンドラー関数

様々な RouterFunctions.Builder メソッドは HandlerFunction<ServerResponse> を必要とします。MVC ゲートウェイによってプロキシされるルートを作成するために、HandlerFunction 実装は org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions で提供されます。

HTTP ハンドラー関数

最も基本的なハンドラー関数は http() または HandlerFunction です。パラメーターとして URI が指定された場合、これは HTTP リクエストの送信先として使用される URI です(上記の例を参照)。パラメーターが渡されない場合、この関数は 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 リクエスト属性の処理における不整合が修正されます。

Spring Cloud Function ハンドラー関数

Spring Cloud Function をクラスパスに配置すると、Spring Cloud Gateway は Bean として定義した関数を呼び出すためのルートを自動的に設定します。関数の Bean 名がルートのパスとして使用されます。

例: 次の構成があるとします。

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-function-context</artifactId>
</dependency>

Spring Cloud Function 依存関係が提供されると、Java 関数 Bean の名前が、関数へのルーティングに使用できるパスになります。

例: 次のアプリケーションを想定します。

@SpringBootApplication
public class DemoFunctionGatewayApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoFunctionGatewayApplication.class, args);
	}


	@Bean
	public Function<String, String> uppercase() {
		return v -> v.toUpperCase();
	}

	@Bean
	public Function<String, String> concat() {
		return v -> v + v;
	}
}

/concat または /uppercase に GET または POST リクエストを発行することにより、concat または uppercase 機能を呼び出すことができます。

`http://localhost:8080/uppercase/hello に GET リクエストを行うと、文字列 hello を使用して uppercase 関数が呼び出され、GET レスポンス本文に HELLO が返されます。

関数パラメーターをパスパラメーターとして渡す代わりに、POST リクエストを使用できます。たとえば、次の cURL コマンドを発行して concat 関数を呼び出すことができます。

$ curl -d ‘"hello"' -H "Content-Type: application/json" -X POST http://localhost:8080/concat

レスポンス本体には hellohello が含まれます。

Spring Cloud Gateway は、カンマで区切られた関数名からなるパスへのリクエストを発行することで、関数合成もサポートしています。例:

$ curl -d ‘"hello"' -H "Content-Type: application/json" -X POST http://localhost:8080/concat,uppercase

レスポンス本体には HELLOHELLO が含まれます。