マイクロサービス保護 2 (カスタム例外結果 + Sentinel ルールの永続化)

目次

1. カスタムの異常な結果

1.1. 例外の種類

 1.2. カスタム例外処理

2. ルールの永続性

2.1. ルール管理モード

2.1.1. RAWモード

2.1.2. プルモード

2.1.3. プッシュモード

2.2. プッシュモードの実現


次の  マイクロサービスのセキュリティに関する 記事は拡大し続けます


1. カスタムの異常な結果

デフォルトでは、電流制限、ダウングレード、または認可インターセプトが発生すると、呼び出し元に例外がスローされます。異常な結果は流量制限(電流制限)です。これは十分に友好的ではなく、電流制限なのか、ダウングレードなのか、それとも許可された傍受なのかを知ることは不可能です。

1.1. 例外の種類

また、例外が発生したときに返される結果をカスタマイズしたい場合は、BlockExceptionHandler インターフェイスを実装する必要があります。

public interface BlockExceptionHandler {
    /**
     * 处理请求被限流、降级、授权拦截时抛出的异常:BlockException
     */
    void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception;
}

このメソッドには 3 つのパラメータがあります。

  • HttpServletRequest リクエスト:リクエスト对象

  • HttpServletResponse 応答:応答オブジェクト

  • BlockException e: センチネルによってインターセプトされたときにスローされる例外

ここの BlockException には、いくつかの異なるサブクラスが含まれています。

異常な 説明する
フロー例外 電流制限例外
ParamFlowException 異常なホットスポットパラメータの電流制限
劣化例外 ダウングレード例外
権限例外 認可ルールの例外
システムブロック例外 システムルール例外

 1.2. カスタム例外処理

次に、springcloud-product でカスタム例外処理クラスを定義します。

package com.wqg.product.handler;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        String msg = "未知异常";
        int status=429;
        if (e instanceof FlowException) {
            msg = "请求被限流了";
        } else if (e instanceof ParamFlowException) {
            msg = "请求被热点参数限流";
        } else if (e instanceof DegradeException) {
            msg = "请求被降级了";
        } else if (e instanceof AuthorityException) {
            msg = "没有权限访问";
            status = 401;
        }
        response.setContentType("application/json;charset=utf-8");
        response.setStatus(status);
        response.getWriter().println("{\"msg\": " + msg + ", \"status\": " + status + "}");
    }
}

テストを再開すると、さまざまなシナリオで、さまざまな例外メッセージが返されます

フロー制御設定後のアクセス:

 結果:

 

2. ルールの永続性

現在、センチネルのすべてのルールはメモリに保存されており、再起動するとすべてのルールが失われます。運用環境では、損失を避けるためにこれらのルールの永続性を確保する必要があります。

2.1. ルール管理モード

ルールを永続化できるかどうかは、ルール管理モードによって異なります。Sentinel は、次の 3 つのルール管理モードをサポートしています。

  • オリジナル モード: Sentinel のデフォルト モード。ルールはメモリに保存され、サービスを再起動するとサービスは失われます。

  • プルモード

  • プッシュモード

2.1.1. RAWモード

オリジナル モード: コンソールで設定されたルールは、アプリケーションである Sentinel クライアントに直接プッシュされます。その後、それをメモリに保存すると、サービスが再起動されると失われます

 

2.1.2. プルモード

プル モード: コンソールは構成されたルールを Sentinel クライアントにプッシュし、クライアントは構成されたルールをローカル ファイルまたはデータベースに保存します。将来的には、ローカル ファイルまたはデータベースに定期的にクエリを実行して、ローカル ルールを更新する予定です。

 

2.1.3. プッシュモード

プッシュ モード: コンソールは、Nacos などのリモート構成センターに構成ルールをプッシュします。Sentinel クライアントは Nacos を監視し、設定変更のプッシュ メッセージを取得し、ローカル設定の更新を完了します。

 

2.2. プッシュモードの実現

センチネルの永続性、私たちはこれを望んでいます:

  • 現在の制限設定は Sentinel コンソールで編集でき、永続化のために nacos に同期できます。

  • 現在の制限設定は nacos で変更され、センチネル コンソールに同期することもできます。

上記の最初の機能を実現するには、センチネル コンソールのソース コードを理解し、それに応じて変更する必要があります

しかし、GitHub上の誰かがすでにそれを修正し、コンソールの強化版を作成しています。

https://github.com/CHENZHENNAME/sentinel-dashboard-nacos

上記の URL を開いてローカルにダウンロードします


 上記のファイルを解凍します。

ルート ディレクトリで pom.xml を開き、sentinel のバージョンを変更します。

 

  • プロジェクトのルート ディレクトリ cmd を入力し、次のコマンドを実行します。

  •  mvn clean package
  • パッケージ化後、ターゲットディレクトリに生成されます

コマンドを実行してコンソールを起動します。

java -Dserver.port=8080 -Dnacos.serverAddr=localhost:8848  -jar sentinel-dashboard.jar

 # -Dserver.port コンソールのポート番号
# -Dnacos.serverAddr: nacos アドレス
# -Dnacos.namespace: プロジェクトが配置されている nacos 名前空間 名前空間がパブリックの場合、このパラメーターは省略できます


センチネルインターフェースを開く

 マイクロサービス クライアント アクセス センチネル コントロール パネル

springcloud-product マイクロサービス プロジェクト内

(1) 依存関係を導入する

  <!--sentinel配置规则的数据源-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.8.1</version>
        </dependency>

(2) 設定ファイルを変更する

#sentinel的服务端的地址
spring.cloud.sentinel.transport.dashboard=localhost:8080
spring.cloud.sentinel.datasource.ds1-flow.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds1-flow.nacos.data-id=${spring.application.name}-flow-rules
#还可以是degrade authority param-flow
spring.cloud.sentinel.datasource.ds1-flow.nacos.rule-type=flow
spring.cloud.sentinel.datasource.ds1-flow.nacos.data-type=json
spring.cloud.sentinel.datasource.ds1-flow.nacos..group-id=SENTINEL_GROUP

マイクロサービスを開始する  

次に、ブラウザはhttp://localhost:8080にアクセスします。最初は何もありません。その後、制限する必要がある独自のプロジェクトのインターフェイスにアクセスすると、対応するサービス名が左側に表示されます。

クラスター ポイントのリンクをクリックして、フロー制御ルールを追加します。

 2 が付いているものをクリックする必要があることに注意してください。2 が付いているもののみ nacos にプッシュでき、フロー制御ルール オプションに追加することはできません。青いボックスをクリックすることによってのみ nacos にプッシュできます

${application-name}-flow-rules追加が成功すると、nacos では、指定した名前空間に次の形式の設定ファイルが自動的に生成されます。

  Sentinel コンソールを使用している場合、ルールを追加または変更しても、ルールは nacos に同期されます。逆に、nacos の設定ファイルの現在の制限ルールを変更すると、sentinel にも同期されます。

 

おすすめ

転載: blog.csdn.net/WQGuang/article/details/131829627