Hystrix熔斷器

簡介:Hystix 是 Netflix 開源的一個(gè)延遲和容錯(cuò)庫瑟捣,用于隔離訪問遠(yuǎn)程服務(wù)馋艺、第三方庫,防止出現(xiàn)級(jí)聯(lián)失斅跆住(雪崩)捐祠。

Hystix 主要功能

?隔離

? ? ?1、線程池隔離

? ? ? 2桑李、信號(hào)量隔離

?降級(jí)

?熔斷

?限流

一雏赦、隔離

(1)線程池隔離

不進(jìn)行隔離時(shí),當(dāng)服務(wù)請(qǐng)求A芙扎,線程池進(jìn)行調(diào)用星岗,調(diào)用完需要?dú)w還給線程池。假如C無響應(yīng)戒洼,則線程池100個(gè)線程全給到C俏橘,則其他線程不夠用。

而Hystrix自動(dòng)進(jìn)行線程池隔離圈浇,對(duì)請(qǐng)求會(huì)進(jìn)行分配寥掐,一個(gè)服務(wù)失敗,只會(huì)把分配給它的線程使用完磷蜀,不會(huì)占用其他線程召耘。

(2)信號(hào)量隔離

? ?如:限制對(duì)其中一個(gè)服務(wù)的訪問次數(shù),訪問人數(shù)

二褐隆、熔斷

假如某服務(wù)一直錯(cuò)污它,把所有服務(wù)全熔斷。還有恢復(fù)機(jī)制,等服務(wù)恢復(fù)時(shí)衫贬,讓整個(gè)服務(wù)恢復(fù)德澈。

三、降級(jí)

Hystix 降級(jí):當(dāng)服務(wù)發(fā)生異彻坦撸或調(diào)用超時(shí)梆造,返回默認(rèn)數(shù)據(jù)。

降級(jí)思路:

(1)Hystrix 降級(jí) – 服務(wù)提供方

? ? ? ?1.在服務(wù)提供方葬毫,引入 hystrix 依賴

????????2.定義降級(jí)方法

????????3.使用 @HystrixCommand 注解配置降級(jí)方法

????????4.在啟動(dòng)類上開啟Hystrix功能:@EnableCircuitBreaker

(2)Hystrix 降級(jí) – 服務(wù)消費(fèi)方

????????1.feign 組件已經(jīng)集成了 hystrix 組件镇辉。

????????2.定義feign 調(diào)用接口實(shí)現(xiàn)類,復(fù)寫方法贴捡,即 降級(jí)方法

????????3.在 @FeignClient 注解中使用 fallback 屬性設(shè)置降級(jí)處理類摊聋。

????????4.配置開啟 feign.hystrix.enabled = true

代碼舉例:

?Goods Controller 服務(wù)提供方Hystrix降級(jí):

@RestController

@RequestMapping("/goods")

public class GoodsController {

? ? @Autowired

? ? private GoodsService goodsService;

? ? @Value("${server.port}")

? ? private int port;

? ? /**

? ? * 降級(jí):

? ? *? 1. 出現(xiàn)異常

? ? *? 2. 服務(wù)調(diào)用超時(shí)

? ? *? ? ? * 默認(rèn)1s超時(shí)

? ? *

? ? *? @HystrixCommand(fallbackMethod = "findOne_fallback")

? ? *? ? ? fallbackMethod:指定降級(jí)后調(diào)用的方法名稱

? ? */

? ? @GetMapping("/findOne/{id}")

? ? @HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {

? ? ? ? ? ? //設(shè)置Hystrix的超時(shí)時(shí)間,默認(rèn)1s

? ? ? ? ? ? @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000")

? ? })

? ? public Goods findOne(@PathVariable("id") int id){

? ? ? ? //1.造個(gè)異常

? ? ? ? // int i = 3/0;

? ? ? ? try {

? ? ? ? ? ? //2. 休眠2秒

? ? ? ? ? ? Thread.sleep(2000);

? ? ? ? } catch (InterruptedException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? ? ? Goods goods = goodsService.findOne(id);

? ? ? ? goods.setTitle(goods.getTitle() + ":" + port);//將端口號(hào)栈暇,設(shè)置到了 商品標(biāo)題上

? ? ? ? return goods;

? ? }

? ? /**

? ? * 定義降級(jí)方法:

? ? *? 1. 方法的返回值需要和原方法一樣

? ? *? 2. 方法的參數(shù)需要和原方法一樣

? ? */

? ? public Goods findOne_fallback(int id){

? ? ? ? Goods goods = new Goods();

? ? ? ? goods.setTitle("降級(jí)了~~~");

? ? ? ? return goods;

? ? }

}

消費(fèi)者端 調(diào)用服務(wù)的降級(jí):

GoodsFeignClient.java:

@FeignClient(value = "HYSTRIX-PROVIDER",fallback = GoodsFeignClientFallback.class)

public interface GoodsFeignClient {

? ? @GetMapping("/goods/findOne/{id}")

? ? public Goods findGoodsById(@PathVariable("id") int id);

}

GoodsFeignClientFallback.java:

/**

* Feign 客戶端的降級(jí)處理類

* 1. 定義類 實(shí)現(xiàn) Feign 客戶端接口

* 2. 使用@Component注解將該類的Bean加入SpringIOC容器

*/

@Component

public class GoodsFeignClientFallback implements GoodsFeignClient {

? ? @Override

? ? public Goods findGoodsById(int id) {

? ? ? ? Goods goods = new Goods();

? ? ? ? goods.setTitle("又被降級(jí)了~~~");

? ? ? ? return goods;

? ? }

}

四、熔斷

可修改默認(rèn)參數(shù)箍镜,修改熔斷監(jiān)控時(shí)間和次數(shù):

@GetMapping("/findOne/{id}")

? ? @HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {

? ? ? ? ? ? //設(shè)置Hystrix的超時(shí)時(shí)間源祈,默認(rèn)1s

? ? ? ? ? ? @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000"),

? ? ? ? ? ? //監(jiān)控時(shí)間 默認(rèn)5000 毫秒

? ? ? ? ? ? @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "5000"),

? ? ? ? ? ? //失敗次數(shù)。默認(rèn)20次

? ? ? ? ? ? @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "20"),

? ? ? ? ? ? //失敗率 默認(rèn)50%

? ? ? ? ? ? @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "50")

? ? })

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末色迂,一起剝皮案震驚了整個(gè)濱河市香缺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歇僧,老刑警劉巖图张,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诈悍,居然都是意外死亡祸轮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門侥钳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來适袜,“玉大人,你說我怎么就攤上這事舷夺】嘟矗” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵给猾,是天一觀的道長疫萤。 經(jīng)常有香客問我,道長敢伸,這世上最難降的妖魔是什么扯饶? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上帝际,老公的妹妹穿的比我還像新娘蔓同。我一直安慰自己,他們只是感情好蹲诀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布斑粱。 她就那樣靜靜地躺著,像睡著了一般脯爪。 火紅的嫁衣襯著肌膚如雪则北。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天痕慢,我揣著相機(jī)與錄音尚揣,去河邊找鬼。 笑死掖举,一個(gè)胖子當(dāng)著我的面吹牛快骗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播塔次,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼方篮,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了励负?” 一聲冷哼從身側(cè)響起藕溅,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎继榆,沒想到半個(gè)月后巾表,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡略吨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年集币,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翠忠。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惠猿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出负间,到底是詐尸還是另有隱情偶妖,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布政溃,位于F島的核電站趾访,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏董虱。R本人自食惡果不足惜扼鞋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一申鱼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧云头,春花似錦捐友、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昏滴,卻和暖如春猴鲫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谣殊。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工拂共, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姻几。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓宜狐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛇捌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抚恒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355