Spring-cloud-alibaba 之 Sentinel

Sentienl

熔斷降級

Sentinel 熔斷降級會在調(diào)用鏈路中某個資源出現(xiàn)不穩(wěn)定狀態(tài)時(例如調(diào)用超時或異常比例升高)筷黔,對這個資源的調(diào)用進(jìn)行限制酷窥,讓請求快速失敗遂填,避免影響到其它的資源而導(dǎo)致級聯(lián)錯誤跪另。

當(dāng)資源被降級后吓笙,在接下來的降級時間窗口之內(nèi)咸产,對該資源的調(diào)用都會自動熔斷(默認(rèn)行為拋出 DegradeException)奢浑。

Sentinel的斷路器是沒有半開狀態(tài)的饮焦。

RT(平均響應(yīng)時間,秒級)

平均響應(yīng)時間 超出閾值在時間窗口內(nèi)通過的請求 >=5,兩個條件同時滿足后觸發(fā)降級

窗口期過后關(guān)閉斷路器

RT最大4900(更大的需要通過 -Dcsp.sentinel.statistic.max.rt=xxxx才能生效)

異常比例(秒級)

QPS >= 5 異常比例(秒級統(tǒng)計(jì))超過閾值時拒垃,觸發(fā)降級停撞;時間窗口結(jié)束后,關(guān)閉降級

異常數(shù)(分鐘級)

異常數(shù)(分鐘統(tǒng)計(jì))超過閾值時悼瓮,觸發(fā)降級戈毒;時間窗口結(jié)束后,關(guān)閉降級横堡。

時間窗口一定要大于等于60秒埋市。

熱點(diǎn)限流

兜底方法:分為系統(tǒng)默認(rèn)和客戶自定義,兩種

之前的demo命贴,限流出問題后道宅,都是用sentinel系統(tǒng)默認(rèn)的提示:Blocked by Sentinel(flow limiting)

我們能不能自定義?類似 Hystrix胸蛛,某個方法出問題了污茵,就找對應(yīng)的兜底降級方法?

結(jié)論:從@HystrixCommand 到 @SentinelResource

示例

image.png
@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                         @RequestParam(value = "p2",required = false) String p2)
{
    //int age = 10/0;
    return "------testHotKey";
}
public String deal_testHotKey (String p1, String p2, BlockException exception)
{
    return "------deal_testHotKey,o(╥﹏╥)o";  //sentinel系統(tǒng)默認(rèn)的提示:Blocked by Sentinel (flow limiting)
}

方法 testHotkey 里面第一個參數(shù)只要QPS超過每秒1次葬项,馬上降級處理泞当。兜底方法是我們自定義的 deal_testHotKey

熱點(diǎn)規(guī)則的參數(shù)例外項(xiàng)

普通:超過1秒鐘1個后,打到閾值1后馬上被限流

我們期望P1參數(shù)當(dāng)它是某個特殊值時玷室,它的限流值和平時不一樣零蓉。

假如笤受,當(dāng)p1的值等于5時穷缤,它的閾值可以達(dá)到200

image.png

結(jié)論:經(jīng)過參數(shù)例外項(xiàng)的配置后敌蜂,當(dāng)p1參數(shù)等于5時,QPS = 200

注意項(xiàng)

@SentinelResource

處理的時Sentinel控制臺配置的違規(guī)情況津肛,有blockHandler方法配置的兜底處理章喉;

RuntimeException

int age = 10/0; 這個時 java 運(yùn)行時報(bào)處的異常,@SentinelResource不管

系統(tǒng)規(guī)則

新增系統(tǒng)保護(hù)規(guī)則:作為總?cè)肟谏碜偘殃P(guān)

Load 自適應(yīng)(僅對Linux/Unix-like機(jī)器生效)

CPU usage

平均RT

并發(fā)線程數(shù)

入口QPS

自定義限流處理

@SentinelResource注解:

注意:注解方式埋點(diǎn)不支持private 方法

image.png
    // value:在sentinel中指定按資源名限流
    // blockHandlerClass:指定限流類
    // blockHandler:指定限流類中的方法
    // exceptionsToIgnore = {IllegalArgumentException.class} 忽略該類異常秸脱,該類異常還會正常返回前臺
    @GetMapping("/rateLimit/customerBlockHandler")
    @SentinelResource(value = "customerBlockHandler",
            blockHandlerClass = CustomerBlockHandler.class,
            blockHandler: = "handlerException2")
    public CommonResult customerBlockHandler()
    {
        return new CommonResult(200,"按客戶自定義",new Payment(2020L,"serial003"));
    }

CustomerBlockHandler.class (兜底類)

package com.wangcp.springcloud.myhandler;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.wangcp.springcloud.entities.CommonResult;

/**
 * @auther zzyy
 * @create 2020-02-25 15:32
 */
public class CustomerBlockHandler
{
    public static CommonResult handlerException(BlockException exception)
    {
        return new CommonResult(4444,"按客戶自定義,global handlerException----1");
    }
    public static CommonResult handlerException2(BlockException exception)
    {
        return new CommonResult(4444,"按客戶自定義,global handlerException----2");
    }
}

服務(wù)熔斷功能

sentinel 整合 ribbon + openFeign + fallback

Feign系列

Feign 組件一般都是在消費(fèi)方使用

添加pom依賴

<!--SpringCloud openfeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

修改yaml文件,激活Sentinel對Feign的支持

# 激活Sentinel對Feign的支持
feign:
  sentinel:
    enabled: true

主啟動類上添加注解 @EnableFeignClients

@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class OrderNacosMain84
{
    public static void main(String[] args) {
        SpringApplication.run(OrderNacosMain84.class, args);
    }
}

業(yè)務(wù)類:帶@FeignClient注解的業(yè)務(wù)接口

// value:消費(fèi)者將要去訪問的微服務(wù)名稱(注冊成功進(jìn)nacos的微服務(wù)提供者)
// fallback:服務(wù)降級兜底類
@FeignClient(value = "nacos-payment-provider",fallback = PaymentFallbackService.class)
public interface PaymentService
{
    @GetMapping(value = "/paymentSQL/{id}")
    public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id);
}

Feign兜底類

@Component
public class PaymentFallbackService implements PaymentService
{
    @Override
    public CommonResult<Payment> paymentSQL(Long id)
    {
        return new CommonResult<>(44444,"服務(wù)降級返回,---PaymentFallbackService",new Payment(id,"errorSerial"));
    }
}

Controller層進(jìn)行調(diào)用

 //==================OpenFeign
@Resource
private PaymentService paymentService;

@GetMapping(value = "/consumer/paymentSQL/{id}")
public CommonResult<Payment> paymentSQL(@PathVariable("id") Long id)
{
    return paymentService.paymentSQL(id);
}

正常使用Feign調(diào)用服務(wù)提供者可以正常返回,此時將所有的服務(wù)提供者關(guān)閉(模擬服務(wù)提供者宕機(jī))部蛇,啟用服務(wù)降級 fallback 的兜底方法返回摊唇。


image.png

持久化

Sentinel 規(guī)則默認(rèn)是臨時的,一旦我們重啟應(yīng)用涯鲁,sentinel規(guī)則將消失巷查;在生產(chǎn)環(huán)境需要將配置規(guī)則進(jìn)行持久化。

Sentinel持久化可以保存進(jìn)Nacos抹腿、數(shù)據(jù)庫岛请、redis、文件警绩,我們此處只針對Nacos進(jìn)行持久化崇败。

將限流配置規(guī)則持久化進(jìn)Nacos保存,只要刷新8401(Sentinel應(yīng)用)某個rest地址肩祥,sentinel控制臺的流控規(guī)則就能看到后室,只要Nacos里面的配置不刪除,針對8401上sentinel上的流控規(guī)則持續(xù)有效混狠。

修改8401(cloudalibaba-sentinel-service8401 應(yīng)用)

1.添加pom依賴

<!--SpringCloud ailibaba sentinel-datasource-nacos 做持久化用到-->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2.YML中添加Nacos數(shù)據(jù)源的配置

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服務(wù)注冊中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719
        ## Nacos數(shù)據(jù)源配置
        datasource: 
          ds1: 
            nacos: 
              server-addr: localhost:8848
              dataId: cloudalibaba-sentinel-service
              groupId: DEFAULT_GROUP
              data-type: json
              rule-type: flow

3.在Nacos中新建配置


image.png

resource: 資源名稱:

limitApp: 來源應(yīng)用;

grade: 閾值類型岸霹,0表示線程數(shù),1表示QPS

count: 單機(jī)閾值

strategy: 流控模式檀蹋,0表示直接松申,1表示關(guān)聯(lián),2表示鏈路;

controlBehavior:流控效果俯逾,0表示快速失敗1表示W(wǎng)arm Up贸桶,2表示排隊(duì)等待;

clusterMode: 是否集群桌肴。

4.持久化配置后生效測試

配置成功后皇筛,停用8401服務(wù)后進(jìn)行重新啟動,訪問 http://localhost:8401/rateLimit/byUrl ,當(dāng)訪問頻率超過單機(jī)閾值后觸發(fā)流控規(guī)則坠七。

附言

spring-cloud 與 spring-cloud-alibaba 相關(guān)代碼已上傳gitee水醋,地址為:https://gitee.com/wangcpstudy/cloud2020.git
歡迎各位同學(xué)留言探討旗笔,如有問題歡迎提出討論,謝謝拄踪!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝇恶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惶桐,更是在濱河造成了極大的恐慌撮弧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姚糊,死亡現(xiàn)場離奇詭異贿衍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)救恨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門贸辈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肠槽,你說我怎么就攤上這事擎淤。” “怎么了署浩?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵揉燃,是天一觀的道長。 經(jīng)常有香客問我筋栋,道長炊汤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任弊攘,我火速辦了婚禮抢腐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘襟交。我一直安慰自己迈倍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布捣域。 她就那樣靜靜地躺著啼染,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焕梅。 梳的紋絲不亂的頭發(fā)上迹鹅,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音贞言,去河邊找鬼斜棚。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弟蚀。 我是一名探鬼主播蚤霞,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼义钉!你這毒婦竟也來了昧绣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤断医,失蹤者是張志新(化名)和其女友劉穎滞乙,沒想到半個月后奏纪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鉴嗤,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年序调,在試婚紗的時候發(fā)現(xiàn)自己被綠了醉锅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡发绢,死狀恐怖硬耍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情边酒,我是刑警寧澤经柴,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站墩朦,受9級特大地震影響坯认,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氓涣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一牛哺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劳吠,春花似錦引润、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蠢古,卻和暖如春奴曙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背便瑟。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工缆毁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人到涂。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓脊框,卻偏偏與公主長得像颁督,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浇雹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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