文章目錄
寫在前面
對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地址:
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等的支持