littlehow-sentinel接入指南

寫在前面

對sentinel接入不瞭解的可以看上一篇關於sentinel接入指南的文章:

CSDN地址

掘金地址

項目背景

當一個項目涵蓋功能特別多,所有功能糅合在一起時,每次的更新維護或新需求的支撐可能會變得異常艱難;
所以在這時候就需要考慮將系統拆分爲不同功能的多個服務系統;具體如何拆分此處就不多做說明;但是拆分的系統間
是有一些依賴關係的,也就是說拆分後將會多出系統間的調用。所以時下比較流行的rpc將是系統拆分後依賴調用的不二選擇,
當前比較流行的rpc框架有阿里的dubbo和spring-cloud,還有一些如thrift這樣的rpc也還算活躍。littlehow-sentinel就是爲
spring-cloud集成做準備的(關於spring-cloud網上有太多文章介紹)。

feign相關文章

feign項目地址

深入理解feign-01

深入理解feign-02

使用littlehow-sentinel的目的

服務間的調用有出現很多單系統不會出現的問題,諸如系統間數據一致性如何保證啊、服務依賴關係管理啊等等;

littlehow-sentinel-feign主要解決的問題就是服務異常時降級、高峯調用限流

如何使用littlehow-sentinel

首先項目必須是springboot,JDK1.8

littlehow-sentinel地址:

littlehow-sentinel地址

sentinel集成

maven依賴(自己搭建的maven私服,依賴僅供參考)

<dependency>
    <groupId>com.littlehow</groupId>
    <artifactId>littlehow-sentinel</artifactId>
    <version>1.0.0</version>
</dependency>

sentinel-feign參考和複製地址

  • 源地址:https://github.com/alibaba/spring-cloud-alibaba/tree/master/alibaba-sentinel-spring-cloud/src/main/java/com/alibaba/cloud/sentinel/feign

項目如需要支持littlehow-sentinel,需要配置以下內容

#是否啓用littlehow-sentinel
feign.sentinel.enabled=true

#該項不配置的情況下默認爲(1,10,0.4#2,10,20)
#如果想要配置爲默認不降級則配置爲以下形式即可
#feign.sentinel.degrade =
#配置格式如:grade,timeWindow,count#grade,timeWindow,count
#同一個規則屬性用,隔開,多個規則用#隔開
#grade參考com.alibaba.csp.sentinel.slots.block.RuleConstant下
#  DEGRADE_GRADE_RT:平均響應時長(ms)
#  DEGRADE_GRADE_EXCEPTION_RATIO:異常率, 例:0.4表示異常數/通過數>0.4將降級;
#  DEGRADE_GRADE_EXCEPTION_COUNT:異常數
#timeWindow:單位s,10表示10秒的時間窗口內,上面的grade統計值都在10秒窗口內計算;
#count:爲double值,根據grade配置適合的數字即可
#feign.sentinel.degrade = 1,10,0.4#2,10,20

#默認爲false,表示是否除了業務異常,其餘所有異常都進行fallback處理
#false情況下,降級只有DegradeException,限流只有FlowException會fallback
#true情況下,只有BizException不會fallback,其餘異常將全部fallback
#feign.sentinel.fallback.all = false

項目中feign沒有寫fallback的情況下可以配置默認全局fallback返回

系統默認返回fallback,

限流和熔斷都將拋出SentinelException異常

SentinelException擁有getCode和getMessage方法,用於獲取異常碼和異常信息

所以需要在全局異常處理器中處理該異常

  • 熔斷降級:異常碼和異常信息爲(“degrade exception"和"666001”)

  • 限流:異常碼和異常信息爲(“too many requests"和"666002”)

支持外部定義fallback

接口實現

  • 熔斷降級需要實現:GlobalDegradeFallback接口
  • 限流需要實現:GlobalFlowFallback接口

生效

接受spring容器管理即可(也就是可以基於@Component一族或者@Bean註解即可)

註解使用

所有基於註解的限流、熔斷、降級都在調用端生效;

Flow註解

  • grade爲限流方式:FLOW_GRADE_QPS=1表示基於QPS限流,FLOW_GRADE_THREAD=0表示基於線程數限流
  • count爲限流閾值:表示QPS或者線程數達到該值則進行限流

Degrade註解

  • grade爲限流方式:上面properties配置項有說明
  • count爲限流閾值:不同grade分別表示響應時長毫秒數、異常率、異常數
  • timeWindow爲時間窗口:表示在多長的時間內(秒爲單位)達到上述配置閾值則進行降級

Rule註解

可以同時配置多個限流和降級

Fallback註解

配合Degrade降級使用,fallback方法必須和原方法參數一致,或則在原方法參數基礎下加上最後一個異常Throwable參數

沒有使用feign怎麼使用限流或降級呢

littlehow-sentinel組件提供普通降級或則限流的接入方案

基於spring容器管理的降級方案

只需要在方法上加上@Rule @Degrade @Flow註解就可自動生效

基於普通類型方案

普通方案代碼如下:

public class TestService {
    private static AtomicInteger integer = new AtomicInteger();

    /**
     * 這裏主要測試異常降級以及使用自動以fallback
     * @param name
     * @param age
     * @return
     */
    @Degrade
    @Fallback(FallbackService.class)
    public String getHello(String name, Integer age) {
        if (integer.getAndIncrement() % 2 == 0) {
            throw new IllegalArgumentException("這是自己定義的異常哦");
        }
        return "hello " + name + ", 已經" + age + "歲了";
    }

    /**
     * 這裏主要測試限流
     * @return
     */
    @Flow(count = 10)
    public String getUUID() {
        return UUID.randomUUID().toString();
    }
}

public class FallbackService {
    private static AtomicInteger integer = new AtomicInteger();
    public String getHello(String name, Integer age, Throwable t) {
        if (integer.getAndIncrement() % 2 == 0) {
            throw new SentinelException("降級fallback處理", "888888");
        }
        return "fallback hello " + name + ",  t = " + t.getClass().getName();
    }
}

public class Run {
    public static void main(String[] args) {
        testFlow();
        testDegrade();
    }

    private static void testFlow() {
        TestService service = SentinelAopUtils.getProxyObject(TestService.class);
        for (int i = 0; i < 15; i++) {
            try {
                System.out.println(service.getUUID());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private static void testDegrade() {
        TestService service = SentinelAopUtils.getProxyObject(TestService.class);
        for (int i = 0; i < 45; i ++) {
            try {
                System.out.println(service.getHello("littlehow", 18));
            } catch (IllegalArgumentException e) {
                System.out.println("error ------> " + e.getMessage());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

運行Run即可得到降級和限流效果

待完善功能

  • sentinel dashboard更改的持久化與實時同步功能
  • 支持不同的feign使用不同的全局fallback
  • 其他如gateway等的支持
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章