LoadBalancer フィルター
LoadBalancer フィルターは serviceId パラメーターを受け取ります。LoadBalancerClient はこれを使用して、ルーティング用のインスタンスを選択します。LoadBalancer フィルターは Java DSL で明示的に使用する必要があります。LoadBalancer フィルターを使用する場合は、org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions で空の http() メソッドを使用します。
import static org.springframework.cloud.gateway.server.mvc.filter.LoadBalancerFilterFunctions.lb;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
@Configuration
class RouteConfiguration {
@Bean
public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader() {
return route("api_route")
.GET("/api/**", http())
.filter(lb("apiservice"))
.build();
}
}構成での LoadBalancer フィルターの使用
LoadBalancer フィルターは、lb スキーム ( lb://myservice など) の URI を使用して構成で使用できます。Spring Cloud LoadBalancerClient を使用して名前 (この例では myservice ) を実際のホストとポートに解決し、同じホストとポート内の URI を置き換えます。属性。次のリストは、LoadBalancer フィルターを構成します。
spring:
cloud:
gateway:
server:
webmvc:
routes:
- id: api_route
uri: lb://apiservice
predicates:
- Path=/api/**lb() フィルターを使用する場合は、setPath() や stripPrefix() などのパスを操作するフィルターの後に配置する必要があります。そうしないと、結果の URL が不正確になる可能性があります。構成内の lb: スキームハンドラーは、フィルターを自動的に最優先順序に配置します。 |
デフォルトでは、ReactorLoadBalancer でサービスインスタンスが見つからない場合、503 が返されます。 |
LoadBalancerClient から返された ServiceInstance の isSecure 値は、ゲートウェイに対するリクエストで指定されたスキームをオーバーライドします。例: リクエストが HTTPS 経由でゲートウェイに入ったが、ServiceInstance が安全ではないことを示した場合、ダウンストリームリクエストは HTTP 経由で行われます。逆の状況も当てはまります。 |
| ゲートウェイは、すべての LoadBalancer 機能をサポートします。Spring Cloud Commons ドキュメントでそれらについてさらに読むことができます。 |
ゲートウェイで @LoadBalanced RestClient を使用しないでください
Spring Cloud Gateway Server MVC は、リクエストのプロキシ処理用に独自の内部 RestClient を作成します。このクライアントには @LoadBalanced のアノテーションを付けてはいけません。ロードバランシングされたルーティングはすべて、ゲートウェイの lb() フィルター(または lb:// URI スキーム)が担当します。
同じアプリケーションコンテキストでカスタム @LoadBalanced RestClient.Builder Bean を定義すると、Spring Cloud LoadBalancer はそのクライアントからのすべての送信リクエスト(ゲートウェイの内部プロキシ呼び出しを含む)をインターセプトし、lb() フィルターがターゲットを解決する前にサービス検出を試みます。その結果、実行時に IllegalArgumentException: Service Instance cannot be null が発生します。
@LoadBalanced は、アプリケーションコードが直接呼び出す RestClient Bean に対してのみ使用してください。ゲートウェイルートについては、負荷分散転送のために lb() フィルターまたは lb:// URI スキームのみを使用してください。