ゲートウェイと Sentinel を組み合わせて非侵入的なゲートウェイ電流制限を実現するには、わずか 3 つのステップしか必要としません。落とし穴を避けるために注意してください。

はじめに: この記事は、Sping Cloud Alibaba、Gateway、Nacos などを使用した既存の基本的な運用マイクロサービス システムに基づいており、目標はゲートウェイ フロー制御タイプのフロー制限を実現することです。

名前が示すように、電流制限は、同時実行性の高いシナリオでリクエスト トラフィックの入力を制限し、システムが過負荷になるのを防ぐために使用されます。Alibaba のオープンソース センチネルは、さまざまな種類のルールを設定することで、さまざまなリソースを保護できます。

  • リソース: サービス、メソッド、コードなど、何でも構いません。
  • ルール: フロー制御ルール、ヒューズ ダウングレード ルール、システム保護ルール、ホットスポット ルール、ゲートウェイ API グループ化ルール、ゲートウェイ フロー制御ルール

この記事で使用しているバージョンの対応は以下の通りです(公式リンク:バージョン対応)

<spring.boot>2.6.7</spring.boot>
<spring-cloud>2021.0.2</spring-cloud>
<spring-cloud-alibaba>2021.0.4.0</spring-cloud-alibaba>

この記事の目標

  • マイクロサービス統合センチネル
  • Sentinel クライアントを使用してゲートウェイ電流制限ルールを生成し、それらを nacos に永続化します。
  • ルールが有効になり、電流制限効果が生じます。

3段階の戦略


1.センチネルを統合する

1.1. サーバーの統合

1.1.1. pomのインポート

<!--网关组件-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!--sentinel限流-->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- SpringCloud Ailibaba Sentinel Gateway -->
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

<!-- 通过nacos持久化流控规则 -->
<dependency>
   <groupId>com.alibaba.csp</groupId>
   <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

Sentinel Starter を構成するには、 spring-cloud-alibaba-sentinel-gateway モジュールの Spring Cloud Gateway 自動構成クラスを有効にするために、 spring-cloud-alibaba-sentinel-gateway および spring-cloud-starter-gateway の依存関係が必要です。

回避ポイント 1: Spring Cloud Alibaba 経由で Sentinel にアクセスするには、spring.cloud.sentinel.filter.enabled 構成項目を false に設定する必要があります (ゲートウェイ フロー制御のデフォルトの粒度はルートとカスタム API グループ化ディメンションであり、URL 粒度はそうではありません)サポートされています)

回避ポイント 2: Spring Cloud Alibaba Sentinel データ ソース モジュールを通じて、ゲートウェイ フロー制御ルールのデータ ソース タイプが flow ではなく gw-flow になる

1.1.2. ルール設定ファイルの作成

ゲートウェイモジュールに新しい application-sentinel.yaml ファイルを作成します

構成ルール

spring:
  cloud:
    sentinel:
      enabled: true
      datasource:
        ds1:
          nacos:
            server-addr: ${spring.cloud.nacos.config.server-addr}
            namespace: ${spring.cloud.nacos.config.namespace}
            data-id: ${spring.application.name}-gateway-flow-rules
            group-Id: SENTINEL_GROUP
            rule-type: gw-flow
            data-type: json
        ds2:
          nacos:
            server-addr: ${spring.cloud.nacos.config.server-addr}
            namespace: ${spring.cloud.nacos.config.namespace}
            data-id: ${spring.application.name}-gateway-api-rules
            group-Id: SENTINEL_GROUP
            rule-type: gw-api-group
            data-type: json
          ds3:
            nacos:
              server-addr: ${spring.cloud.nacos.config.server-addr}
              namespace: ${spring.cloud.nacos.config.namespace}
              data-id: ${spring.application.name}-degrade-rules
              group-Id: SENTINEL_GROUP
              rule-type: degrade
              data-type: json
          ds4:
            nacos:
              server-addr: ${spring.cloud.nacos.config.server-addr}
              namespace: ${spring.cloud.nacos.config.namespace}
              data-id: ${spring.application.name}-system-rules
              group-Id: SENTINEL_GROUP
              rule-type: system
              data-type: json
      log:
        dir: /home/omo/sentinel/logs
        # 启用向sentinel发送心跳
      eager: true
      scg:
        fallback:
          response-status: 429
          mode: response
          response-body: '{"code": 429,"message": "前方拥堵,请稍后再试!"}'

1. Sentinel ダッシュボードは、デフォルトで spring.application.name で始まるルールを生成します。ds1 と ds2 がこのテストのタイプです。

2.data-type は読み取りデータ型です。ここでは json に設定されます。

3. 最終的なフォールバックは、制限された後のカスタム応答で構成されます

1.1.3. 通信ポートの設定

サービスとセンチネルダッシュボードの間の通信ポート構成

spring:
  cloud:
    sentinel:
      transport:
        # sentinel控制台地址
        dashboard: localhost:8081
        # 跟sentinel控制台交流的端口,随意指定一个未使用的端口即可,默认是8719
        port: 8719
        # Get heartbeat client local ip
        clientIp: 127.0.0.1

1.2.センチネルダッシュボードの統合

Sentinel 1.6.3 では、ゲートウェイ フロー制御コンソールのサポートが導入されており、Sentinel コンソールで API ゲートウェイのリアルタイム ルートとカスタム API グループのモニタリングを直接表示し、ゲートウェイ ルールと API グループ構成を管理できます。

まず、コンソール プロジェクト コードをダウンロードし、自分で変更してコンパイルする必要があります。私の変更したプロジェクトをすぐに使用することもできます: Sentinel-dashboard-1.8.6。変更されたプロジェクトは、複数のルール構成管理、ルール プッシュ (nacos へのプッシュ) をサポートしています。

起動前に nacos アドレスと名前空間を構成する (application.properties)

起動パラメータ設定(IDEA)

-Dserver.port=8081 -Dcsp.sentinel.dashboard.server=localhost:8081 -Dproject.name=sentinel-dashboard

アフターエフェクト

2.プッシュモードルールの永続化

プッシュモードプロセス

(公式バージョンのセンチネル ダッシュボードをダウンロードする場合は、自分で実装する必要があります。怠け者は、上で提供した修正バージョンを直接使用できます)

主要な変更点は以下のとおりです。

2.1. nacosConfig クラスの変更

@Bean
public ConfigService nacosConfigService() throws Exception {
    Properties properties = new Properties();
    //nacos地址
    properties.put(PropertyKeyConst.SERVER_ADDR, nacosAddr);
    //namespace为空即为public
    properties.put(PropertyKeyConst.NAMESPACE, namespace);
    return ConfigFactory.createConfigService(properties);
}

また、対応するルール タイプのプロバイダーとパブリッシャーは、GatewayFlowRule を例として取り上げます。

2.2. 公開ルールの実装を変更する (公開者)

@Component("gatewayFlowRuleNacosPublisher")
public class GatewayFlowRuleNacosPublisher implements DynamicRulePublisher<List<GatewayFlowRuleEntity>> {

    @Autowired
    private ConfigService configService;

    @Autowired
    private Converter<List<GatewayFlowRuleEntity>, String> converter;

    @Override
    public void publish(String app, List<GatewayFlowRuleEntity> rules) throws Exception {
        AssertUtil.notEmpty(app, "app name cannot be empty");
        if (rules == null) {
            return;
        }
        configService.publishConfig(app + NacosConfigUtil.GATEWAY_FLOW_DATA_ID_POSTFIX,
                NacosConfigUtil.GROUP_ID, converter.convert(rules));
    }
}

2.3. 取得ルール実装の変更(プロバイダー)

@Component("gatewayFlowRuleNacosProvider")
public class GatewayFlowRuleNacosProvider implements DynamicRuleProvider<List<GatewayFlowRuleEntity>> {
    @Autowired
    private ConfigService configService;

    @Autowired
    private Converter<String, List<GatewayFlowRuleEntity>> converter;

    @Override
    public List<GatewayFlowRuleEntity> getRules(String appName) throws Exception {
        String rules = configService.getConfig(appName + NacosConfigUtil.GATEWAY_FLOW_DATA_ID_POSTFIX,
                NacosConfigUtil.GROUP_ID, 3000);
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>();
        }
        return converter.convert(rules);
    }
}

2.4. 対応するインターフェースを変更する

(GatewayFlowRuleController中)

導入

@Autowired
@Qualifier("gatewayFlowRuleNacosProvider")
private DynamicRuleProvider<List<GatewayFlowRuleEntity>> ruleProvider;

@Autowired
@Qualifier("gatewayFlowRuleNacosPublisher")
private DynamicRulePublisher<List<GatewayFlowRuleEntity>> rulePublisher;

その後、追加、削除、変更、確認のメソッドで実装を変更します。詳細については、sentinel-dashboard-1.8.6 を参照してください。

3. ルールを設定し、電流制限効果をテストする

3.1 センチネルダッシュボードを開始する

起動手順は上記で説明しています

3.2 ゲートウェイ電流制限ルールの構成

3.2.1 ルートタイプルールの設定

ユーザー サービス (ゲートウェイ ルーティング設定の ID) に QPS=5 を設定します。フロー制御方法は高速障害のルールです。

nacos のバックグラウンドに移動して、nacos に同期されているルールの詳細を表示します。

nacos で変更すると、ダッシュボードも同期的に更新され、デモは行われなくなります。(ルール属性の意味については、電流制限フィールドを参照してください)

3.2.2. API グループ化タイプのルールの設定

最初に API グループ化を構成します

次に、ルールを構成します (ドロップダウンで構成したグループを選択し、QPS=5 も設定します)。

3.3 電流制限効果のテスト

3.3.1. ルートタイプの電流制限

テストケース設定ループを10回設定する

テスト結果は、成功 5 回、失敗 5 回で、期待どおりでした。これで完了です。

3.3.2. API グループの電流制限

テスト レポート内の /auth/oms/** へのパスが一致し、現在の制限が有効になっていることがわかります。

4. 展開する

  • ゲートウェイのフロー制御原理、詳細は公式ウェブサイトを参照

  • SpringCloud Gateway と SpringCloud Sentinel を使用する場合、公式は 4xx、5xx 応答コードの異常な統計ヒューズをサポートしていません。自分で実装できます。issue1842 issue2537 を参照してください。

おすすめ

転載: blog.csdn.net/mxt51220/article/details/131721660