スプリングクラウドゲートウェイヒューズの(B)、降格、制限

1.吹きダウングレードは:分散システムでは、入口ゲートウェイトラフィック要求の多数の遠隔バックエンドシステムへのゲートウェイを入力するか、サービスがコールを発信するために、バックエンド・サービスは、必然的に失敗したコール失敗(タイムアウトまたは異常)を生成しますゲートウェイ上に堆積された要求は、あなたがすぐに失敗するとヒューズがゲートウェイのダウングレードに行われる必要があるリターンバック、する必要は任せることはできません。

2.制限:ゲートウェイ上の多数の要求、指定されたサービスの制限は、大幅にサービスの可用性と安定性を向上させることができ、目的は、同時アクセス/要求によって制限速度を制限することである、または時間システム速度を保護するために、ウィンドウ内に要求。上限に達すると、あなたは、キューイングまたはダウングレードを待って、サービス拒否を評価することができます。

3.Springクラウドゲートウェイは制限、ヒューズを統合しました

1.基本Hystrixは、フィルタヒューズを降格で添加依存基準hystrixを劣化分解経路を返すように配置され、デフォルトの設定セマフォ分離しながら、タイムアウト能動3秒ヒューズ統合前に基づいてコードをブログ

<!-- 熔断、降级 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
12345复制代码

application.yml

filters:
# 熔断降级配置
- name: Hystrix
  args:
    name : default
    fallbackUri: 'forward:/defaultfallback'

# hystrix 信号量隔离,3秒后自动超时
hystrix:
  command:
    default:
      execution:
        isolation:
          strategy: SEMAPHORE
          thread:
            timeoutInMilliseconds: 3000
  shareSecurityContext: true
1234567891011121314151617复制代码

次のようにRestControllerの新しいDefaultHystrixControllerを作成し、読み取ります。

/**
 * 默认降级处理
 */
@RestController
public class DefaultHystrixController {

    @RequestMapping("/defaultfallback")
    public Map<String,String> defaultfallback(){
        System.out.println("降级操作...");
        Map<String,String> map = new HashMap<>();
        map.put("resultCode","fail");
        map.put("resultMessage","服务异常");
        map.put("resultObj","null");
        return map;
    }
}
12345678910111213141516复制代码

消費者サービスに同時にタイムアウト方式のIndexController、5秒間スリープ状態にスレッドを追加し、ゲートウェイ3秒のタイムアウトセットより大きい次のように、ヒューズは、劣化トリガされます。

@RestController
public class IndexController {

    @RequestMapping("/hello")
    public String hello(String name){
        return "hi " + name;
    }

    @RequestMapping("/timeout")
    public String timeout(){
        try{
            //睡5秒,网关Hystrix3秒超时,会触发熔断降级操作
            Thread.sleep(2000);
        }catch (Exception e){
            e.printStackTrace();
        }
        return "timeout";
    }
}
12345678910111213141516171819复制代码

プロジェクト、訪問の開始にhttp:// localhostを:9999 /コンシューマー/タイムアウト、以下の結果、ダウングレードトリガ
ここに画像を挿入説明
ゲートウェイタイムアウトの設定、6秒であるゲートウェイを再起動することを、6000に変更されましたが、再び訪問します。http:// localhostを:9999 /消費者を/タイムアウト、結果はHystrix吹き格下げ、あなたはバックエンドサービスのほとんどをカバーできる上、通常、統合ゲートウェイに戻っは利用できないシーンです
ここに画像を挿入説明

  • 2.電流制限統合、春クラウド・ゲートウェイのデフォルトのRedisは、電流制限統合、現在のようなさまざまなサービスのための異なる寸法行うことができます制限:制限はユーザーインターフェイスを制限、IP制限を
    この記事で示されたIP制限をされて、最初に追加依存のRedis、KeyResolver、追加の設定を追加し、あなたはRedisのを起動する必要があります
<!-- 限流 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
12345复制代码

KeyResolverキー、新しいクラスRateLimiterConfigを制限することにより、指定された、次のようにIP制限のコードは次のとおりです。

/**
 * 路由限流配置
 * @author zhuyu
 * @date 2019/1/15
 */
@Configuration
public class RateLimiterConfig {

    @Bean(value = "remoteAddrKeyResolver")
    public KeyResolver remoteAddrKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }
}
12345678910111213复制代码

制限の設定でapplication.yml追加:

spring:
  redis:
    host: localhost
filters:
# redis限流 , filter名称必须是RequestRateLimiter
- name: RequestRateLimiter
  args:
    # 使用SpEL名称引用Bean,与上面新建的RateLimiterConfig类中的bean的name相同
    key-resolver: '#{@remoteAddrKeyResolver}'
    # 每秒最大访问次数
    redis-rate-limiter.replenishRate: 20
    # 令牌桶最大容量
    redis-rate-limiter.burstCapacity: 20
12345678910111213复制代码

フィルタ名はRequestRateLimiterでなければならない
のRedisレート-limiter.replenishRate:ユーザーが1秒あたりの要求数に処理することを可能にする
のRedisレート-limiter.burstCapacityを:トークンバケット容量、要求の最大数は、1秒で完了する
キーリゾルバ:名前でSPEL Bean参照を使用します

第一セット2,10の数限定
2:Redisのレート- limiter.replenishRate
のRedis-limiter.burstCapacityレート:10回
の要求に応じて、わずか14裏面に続く試験結果は以下のように、他のすべてが拒否されます
ここに画像を挿入説明

第二流れ絞り20,20の数セット
のRedis-limiter.replenishRateレート:20はある
Redisの-limiter.burstCapacityレート:20であり、
次のように試験結果が多数の要求に応じて、一部を拒否し、あります
ここに画像を挿入説明

Redisのは、値と変更キーを制限する与えられています
ここに画像を挿入説明

ユーザは、インタフェース制限、流量制限器を使用することができ
、本実施形態の使用を制限、ユーザ制限を、リクエスト経路パラメータがユーザIDを運ぶ必要があります

@Bean
KeyResolver userKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
}
1234复制代码

キーURIを限定するものとしてのインターフェース、アドレス取得要求を制限します

@Bean
KeyResolver apiKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getPath().value());
}
1234复制代码

サイトが動的等ストリーム数、ライン上の新しいサービス、流通センターを介して動的ルーティングを行うが、リミット調整、活動を行う際に実際のシナリオでは、調整の数を制限することは、中央のコンフィギュレーションに依存する必要が

コードは、クラウドコードにアップロードされたソースコード、プロジェクトのバージョン情報は以下のとおりです。

- SpringBoot 2.0.6.RELEASE
- SpringCloud Finchley.SR2
12复制代码

このリンクします。https://blog.csdn.net/zhuyu19911016520/article/details/86499528

おすすめ

転載: juejin.im/post/5dca186cf265da4d0e00afa2