目次
AddRequestHeader GatewayFilter ファクトリ
AddRequestHeadersIfNotPresent ゲートウェイ フィルター ファクトリ
AddRequestParameter ゲートウェイフィルター ファクトリ
AddResponseHeader ゲートウェイフィルター ファクトリ
PrefixPath GatewayFilter ファクトリ
StripPrefix GatewayFilter ファクトリ
RewritePath Gatewayフィルター ファクトリ
RequestRateLimiter ゲートウェイフィルター ファクトリ
AddRequestHeader
GatewayFilter
工場
対応するキーと値を追加します
server:
port: 9000
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://localhost:7070
predicates:
- Path=/info/**
filters:
- AddRequestHeader=X-Request-Color, blue
コントローラーはリクエストヘッダートラバーサル出力を取得します
Postmanはリクエストヘッダーを追加して出力することもできます
AddRequestHeadersIfNotPresent
GatewayFilter
工場
複数のキーと値のセットを追加可能(リクエストヘッダーに対応するキーが存在しない場合)
server:
port: 9000
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://localhost:7070
predicates:
- Path=/info/**
filters:
- AddRequestHeadersIfNotPresent=X-Request-Color:blue,school:rjxy
@GetMapping("/allHeaders")
public String allHeadersHandle(HttpServletRequest request){
StringBuilder sb = new StringBuilder();
//获取请求头所有的key
Enumeration<String> headerNames = request.getHeaderNames();
//遍历所有key
while (headerNames.hasMoreElements()) {
//获取key
String name = headerNames.nextElement();
sb.append(name+"===");
//获取当前key的所有value
Enumeration<String> headers = request.getHeaders(name);
//遍历所有value
while (headers.hasMoreElements()) {
//将当前遍历的value追加到sb中
sb.append(headers.nextElement()+"");
}
sb.append("<br>");
}
return sb.toString();
}
コントローラーはリクエスト ヘッダーを調べて出力し、追加は成功します。
AddRequestParameter
GatewayFilter
工場
リクエストパラメータの追加
server:
port: 9000
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://localhost:7070
predicates:
- Path=/info/**
filters:
- AddRequestParameter=red, blue
コントローラ
@GetMapping("/params")
public String paramsHandle(String red){
return red;
}
成功を得る
AddResponseHeader
GatewayFilter
工場
変更への対応
server:
port: 9000
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://localhost:7070
predicates:
- Path=/info/**
filters:
- AddResponseHeader=X-Response-color, Blue
- AddResponseHeader=X-Response-color, Red
直接 F12 を押して応答ヘッダーを表示し、正常に追加されました
サーキットブレーカー ゲートウェイフィルター ファクトリ
サーキット ブレーカー フィルター ファクトリは、ゲートウェイ層でのサービス サーキット ブレーカーとダウングレードを完了します。
server:
port: 9000
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://localhost:7070
predicates:
- Path=/info/**
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fb
http://localhost:7070にアクセスできない場合は、forward:/fb にアクセスするようにダウングレードします。
コントローラのダウングレード
@GetMapping("/fb")
public String fallbackHandle(){
return "This is the Gateway Fallback";
}
テスト。7070 を直接起動しないでください。9000 にアクセスしてください。サーキット ブレーカーは成功しました。
ステータスコードに基づくサーキットブレーカー
PrefixPath
GatewayFilter
工場
server:
port: 9000
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://localhost:8081
predicates:
- Path=/student/**
filters:
- PrefixPath=/provider
フィールドを照合し、プレフィックスを追加すると、サブモジュールが自動的にパスを追加します
テストの成功
StripPrefix
GatewayFilter
工場
指定されたリクエストパスを削除します
server:
port: 9000
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://localhost:8081
predicates:
- Path=/aa/bb/provider/student/**
filters:
- StripPrefix=2
/aa/bb を削除します
テストの成功
RewritePath
GatewayFilter
工場
パスを書き換える
server:
port: 9000
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://localhost:8081
predicates:
- Path=/red/blue/**
filters:
- RewritePath=/red/blue,/provider/student
// - RewritePath=/red/?(?<segment>.*), /$\{segment}
パスを照合し、指定されたパスに置き換えます
RequestRateLimiter
GatewayFilter
工場
トークンバケットアルゴリズムを通じて受信リクエストのフローを制限する
依存関係をインポートする
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis-reactive -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
<version>3.0.5</version>
</dependency>
レート制限キーパーサーを追加する
スタートアップ クラスに電流制限キー パーサーを追加します。これは、リクエストから制限する必要があるキーを解析するために使用されます。
この例では、要求されたホストまたは IP に基づいてフロー制限を指定します。
package com.guo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import reactor.core.publisher.Mono;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
KeyResolver userKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
}
設定ファイルを変更する
server:
port: 9000
spring:
cloud:
gateway:
routes:
- id: my_route
uri: http://localhost:8081
predicates:
- Path=/**
filters:
# replenishRate 填充率
- name: RequestRateLimiter
args:
key-resolver: "#{@userKeyResolver}"
redis-rate-limiter.replenishRate: 2
redis-rate-limiter.burstCapacity: 5
redis-rate-limiter.requestedTokens: 1
data:
redis:
host: 127.0.0.1
port: 6379
成功
デフォルトフィルター
server:
port: 9000
spring:
cloud:
gateway:
default-filters:
- AddRequestHeader=X-Request-Color, Default-Blue
routes:
- id: my_route
uri: http://localhost:7070
predicates:
- Path=/info/header
- id: my_route
uri: http://localhost:7070
predicates:
- Path=/info/headers
テストの成功
カスタムゲートウェイフィルター
AddHeaderGatewayFilter.java
public class AddHeaderGatewayFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest()
.mutate()
.header("X-Request-Color", "filter-Red")
.build();
ServerWebExchange webExchange = exchange.mutate().request(request).build();
return chain.filter(webExchange);
}
}
カスタム GatewayFilter を呼び出す
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder){
return builder.routes()
.route("my_router2",
ps ->ps.path("/info/**")
.filters(fs->fs.filter(new AddHeaderGatewayFilter()))
.uri("http://localhost:7070"))
.build();
}
テストの成功
複数のフィルターを実行する
OneGateWayFilter.java
@Slf4j
public class OneGateWayFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
long startTime = System.currentTimeMillis();
log.info("oneFilter-pre:"+startTime);
exchange.getAttributes().put("startTime",startTime);
return chain.filter(exchange).then(
Mono.fromRunnable(()->{
log.info("oneFilter------post");
Long startTimeAttr = (Long) exchange.getAttributes().get("startTime");
long elaspedTime = System.currentTimeMillis() - startTimeAttr;
log.info("所有过滤器执行的时间(毫秒)为:"+elaspedTime);
})
);
}
}
TwoGateWayFilter.java
@Slf4j
public class TwoGateWayFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("TwoFilter----pre");
return chain.filter(exchange).then(
Mono.fromRunnable(()->{
log.info("TwoFilter------post");
})
);
}
}
ThreeGateWayFilter.java
@Slf4j
public class ThreeGateWayFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("ThreeFilter----pre");
return chain.filter(exchange).then(
Mono.fromRunnable(()->{
log.info("ThreeFilter------post");
})
);
}
}
試験結果