はじめに: この記事は、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 を参照してください。