欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何使用@SentinelResource注解靈活的定義控制資源以及如何配置控制策略

如何使用@SentinelResource注解靈活的定義控制資源以及如何配置控制策略,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)專注于阿榮網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供阿榮營銷型網(wǎng)站建設(shè),阿榮網(wǎng)站制作、阿榮網(wǎng)頁設(shè)計(jì)、阿榮網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造阿榮網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供阿榮網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

在實(shí)際應(yīng)用過程中,我們可能需要限流的層面不僅限于接口。可能對于某個(gè)方法的調(diào)用限流,對于某個(gè)外部資源的調(diào)用限流等都希望做到控制。呢么,這個(gè)時(shí)候我們就不得不手工定義需要限流的資源點(diǎn),并配置相關(guān)的限流策略等內(nèi)容了。

自定義資源點(diǎn)

下面的例子基于您已經(jīng)引入了Spring Cloud Alibaba Sentinel為基礎(chǔ),如果您還不會這些,建議優(yōu)先閱讀《使用Sentinel實(shí)現(xiàn)接口限流》。

第一步:在應(yīng)用主類中增加注解支持的配置:

@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

    // 注解支持的配置Bean
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }

}

第二步:在需要通過Sentinel來控制流量的地方使用@SentinelResource注解,比如下面以控制Service邏輯層的某個(gè)方法為例:

@Slf4j
@Service
public class TestService {

    @SentinelResource(value = "doSomeThing")
    public void doSomeThing(String str) {
        log.info(str);
    }

}

到這里一個(gè)需要被保護(hù)的方法就定義完成了。下面我們分別說說,定義了資源點(diǎn)之后,我們?nèi)绾螌?shí)現(xiàn)不同的保護(hù)策略,包括:限流、降級等。

如何實(shí)現(xiàn)限流與熔斷降級

在定義了資源點(diǎn)之后,我們就可以通過Dashboard來設(shè)置限流和降級策略來對資源點(diǎn)進(jìn)行保護(hù)了。同時(shí),也可以通過@SentinelResource來指定出現(xiàn)限流和降級時(shí)候的異常處理策略。下面,就來一起分別看看限流和降級都是如何實(shí)現(xiàn)的。

實(shí)現(xiàn)限流控制

第一步:在Web層調(diào)用這個(gè)被保護(hù)的方法:

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/hello")
    public String hello() {
        estService.doSomeThing("hello " + new Date());
        return "didispace.com";
    }

}

第二步:啟動(dòng)測試應(yīng)用,啟動(dòng)Sentinel-Dashboard。發(fā)一個(gè)請求到/hello接口上,使得Sentinel-Dashboard上可以看到如下圖所示的幾個(gè)控制點(diǎn):

如何使用@SentinelResource注解靈活的定義控制資源以及如何配置控制策略

可以看到,除了如之前入門實(shí)例中那樣有/hello資源點(diǎn)之外,多了一個(gè)doSomeThing資源點(diǎn)。可以通過界面為這個(gè)資源點(diǎn)設(shè)置限流規(guī)則,比如將其QPS設(shè)置為2。由于/hello資源不設(shè)置限流規(guī)則,所以只要請求/hello接口,就可以直接模擬調(diào)用doSomeThing資源,來觀察限流規(guī)則是否生效。

下面可以通過任何你喜歡的工具來調(diào)用/hello接口,只要QPS超過2,那么就會出現(xiàn)如下的錯(cuò)誤返回,代表限流策略生效了。

此時(shí),服務(wù)端的控制臺也會有對應(yīng)的限流報(bào)錯(cuò)日志:

2019-06-27 11:30:43.514  INFO 36898 --- [nio-8001-exec-3] c.d.a.sentinel.service.TestService       : aaa
2019-06-27 11:30:43.905 ERROR 36898 --- [nio-8001-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException] with root cause

com.alibaba.csp.sentinel.slots.block.flow.FlowException: null

實(shí)現(xiàn)限流的異常處理

默認(rèn)情況下,Sentinel對控制資源的限流處理是直接拋出異常,也就是上一節(jié)中貼出的日志內(nèi)容。在沒有合理的業(yè)務(wù)承接或者前端對接情況下可以這樣,但是正常情況為了更好的用戶業(yè)務(wù),都會實(shí)現(xiàn)一些被限流之后的特殊處理,我們不希望展示一個(gè)生硬的報(bào)錯(cuò)。那么只需要基于上面的例子做一些加工,比如:

@Slf4j
@Service
public class TestService {

    @SentinelResource(value = "doSomeThing", blockHandler = "exceptionHandler")
    public void doSomeThing(String str) {
        log.info(str);
    }

    // 限流與阻塞處理
    public void exceptionHandler(String str, BlockException ex) {
        log.error( "blockHandler:" + str, ex);
    }
    
}

主要做了兩件事:

  • 通過@SentinelResource注解的blockHandler屬性制定具體的處理函數(shù)

  • 實(shí)現(xiàn)處理函數(shù),該函數(shù)的傳參必須與資源點(diǎn)的傳參一樣,并且最后加上BlockException異常參數(shù);同時(shí),返回類型也必須一樣。

> 如果熟悉Hystrix的讀者應(yīng)該會發(fā)現(xiàn),這樣的設(shè)計(jì)與HystrixCommand中定義fallback很相似,還是很容易理解的。

完成上面的改動(dòng)之后,再嘗試訪問接口(注意限流規(guī)則需要配置好),此時(shí)前端就不會返回異常信息了,后端會打印exceptionHandler中定義的日志輸出。而在實(shí)際應(yīng)用的時(shí)候,只要根據(jù)業(yè)務(wù)需要對限流請求做緩存或者前端提示等都可以基于此方法來實(shí)現(xiàn)。

實(shí)現(xiàn)熔斷降級

@SentinelResource注解除了可以用來做限流控制之外,還能實(shí)現(xiàn)與Hystrix類似的熔斷降級策略。下面就來具體看看如何使用吧。

第一步:與限流控制一樣,使用@SentinelResource注解標(biāo)記資源點(diǎn),比如:

@Slf4j
@Service
public class TestService {

    @SentinelResource(value = "doSomeThing2")
    public void doSomeThing2(String str) {
        log.info(str);
        throw new RuntimeException("發(fā)生異常");
    }

}

這里在TestService類中創(chuàng)建了一個(gè)新的方法,并使用@SentinelResource將該資源命名為doSomeThing2。該方法會拋出異常,以配合后續(xù)制定基于異常比例的降級策略(類似Hystrix)。Sentinel相比Hystrix更豐富,還有基于響應(yīng)時(shí)間和異常數(shù)的降級策略。

第二步:在Web層調(diào)用這個(gè)被保護(hù)的方法:

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/hello2")
    public String hello2() {
        testService.doSomeThing2("hello2 " + new Date());
        return "didispace.com";
    }

}

第三步:啟動(dòng)測試應(yīng)用,啟動(dòng)Sentinel-Dashboard。發(fā)一個(gè)請求到/hello2接口上,使得Sentinel-Dashboard上可以看到名為doSomeThing2的資源點(diǎn)。然后點(diǎn)擊”降級“按鈕,為該資源設(shè)置降級規(guī)則。這里使用異常比例策略,比例設(shè)置為0.5(即:50%的異常率),時(shí)間窗口設(shè)置為2(秒)。

如何使用@SentinelResource注解靈活的定義控制資源以及如何配置控制策略

第四步:驗(yàn)證熔斷降級,根據(jù)上面的降級策略配置,當(dāng)doSomeThing2方法的調(diào)用QPS >= 5,如果異常率超過50%,那么后續(xù)2秒內(nèi)的調(diào)用將直接出發(fā)熔斷降級,默認(rèn)情況會直接拋出DegradeException異常,比如:

2019-06-27 17:49:58.913 ERROR 99863 --- [nio-8001-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException] with root cause

com.alibaba.csp.sentinel.slots.block.degrade.DegradeException: null

熔斷的降級處理

在Sentinel中定義熔斷的降級處理方法非常簡單,與Hystrix非常相似。只需要使用@SentinelResource注解的fallback屬性來指定具體的方法名即可。這里也需要注意傳參與返回必須一致。比如:

@Slf4j
@Service
public class TestService {

    // 熔斷與降級處理
    @SentinelResource(value = "doSomeThing2", fallback = "fallbackHandler")
    public void doSomeThing2(String str) {
        log.info(str);
        throw new RuntimeException("發(fā)生異常");
    }

    public void fallbackHandler(String str) {
        log.error("fallbackHandler:">

完成上面的改造之后,重啟應(yīng)用,并設(shè)置doSomeThing2資源的熔斷降級策略(使用異常百分比),然后頻繁的請求/hello2接口。在QPS>=5之后,由于這個(gè)接口一直在拋出異常,所以一定會滿足熔斷降級條件,這時(shí)候就會執(zhí)行fallbackHandler方法,不斷的打印如下日志:

2019-06-27 23:44:19.432 ERROR 58471 --- [nio-8001-exec-1] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.599 ERROR 58471 --- [nio-8001-exec-2] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.791 ERROR 58471 --- [nio-8001-exec-3] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.975 ERROR 58471 --- [nio-8001-exec-4] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:20.168 ERROR 58471 --- [nio-8001-exec-5] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:20 CST 2019

更多注解屬性說明

關(guān)于@SentinelResource注解最主要的兩個(gè)用法:限流控制和熔斷降級的具體使用案例介紹完了。另外,該注解還有一些其他更精細(xì)化的配置,比如忽略某些異常的配置、默認(rèn)降級函數(shù)等等,具體可見如下說明:

  • value:資源名稱,必需項(xiàng)(不能為空)

  • entryType:entry 類型,可選項(xiàng)(默認(rèn)為 EntryType.OUT

  • blockHandler / blockHandlerClassblockHandler對應(yīng)處理 BlockException 的函數(shù)名稱,可選項(xiàng)。blockHandler 函數(shù)訪問范圍需要是 public,返回類型需要與原方法相匹配,參數(shù)類型需要和原方法相匹配并且最后加一個(gè)額外的參數(shù),類型為 BlockException。blockHandler 函數(shù)默認(rèn)需要和原方法在同一個(gè)類中。若希望使用其他類的函數(shù),則可以指定 blockHandlerClass 為對應(yīng)的類的 Class 對象,注意對應(yīng)的函數(shù)必需為 static 函數(shù),否則無法解析。

  • fallback:fallback 函數(shù)名稱,可選項(xiàng),用于在拋出異常的時(shí)候提供 fallback 處理邏輯。fallback 函數(shù)可以針對所有類型的異常(除了exceptionsToIgnore里面排除掉的異常類型)進(jìn)行處理。fallback 函數(shù)簽名和位置要求:

    • 返回值類型必須與原函數(shù)返回值類型一致;

    • 方法參數(shù)列表需要和原函數(shù)一致,或者可以額外多一個(gè) Throwable 類型的參數(shù)用于接收對應(yīng)的異常。

    • fallback 函數(shù)默認(rèn)需要和原方法在同一個(gè)類中。若希望使用其他類的函數(shù),則可以指定 fallbackClass為對應(yīng)的類的 Class 對象,注意對應(yīng)的函數(shù)必需為 static 函數(shù),否則無法解析。

  • defaultFallback(since 1.6.0):默認(rèn)的 fallback 函數(shù)名稱,可選項(xiàng),通常用于通用的 fallback 邏輯(即可以用于很多服務(wù)或方法)。默認(rèn) fallback 函數(shù)可以針對所有類型的異常(除了exceptionsToIgnore里面排除掉的異常類型)進(jìn)行處理。若同時(shí)配置了 fallback 和 defaultFallback,則只有 fallback 會生效。defaultFallback 函數(shù)簽名要求:

    • 返回值類型必須與原函數(shù)返回值類型一致;

    • 方法參數(shù)列表需要為空,或者可以額外多一個(gè) Throwable 類型的參數(shù)用于接收對應(yīng)的異常。

    • defaultFallback 函數(shù)默認(rèn)需要和原方法在同一個(gè)類中。若希望使用其他類的函數(shù),則可以指定 fallbackClass 為對應(yīng)的類的 Class 對象,注意對應(yīng)的函數(shù)必需為 static 函數(shù),否則無法解析。

  • exceptionsToIgnore(since 1.6.0):用于指定哪些異常被排除掉,不會計(jì)入異常統(tǒng)計(jì)中,也不會進(jìn)入 fallback 邏輯中,而是會原樣拋出。

> 注:1.6.0 之前的版本 fallback 函數(shù)只針對降級異常(DegradeException)進(jìn)行處理,不能針對業(yè)務(wù)異常進(jìn)行處理。

特別地,若 blockHandler 和 fallback 都進(jìn)行了配置,則被限流降級而拋出 BlockException 時(shí)只會進(jìn)入 blockHandler 處理邏輯。若未配置 blockHandlerfallback 和 defaultFallback,則被限流降級時(shí)會將 BlockException 直接拋出。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

文章標(biāo)題:如何使用@SentinelResource注解靈活的定義控制資源以及如何配置控制策略
網(wǎng)站網(wǎng)址:http://chinadenli.net/article12/pgjddc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站外貿(mào)建站網(wǎng)站排名服務(wù)器托管Google響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作