之前Hystrix在項目中的使用(一)中我介紹過在項目中使用Hystrix注解的方式對服務(wù)進(jìn)行隔離和降級注解方式雖然簡單怎茫,方便易與使用伤柄,但是他主要的問題是Hystrix參數(shù)通過注解參數(shù)進(jìn)行設(shè)置冲茸,無法做到動態(tài)修改蚕键。 如果我們想對Hystrix進(jìn)行動態(tài)配置娃殖,則只能使用期命令式編程方法,但如果使用命令方式對原業(yè)務(wù)接口進(jìn)行改造西篓,這個成本也有點大愈腾,所以想到使用AOP的方式,通過對目標(biāo)方式進(jìn)行攔截岂津,再在攔截面上進(jìn)行Hystrix操作顶滩,這樣就無需對原有的業(yè)務(wù)代碼進(jìn)行修改
-
命令式編程
- 繼承HystrixCommand
繼承HystrixCommand,重載其getFallback()和run()方法
這里需要注意的是每個Command對象只能調(diào)用一次,不可以重復(fù)調(diào)用寸爆,重復(fù)調(diào)用對應(yīng)異常信息:This instance can only be executed once. Please instantiate a new instance礁鲁。從截圖中我們可以看出我們執(zhí)行的是helloWorldCommand的execute方法,這個方法是同步的赁豆,其效果等同于helloWorldCommand.queue().get()仅醇。
我們在run()方法中sleep3秒,Hystrix配置的參數(shù)為5秒魔种,也就是說業(yè)務(wù)應(yīng)該正常處理析二。
因此,我們就可以將業(yè)務(wù)代碼寫在繼承了HystrixCommand的run()方法中节预。
我們將Hystrix的配置參數(shù)修改為2秒叶摄,重新運行
從結(jié)果可以看出,因為run方法處理時間大于hystrix的超時時間安拟,觸發(fā)了getFallback方法蛤吓,所以我們可以在getFallback方法中來處理我們的服務(wù)降級邏輯。
在上面我們說過 helloWorldCommand.execute()是一個同步的調(diào)用糠赦,我們也可以修改這異步的調(diào)用
- 在項目中通過AOP使用Hystrix
通過命令式編程我們可以將業(yè)務(wù)方法寫在HystrixCommand的run方法中会傲,但這樣對原有業(yè)務(wù)代碼的改動太大。然后通過注解的方式拙泽,雖然對業(yè)務(wù)代碼的改動較小淌山,但是我們沒法動態(tài)的修改注冊的配置參數(shù),不夠靈活顾瞻。所以通過AOP與Hystrix相結(jié)合泼疑,對原有的業(yè)務(wù)方法進(jìn)行攔截,為其原有方法增加Hystrix的實現(xiàn)荷荤。-
增加AOP切面
Advice -
Controller
Controller -
Service
Service
-
我們在HystrixCommandAdvice中設(shè)置的withExecutionTimeoutInMilliseconds超時時間為8秒 模擬Http運行的時候為10秒 運行結(jié)果如下:
修改HystrixCommandAdvice中設(shè)置的withExecutionTimeoutInMilliseconds超時時間為12秒 運行結(jié)果如下:
-
動態(tài)修改Hystrix參數(shù)
其實說到這里已經(jīng)很明顯了退渗,只需要在HystrixCommandAdvice中來實時獲取需要的配置參數(shù)值就可以,如從配置文件梅猿,Redis氓辣,數(shù)據(jù)庫中獲取。然后將其傳到setter方法中即可袱蚓,這里我要提一下Netflix的Archaius钞啸,Archaius用于動態(tài)的管理屬性配置文件。- 引用Archaius
<dependency>
<groupId>com.netflix.archaius</groupId>
<artifactId>archaius-core</artifactId>
<version>0.6.0</version>
</dependency>
Archaius默認(rèn)會自動讀取項目類路徑下的config.properties文件喇潘。
在HystrixCommandAdvice中調(diào)用Archaius
我們可以看出控制臺打印出來的是8000体斩,正是我們在config.properties中配置的值。
我們現(xiàn)在修改這個文件的值將其修改為12000
可以看到我們這里獲取到的值是12000颖低,我們的服務(wù)并沒有重啟絮吵,也就是這樣也進(jìn)行了動態(tài)配置,這里要注意的是我們修改的是類路徑classes下的config.properties忱屑。
默認(rèn)的:Archaius會每分鐘去重新加載下屬性配置蹬敲。
到此暇昂,我們就可以在項目中使用hystrix對服務(wù)進(jìn)行降級,熔斷并通過監(jiān)控數(shù)據(jù)進(jìn)行動態(tài)調(diào)整參數(shù)伴嗡。