spring cloud alibaba系列(二)Sentinel應(yīng)用的限流管理

限流組件Sentinel

  • Sentinel是把流量作為切入點,從流量控制碉克、熔斷降級凌唬、系統(tǒng)負載保護等多個維度保護服務(wù)的穩(wěn)定性。
  • 默認支持 Servlet漏麦、Feign客税、RestTemplate、Dubbo 和 RocketMQ 限流降級功能的接入撕贞,可以在運行時通過控制臺實時修改限流降級規(guī)則更耻,還支持查看限流降級 Metrics 監(jiān)控。
  • 自帶控臺動態(tài)修改限流策略捏膨。但是每次服務(wù)重啟后就丟失了秧均。所以它也支持ReadableDataSource 目前支持file, nacos, zk, apollo 這4種類型

接入Sentinel

創(chuàng)建項目cloud-sentinel

  • 1 引入 Sentinel starter
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  • 2 application.properties配置如下
server.port=18084
spring.application.name=service-sentinel

#Sentinel 控制臺地址
spring.cloud.sentinel.transport.dashboard=localhost:8080
#取消Sentinel控制臺懶加載
spring.cloud.sentinel.eager=true

接入限流埋點

Sentinel 默認為所有的 HTTP 服務(wù)提供了限流埋點。引入依賴后自動完成所有埋點号涯。只需要在控制配置限流規(guī)則即可

  • 注解埋點
    如果需要對某個特定的方法進行限流或降級目胡,可以通過 @SentinelResource 注解來完成限流的埋點
@SentinelResource("resource")
@RequestMapping("/sentinel/hello")
public Map<String,Object> hello(){
        Map<String,Object> map=new HashMap<>(2);
        map.put("appName",appName);
        map.put("method","hello");
        return map;
}

部署Sentinel控制臺

安裝

Sentinel下載

啟動控制臺

執(zhí)行 Java 命令 java -jar sentinel-dashboard.jar 默認的監(jiān)聽端口為 8080

訪問

打開http://localhost:8080 即可看到控制臺界面

輸入圖片說明

說明cloud-sentinel已經(jīng)成功和Sentinel完成率通訊

配置限流規(guī)則

如果控制臺沒有找到自己的應(yīng)用,可以先調(diào)用一下進行了 Sentinel 埋點的 URL 或方法或著禁用Sentinel 的賴加載spring.cloud.sentinel.eager=true

配置 URL 限流規(guī)則

控制器隨便添加一個普通的http方法

  /**
     * 通過控制臺配置URL 限流
     * @return
     */
    @RequestMapping("/sentinel/test")
    public Map<String,Object> test(){
        Map<String,Object> map=new HashMap<>(2);
        map.put("appName",appName);
        map.put("method","test");
        return map;
    }

點擊新增流控規(guī)則诚隙。為了方便測試閥值設(shè)為 1

image

瀏覽器重復(fù)請求 http://localhost:18084/sentinel/test 如果超過閥值就會出現(xiàn)如下界面
image

整個URL限流就完成了讶隐。但是返回的提示不夠友好。

配置自定義限流規(guī)則(@SentinelResource埋點)

自定義限流規(guī)則就不是添加方法的訪問路徑久又。 配置的是@SentinelResource注解中value的值。比如@SentinelResource("resource")就是配置路徑為resource

image

  • 訪問:http://localhost:18084/sentinel/hello
  • 通過@SentinelResource注解埋點配置的限流規(guī)則如果沒有自定義處理限流邏輯效五,當(dāng)請求到達限流的閥值時就返回404頁面
    image

自定義限流處理邏輯

@SentinelResource 注解包含以下屬性:

  • value: 資源名稱地消,必需項(不能為空)
  • entryType: 入口類型,可選項(默認為 EntryType.OUT)
  • blockHandler:blockHandlerClass中對應(yīng)的異常處理方法名畏妖。參數(shù)類型和返回值必須和原方法一致
  • blockHandlerClass:自定義限流邏輯處理類

 //通過注解限流并自定義限流邏輯
 @SentinelResource(value = "resource2", blockHandler = "handleException", blockHandlerClass = {ExceptionUtil.class})
 @RequestMapping("/sentinel/test2")
    public Map<String,Object> test2() {
        Map<String,Object> map=new HashMap<>();
        map.put("method","test2");
        map.put("msg","自定義限流邏輯處理");
        return  map;
    }

public class ExceptionUtil {

    public static Map<String,Object> handleException(BlockException ex) {
        Map<String,Object> map=new HashMap<>();
        System.out.println("Oops: " + ex.getClass().getCanonicalName());
        map.put("Oops",ex.getClass().getCanonicalName());
        map.put("msg","通過@SentinelResource注解配置限流埋點并自定義處理限流后的邏輯");
        return  map;
    }
}

控制臺新增resource2的限流規(guī)則并設(shè)置閥值為1脉执。訪問http://localhost:18084/sentinel/test2 請求到達閥值時機會返回自定義的異常消息

image

基本的限流處理就完成了。 但是每次服務(wù)重啟后 之前配置的限流規(guī)則就會被清空因為是內(nèi)存態(tài)的規(guī)則對象.所以下面就要用到Sentinel一個特性ReadableDataSource 獲取文件戒劫、數(shù)據(jù)庫或者配置中心是限流規(guī)則

讀取文件的實現(xiàn)限流規(guī)則

一條限流規(guī)則主要由下面幾個因素組成:

  • resource:資源名半夷,即限流規(guī)則的作用對象
  • count: 限流閾值
  • grade: 限流閾值類型(QPS 或并發(fā)線程數(shù))
  • limitApp: 流控針對的調(diào)用來源,若為 default 則不區(qū)分調(diào)用來源
  • strategy: 調(diào)用關(guān)系限流策略
  • controlBehavior: 流量控制效果(直接拒絕迅细、Warm Up巫橄、勻速排隊)
    SpringCloud alibaba集成Sentinel后只需要在配置文件中進行相關(guān)配置,即可在 Spring 容器中自動注冊 DataSource茵典,這點很方便湘换。配置文件添加如下配置
#通過文件讀取限流規(guī)則
spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json
spring.cloud.sentinel.datasource.ds1.file.data-type=json
spring.cloud.sentinel.datasource.ds1.file.rule-type=flow

在resources新建一個文件 比如flowrule.json 添加限流規(guī)則

[
  {
    "resource": "resource",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  },
  {
    "resource": "resource3",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  }
]

重新啟動項目。出現(xiàn)如下日志說明文件讀取成功

 [Sentinel Starter] DataSource ds1-sentinel-file-datasource start to loadConfig
 [Sentinel Starter] DataSource ds1-sentinel-file-datasource load 2 FlowRule

刷新Sentinel 控制臺 限流規(guī)則就會自動添加進去

image

Sentinel的基本配置

spring.cloud.sentinel.enabled              #Sentinel自動化配置是否生效
spring.cloud.sentinel.eager               #取消Sentinel控制臺懶加載
spring.cloud.sentinel.transport.dashboard   #Sentinel 控制臺地址
spring.cloud.sentinel.transport.heartbeatIntervalMs        #應(yīng)用與Sentinel控制臺的心跳間隔時間
spring.cloud.sentinel.log.dir            #Sentinel 日志文件所在的目錄
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市彩倚,隨后出現(xiàn)的幾起案子筹我,更是在濱河造成了極大的恐慌,老刑警劉巖帆离,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔬蕊,死亡現(xiàn)場離奇詭異,居然都是意外死亡哥谷,警方通過查閱死者的電腦和手機岸夯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呼巷,“玉大人囱修,你說我怎么就攤上這事⊥鹾罚” “怎么了破镰?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長压储。 經(jīng)常有香客問我鲜漩,道長,這世上最難降的妖魔是什么集惋? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任孕似,我火速辦了婚禮,結(jié)果婚禮上刮刑,老公的妹妹穿的比我還像新娘喉祭。我一直安慰自己,他們只是感情好雷绢,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布泛烙。 她就那樣靜靜地躺著,像睡著了一般翘紊。 火紅的嫁衣襯著肌膚如雪蔽氨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天帆疟,我揣著相機與錄音鹉究,去河邊找鬼。 笑死踪宠,一個胖子當(dāng)著我的面吹牛自赔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殴蓬,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匿级,長吁一口氣:“原來是場噩夢啊……” “哼蟋滴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痘绎,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤津函,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后孤页,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尔苦,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年行施,在試婚紗的時候發(fā)現(xiàn)自己被綠了允坚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛾号,死狀恐怖稠项,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲜结,我是刑警寧澤展运,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站精刷,受9級特大地震影響拗胜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怒允,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一埂软、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纫事,春花似錦勘畔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚊夫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懦尝,已是汗流浹背知纷。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留陵霉,地道東北人琅轧。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像踊挠,于是被迫代替她去往敵國和親乍桂。 傳聞我的和親對象是個殘疾皇子冲杀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容