Zuul限流実現

6315 ワード

テキストアドレス
[推荐阅读]微サービスはあとどのくらいですか?>>
一、前言
1、RateLimiter、Spring Cloud Zuul RateLimiterとは何ですか.
RateLimiterはGoogleオープンソースのトークンバケツアルゴリズムを実現したストリーム制限ツール(レート制限器)である.http://ifeve.com/guava-ratelimiter/
Spring Cloud Zuul RateLimiterはZuulと組み合わせてRateLimiterをカプセル化し、ZuulFilterを実現することでサービス制限フロー機能を提供する
限流粒度/タイプ
説明
Authenticated User
要求されたユーザーに対するストリーム制限
Request Origin
要求されたOriginに対するストリーム制限
URL
URL/インタフェースに対する限流
Service
このタイプは、サービスに対してストリーム制限を行い、ストリーム制限タイプが構成されていない場合に有効です.
https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit
2、本編の主な内容
  • サービスストリーム制限構成例及び説明
  • URLストリーム制限構成例及び説明
  • Zullクラスタサービス制限フロー説明(+Redis)
  • Spring Cloud Zuul RateLimiterパラメータ紹介
  • 3、本編の環境情報
    フレーム
    バージョン#バージョン#
    Spring Boot
    2.0.0.RELEASE
    Spring Cloud
    Finchley.RELEASE
    Zuul
    1.3.1
    JDK
    1.8.x
    4、準備
    前の記事を参考にしてください.https://ken.io/note/spring-cloud-zuul-quickstartソースベース:https://github.com/ken-io/springcloud-course/tree/master/chapter-08
  • Eureka Server、サービスプロバイダ
  • の準備
    Eureka Serverを起動するには:http://localhost:8800Test Serviceの起動:http://localhost:8602
    二、サービス制限フロー(Zuul+RateLimiter)
    前編のzulプロジェクトのソースコードに基づいて修正すればいいです.https://github.com/ken-io/springcloud-course/tree/master/chapter-08/zuul
  • spring-cloud-zul-ratelimit
  • を導入
    
        com.marcosbarbero.cloud
        spring-cloud-zuul-ratelimit
        2.0.4.RELEASE
    
    

    1、デフォルトのサービス制限フローポリシー
  • アプリケーションを修正する.yml構成ストリーム制限ポリシー
  • zuul:
      ratelimit:
        enabled: true
        default-policy:
          limit: 1
          quota: 2
          refresh-interval: 3
    

    以上の構成は、ストリーム制限ポリシーが有効であり、すべてのサービスが3秒以内に1回のみ要求され、すべての要求時間の合計が2秒を超えないことを示しています.
  • 限流試験
  • zulプロジェクトを開始し、アクセスします.http://localhost:8888/testservice?token=ken3秒で2回アクセスするとエラーページが表示されます
    Zuul限流实现_第1张图片
    エラーメッセージ:type=Too Many Requests、status=429これは、3秒以内の>1回のアクセスがストリーム制限ポリシーによって遮断されたことを示しています.
    2、指定されたサービスに対して単独でストリーム制限ポリシーを配置する
  • アプリケーションを修正する.yml構成ストリーム制限ポリシー
  • zuul:
      ratelimit:
        enabled: true
        default-policy:
          limit: 1
          quota: 1
          refresh-interval: 3
        policies:
          testservice:
            limit: 10
            quota: 50
            refresh-interval: 60
    

    以上の構成では、testserviceに対してストリーム制限ポリシーが個別に構成されています.60秒以内のアクセス回数は10回調べてはならず、アクセス時間は50秒を超えてはならない.
    デフォルトのストリーム制限ポリシーも同時に構成されており、デフォルトのストリーム制限ポリシーはtestserviceのストリーム制限ポリシーよりも厳格ですが、このストリーム制限は競合しません.サービスに対してストリーム制限ポリシーを個別に構成すると、この個別に構成されたストリーム制限ポリシーのみがサービスに有効になるからです.
    3、URLベースのストリーム制限ポリシー
  • アプリケーションを修正する.yml構成ストリーム制限ポリシー
  • zuul:
      ratelimit:
        enabled: true
        default-policy:
          limit: 1
          quota: 1
          refresh-interval: 3
        policies:
          testservice:
            limit: 10
            quota: 50
            refresh-interval: 60
            type: url
    

    以上の構成はtestserviceのポリシーにtypeパラメータの設定を追加しただけです.(もちろん、デフォルトのポリシーにこのパラメータを追加することもできます).
    このポリシーは、Url 60秒当たりのアクセス回数が10回を超えず、合計アクセス時間が50秒を超えてはならないということになります.
  • アクセステスト
  • zulプロジェクトを開始し、次のアクセスを行います.http://localhost:8888/testservice?token=kenストリーム制限のしきい値に達したら、アクセス:http://localhost:8888/testservice/plus?token=ken&numA=1&numB=2
    依然として正常にアクセスできます.また、?以降のパラメータは、ストリーム制限のkeyとして使用されないことに留意されたい.http://localhost:8888/testservice?token=ken , http://localhost:8888/testservice?token=ken.io同じurlとしてストリーム制限されます
    zul-ratelimiterの限流粒度/方式があなたのニーズを満たすことができない場合は、ZuulFilter統合RateLimiterをカスタマイズして限流を行うことができます.
    三、Zuulクラスタサービス制限フロー(Zuul+RateLimiter+Redis)
    RateLimiterのストリーム制限データはデフォルトでConcurrentHashMap方式でメモリに格納されており、Zuulクラスタを配備すると、ストリーム制限ポリシーに影響します.ストリーム制限データをRedisに格納することで,各Zuulノードのストリーム制限データを集中的に記録し,ストリーム制限の正確性を保証できる.
    1.Reids Serverの配備
    参照先:https://ken.io/note/centos7-redis4-setup
    2.Spring Data Redisの導入
    
        org.springframework.boot
        spring-boot-starter-data-redis
        2.0.4.RELEASE
    
    

    3、Redis接続の構成
    アプリケーションを変更します.yml
    spring:
      redis:
        host: 192.168.88.11
        port: 6379
    

    4、RateLimiterデータ記憶方式の配置
    zuul:
      ratelimit:
        enabled: true
        repository: redis
        default-policy:
          limit: 1
          quota: 1
          refresh-interval: 3
        policies:
          testservice:
            limit: 10
            quota: 50
            refresh-interval: 60
            type: url
    

    四、備考
    Zuul-RateLimiterパラメータの説明
  • Zuul-RateLimiter基本構成項
  • コンフィギュレーション・アイテム
    オプション値
    説明
    enabled
    true/false
    ストリーム制限を有効にするかどうか
    behind-proxy
    true/false
    ソースコードをめくってみましたが、使用されているのは見つかりませんでした...作者も説明していません...
    key-prefix
    String
    ストリーム制限key接頭辞
    repository
    CONSUL, REDIS, JPA, BUCKET4J_JCACHE, BUCKET4J_HAZELCAST, BUCKET4J_INFINISPAN, BUCKET4J_IGNITE, IN_MEMORY
    ストリーム制限データの格納方法、デフォルト:IN_MEMORY
    default-policy

    デフォルトのポリシー
    policies

    カスタムポリシー
    postFilterOrder

    义齿
    preFilterOrder

    prefilterフィルタ順序
  • Policy限流策略配置項説明
  • アイテム
    説明
    limit
    単位時間当たりのリクエスト回数制限
    quota
    単位時間内積算要求時間制限(秒)、必要でないパラメータ
    refresh-interval
    単位時間(秒)、デフォルト60秒
    type
    限流方式:ORIGIN,USER,URL
    ふろく
  • 本編コード例
  • https://github.com/ken-io/springcloud-course/tree/master/chapter-09
  • 本編参照
  • https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit
    http://ifeve.com/guava-ratelimiter/