Spring Cloud Gateway
特徴
- Spring Framework、Spring Boot と組み合わせて使用
- 様々な要素でルーティングルールを設定
- URLパス
- ヘッダーやクッキーの値
- メソッド(GET、POSTなど)
- 時間(〇時以前、以降など)
- リクエスト、レスポンスの内容をフィルターで書き換え
- サーキットブレーカー、サービスディスカバリ、セキュリティの機能との統合も可能
- WebFluxを用いたノンブロッキング通信により、アクセス増加にも対応
- Netflix から Zuul という類似のライブラリがあるが、WebFlux を用いたときのSpringとの相性問題により、 Spring Cloud Gateway が推奨されてる
使い方
依存関係を追加する。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
RouteLocator
Bean を作成する。
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes().build();
}
全アクセスをルーティング。
builder.routes()
.route("monolith", p -> p
.path("/**")
.uri("http://localhost:8081"))
.build();
パスベースでルーティング
builder.routes()
.route("hello", p -> p
.path("/hello/**")
.uri("http://localhost:8082"))
.route("monolith", p -> p
.path("/**")
.uri("http://localhost:8081"))
.build();
サービスディスカバリとロードバランサを有効にする
依存関係を追加する。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.property に追記する。
spring.cloud.gateway.discovery.locator.enabled=true
内部でRibbonを使用しているため、下記を追記して ReactiveLoadBalancerClientFilter
を代わりに使用するように設定する。
spring.cloud.loadbalancer.ribbon.enabled=false
Spring Cloud Gateway からサービスディスカバリを利用してアクセスするには、lb://[hoge]
でアクセス。
これだけでロードバランサ機能も利用できる。
builder.routes()
.route("hello", p -> p
.path("/hello/**")
.uri("lb://hello"))
サーキットブレーカを有効にする
依存関係を追加する。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
サーキットブレーカフィルターを追加して、有効にする。
.route("hello", p -> p
.path("/hello/**")
.filters(f -> f
.circuitBreaker(c -> c
.setName("myCircuitBreaker")
.setFallbackUri("forward:/fallbackhello")))
.uri("lb://hello"))