SentinelのHTTPサービスの現在の制限は、デフォルトでSentinel-Web-ServletパッケージのCommonFilterによって実装されています。コードからわかるように、このフィルターはそれぞれの異なるURLを異なるリソースとして扱います。
次のコードでは、{id}パラメーターを持つRESTスタイルのAPIが提供されています。異なる{id}ごとに、URLが異なるため、デフォルトでは、SentinelはすべてのURLをリソースとして扱います。フロー制御。
package com.yuntai.gateway.config;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UrlCleanController {
@GetMapping("/clean/{id}")
public String clean(int id){
return "Hello Clean";
}
}
これにより、2つの問題が発生し
ます。1。現在の制限統計が正確ではありません。実際の需要はクリーンメソッドの合計QPSを制御することであり、結果は各URLのQPSです。2。Sentinel
のリソース数も多すぎます。多く、およびリソース数のデフォルトのしきい値は6000であり、追加のリソースのルールは有効になりません。
この問題を解決するには、UrlCleanerインターフェイスを介してリソースクリーニングを実装できます。つまり、URL / clean / {id}の場合、/ clean / *リソースの下にまとめてグループ化できます。具体的な構成コードは次のとおりです。 UrlCleanerインターフェースとrewritecleanメソッド。
package xxx;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.UrlCleaner;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
@Component
public class CustomUrlCleaner implements UrlCleaner {
@Override
public String clean(String originUrl) {
if(StringUtils.isBlank(originUrl)){
return originUrl;
}
if(originUrl.startsWith("/clean/")){
return "/clean/*";
}
return originUrl;
}
}
バブルアカデミーの著書「SpringCloudAlibaba Microservice PrinciplesandPractices」から抜粋