亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Sentinel: 使用注解限流

Kross / 611人閱讀

摘要:要使用注解來保護(hù)資源需要引入下面的依賴引入之后我們需要配置切面讓其生效,因?yàn)槭峭ㄟ^切面來實(shí)現(xiàn)的,我這邊以中使用進(jìn)行配置示列然后在需要限制的方法上加注解即可錯(cuò)誤發(fā)生在表示資源名,必填項(xiàng)處理的方法名,可選項(xiàng)。

在前面我們對Sentinel做了一個(gè)詳細(xì)的介紹,可以手動的通過Sentinel提供的SphU類來保護(hù)資源。這種做法不好的地方在于每個(gè)需要限制的地方都得寫代碼,從 0.1.1 版本開始,Sentinel 提供了 @SentinelResource 注解的方式,非常方便。

要使用注解來保護(hù)資源需要引入下面的Maven依賴:


    com.alibaba.csp
    sentinel-annotation-aspectj
    1.4.1

引入之后我們需要配置SentinelResourceAspect切面讓其生效,因?yàn)槭峭ㄟ^SentinelResourceAspect切面來實(shí)現(xiàn)的,我這邊以Spring Boot中使用進(jìn)行配置示列:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;

@Configuration
public class AopConfiguration {

    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
    
}

然后在需要限制的方法上加SentinelResource注解即可:

@SentinelResource(value = "get", blockHandler = "exceptionHandler")
@Override
public String get(String id) {
   return "http://cxytiandi.com";
}

public String exceptionHandler(String id, BlockException e) {
   e.printStackTrace();
   return "錯(cuò)誤發(fā)生在" + id;
}
SentinelResource:value

表示資源名,必填項(xiàng)

SentinelResource:blockHandler

處理 BlockException 的方法名,可選項(xiàng)。若未配置,則將 BlockException 直接拋出。

blockHandler 函數(shù)訪問范圍需要是 public

返回類型需要與原方法相匹配

參數(shù)類型需要和原方法相匹配并且最后加一個(gè)額外的參數(shù),類型為 BlockException

blockHandler 函數(shù)默認(rèn)需要和原方法在同一個(gè)類中

如果你不想讓異常處理方法跟業(yè)務(wù)方法在同一個(gè)類中,可以使用 blockHandlerClass 為對應(yīng)的類的 Class 對象,注意對應(yīng)的函數(shù)必需為 static 函數(shù),否則無法解析。

業(yè)務(wù)方法:

@SentinelResource(value = "get2", blockHandler = "handleException", blockHandlerClass = { ExceptionUtil.class })
@Override
public String get2() {
    return "http://cxytiandi.com";
}

異常處理類:

import com.alibaba.csp.sentinel.slots.block.BlockException;

public final class ExceptionUtil {

    public static String handleException(BlockException ex) {
        System.err.println("錯(cuò)誤發(fā)生: " + ex.getClass().getCanonicalName());
        return "error";
    }
    
}
如何測試?

我們可以在Spring Boot的啟動類中定義規(guī)則,然后快速訪問接口,就可以看出效果啦,或者用壓力測試工具ab等。

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        initFlowRules();
        SpringApplication.run(App.class, args);
    }
    
    private static void initFlowRules() {
        List rules = new ArrayList<>();
        
        FlowRule rule = new FlowRule();
        rule.setResource("get");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(1);
        rules.add(rule);
        
        rule = new FlowRule();
        rule.setResource("get2");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(1);
        rules.add(rule);
        
        FlowRuleManager.loadRules(rules);
    }
}
源碼分析

只需要配置了SentinelResourceAspect就可以使用注解,我們來簡單的看下SentinelResourceAspect的源碼

@Aspect
public class SentinelResourceAspect extends AbstractSentinelAspectSupport {

    @Pointcut("@annotation(com.alibaba.csp.sentinel.annotation.SentinelResource)")
    public void sentinelResourceAnnotationPointcut() {
    }

    @Around("sentinelResourceAnnotationPointcut()")
    public Object invokeResourceWithSentinel(ProceedingJoinPoint pjp) throws Throwable {
        // 獲取當(dāng)前訪問的方法
        Method originMethod = resolveMethod(pjp);
        // 獲取方法上的SentinelResource注解
        SentinelResource annotation = originMethod.getAnnotation(SentinelResource.class);
        if (annotation == null) {
            // Should not go through here.
            throw new IllegalStateException("Wrong state for SentinelResource annotation");
        }
        // 獲取資源名
        String resourceName = getResourceName(annotation.value(), originMethod);
        EntryType entryType = annotation.entryType();
        Entry entry = null;
        try {
            entry = SphU.entry(resourceName, entryType, 1, pjp.getArgs());
            Object result = pjp.proceed();
            return result;
        } catch (BlockException ex) {
            // 處理被限制的異常,回調(diào)事先配置的異常處理方法
            return handleBlockException(pjp, annotation, ex);
        } catch (Throwable ex) {
            Tracer.trace(ex);
            throw ex;
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
    }
}

上面是整個(gè)切面的代碼,對所有加了SentinelResource注解的方法進(jìn)去切入。細(xì)節(jié)代碼在AbstractSentinelAspectSupport中,大家自己去看看。

歡迎加入我的知識星球,一起交流技術(shù),免費(fèi)學(xué)習(xí)猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領(lǐng)下組隊(duì)學(xué)習(xí)Sentinel,等你哦!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/77463.html

相關(guān)文章

  • 這個(gè)注解一次搞定限流與熔斷降級:@SentinelResource

    摘要:實(shí)現(xiàn)熔斷降級注解除了可以用來做限流控制之外,還能實(shí)現(xiàn)與類似的熔斷降級策略。函數(shù)簽名要求返回值類型必須與原函數(shù)返回值類型一致方法參數(shù)列表需要為空,或者可以額外多一個(gè)類型的參數(shù)用于接收對應(yīng)的異常。若未配置和,則被限流降級時(shí)會將直接拋出。 在之前的《使用Sentinel實(shí)現(xiàn)接口限流》一文中,我們僅依靠引入Spring Cloud Alibaba對Sentinel的整合封裝spring-clo...

    Lionad-Morotar 評論0 收藏0
  • [Spring-Cloud-Alibaba] Sentinel 整合RestTemplate &am

    摘要:開發(fā)階段很有意義。源碼整合配置文件中添加來開啟編寫類,實(shí)現(xiàn)默認(rèn)用戶遠(yuǎn)程調(diào)用被限流降級,默認(rèn)用戶應(yīng)用定義可以拿到異常信息無法拿到異常信息若初啟動應(yīng)用,設(shè)置流控規(guī)則,結(jié)果展示如下默認(rèn)用戶源碼 Sentinel API Github : WIKI Sphu (指明要保護(hù)的資源名稱) Tracer (指明調(diào)用來源,異常統(tǒng)計(jì)接口) ContextUtil(標(biāo)示進(jìn)入調(diào)用鏈入口) 流控規(guī)則(針...

    libin19890520 評論0 收藏0
  • 阿里Sentinel支持Spring Cloud Gateway啦

    摘要:應(yīng)對突發(fā)請求時(shí)額外允許的請求數(shù)目。勻速排隊(duì)模式下的最長排隊(duì)時(shí)間,單位是毫秒,僅在勻速排隊(duì)模式下生效。和為后續(xù)參數(shù)匹配特性預(yù)留,目前未實(shí)現(xiàn)。 1. 前言 4月25號,Sentinel 1.6.0 正式發(fā)布,帶來 Spring Cloud Gateway 支持、控制臺登錄功能、改進(jìn)的熱點(diǎn)限流和注解 fallback 等多項(xiàng)新特性,該出手時(shí)就出手,緊跟時(shí)代潮流,昨天剛發(fā)布,今天我就要給大家分...

    chengtao1633 評論0 收藏0
  • 分布式熔斷降級平臺aegis

    摘要:現(xiàn)狀分布式場景中。因此要對在原服務(wù)不可用時(shí)進(jìn)行熔斷降級處理。分析熔斷降級可以服務(wù)端限流網(wǎng)關(guān)限流客戶端限流。它提供兩種資源隔離的模式信號量隔離和線程池隔離。支持流控熔斷降級系統(tǒng)保護(hù)等。它支持并發(fā)數(shù)的流量控制也支持熔斷降級。 現(xiàn)狀 分布式場景中。若服務(wù)不穩(wěn)定,會導(dǎo)致調(diào)用方服務(wù)也不可用,從而造成雪崩效應(yīng)。因此要對在原服務(wù)不可用時(shí)進(jìn)行熔斷降級處理。 分析 熔斷降級可以服務(wù)端限流、網(wǎng)關(guān)限流、客戶...

    ixlei 評論0 收藏0
  • Spring Cloud Alibaba基礎(chǔ)教程:Sentinel使用Apollo存儲規(guī)則

    摘要:上一篇我們介紹了如何通過的配置功能來存儲限流規(guī)則。第六步啟動應(yīng)用。深入思考在使用存儲規(guī)則配置的時(shí)候與存儲一樣,對于控制臺這些數(shù)據(jù)是只讀的,也就是說控制臺中修改規(guī)則僅存在于服務(wù)的內(nèi)存中,不會修改中的配置值,重啟后恢復(fù)原來的值。 上一篇我們介紹了如何通過Nacos的配置功能來存儲限流規(guī)則。Apollo是國內(nèi)用戶非常多的配置中心,所以,今天我們繼續(xù)說說Spring Cloud Alibaba...

    Airmusic 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<