Spring Cloud熔斷器Hystrix

在微服務(wù)架構(gòu)中,根據(jù)業(yè)務(wù)來拆分成一個個的服務(wù)技肩,服務(wù)與服務(wù)之間可以相互調(diào)用(RPC)脏答,在Spring Cloud可以用RestTemplate+Ribbon和Feign來調(diào)用。為了保證其高可用亩鬼,單個服務(wù)通常會集群部署殖告。由于網(wǎng)絡(luò)原因或者自身的原因,服務(wù)并不能保證100%可用雳锋,如果單個服務(wù)出現(xiàn)問題黄绩,調(diào)用這個服務(wù)就會出現(xiàn)線程阻塞,此時若有大量的請求涌入玷过,Servlet容器的線程資源會被消耗完畢爽丹,導(dǎo)致服務(wù)癱瘓。服務(wù)與服務(wù)之間的依賴性辛蚊,故障會傳播粤蝎,會對整個微服務(wù)系統(tǒng)造成災(zāi)難性的嚴重后果,這就是服務(wù)故障的“雪崩”效應(yīng)袋马。

為了解決這個問題初澎,業(yè)界提出了斷路器模型。

一虑凛、斷路器簡介

Netflix has created a library called Hystrix that implements the circuit breaker pattern. In a microservice architecture it is common to have multiple layers of service calls.. —-摘自官網(wǎng)

Netflix開源了Hystrix組件碑宴,實現(xiàn)了斷路器模式,SpringCloud對這一組件進行了整合桑谍。 在微服務(wù)架構(gòu)中延柠,一個請求需要調(diào)用多個服務(wù)是非常常見的

較底層的服務(wù)如果出現(xiàn)故障,會導(dǎo)致連鎖故障锣披。當(dāng)對特定的服務(wù)的調(diào)用的不可用達到一個閥值(Hystric 是5秒20次) 斷路器將會被打開贞间。

斷路打開后贿条,可用避免連鎖故障,fallback方法可以直接返回一個固定值增热。

二整以、準備工作

這篇文章基于上一篇文章的工程,首先啟動上一篇文章的工程钓葫,啟動eureka-server 工程悄蕾;啟動service-hi工程票顾,它的端口為8762础浮。

三、在ribbon使用斷路器

改造serice-ribbon 工程的代碼奠骄,首先在pox.xml文件中加入spring-cloud-starter-hystrix的起步依賴:

org.springframework.cloud

spring-cloud-starter-hystrix

在程序的啟動類ServiceRibbonApplication 加@EnableHystrix注解開啟Hystrix:

@SpringBootApplication

@EnableDiscoveryClient

@EnableHystrix

public class ServiceRibbonApplication {

public static void main(String[] args) {

SpringApplication.run(ServiceRibbonApplication.class, args);

}

@Bean

@LoadBalanced

RestTemplate restTemplate() {

return new RestTemplate();

}

}

改造HelloService類豆同,在hiService方法上加上@HystrixCommand注解。該注解對該方法創(chuàng)建了熔斷器的功能含鳞,并指定了fallbackMethod熔斷方法影锈,熔斷方法直接返回了一個字符串,字符串為”hi,”+name+”,sorry,error!”蝉绷,代碼如下:

@Service

public class HelloService {

@Autowired

RestTemplate restTemplate;

@HystrixCommand(fallbackMethod = "hiError")

public String hiService(String name) {

return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);

}

public String hiError(String name) {

return "hi,"+name+",sorry,error!";

}

}

啟動:service-ribbon 工程鸭廷,瀏覽器顯示:

hi forezp,i am from port:8762

此時關(guān)閉 service-hi 工程,熔吗,瀏覽器會顯示:

hi ,forezp,orry,error!

這就說明當(dāng) service-hi 工程不可用的時候辆床,service-ribbon調(diào)用 service-hi的API接口時,會執(zhí)行快速失敗桅狠,直接返回一組字符串讼载,而不是等待響應(yīng)超時,這很好的控制了容器的線程阻塞中跌。

四咨堤、Feign中使用斷路器

Feign是自帶斷路器的,在D版本的Spring Cloud中漩符,它沒有默認打開一喘。需要在配置文件中配置打開它,在配置文件加以下代碼:

feign.hystrix.enabled=true

基于service-feign工程進行改造嗜暴,只需要在FeignClient的SchedualServiceHi接口的注解中加上fallback的指定類就行了:

@FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class)

public interface SchedualServiceHi {

@RequestMapping(value = "/hi",method = RequestMethod.GET)

String sayHiFromClientOne(@RequestParam(value = "name") String name);

}

SchedualServiceHiHystric需要實現(xiàn)SchedualServiceHi 接口津滞,并注入到Ioc容器中,代碼如下:

@Component

public class SchedualServiceHiHystric implements SchedualServiceHi {

@Override

public String sayHiFromClientOne(String name) {

return "sorry "+name;

}

}

啟動四servcie-feign工程灼伤,注意此時service-hi工程沒有啟動触徐,網(wǎng)頁顯示:

sorry forezp

打開service-hi工程,再次訪問狐赡,瀏覽器顯示:

hi forezp,i am from port:8762

這證明斷路器起到作用了撞鹉。

五、Hystrix Dashboard (斷路器:Hystrix 儀表盤)

基于service-ribbon 改造,F(xiàn)eign的改造和這一樣鸟雏。

首選在pom.xml引入spring-cloud-starter-hystrix-dashboard的起步依賴:

org.springframework.boot

spring-boot-starter-actuator

org.springframework.cloud

spring-cloud-starter-hystrix-dashboard

在主程序啟動類中加入@EnableHystrixDashboard注解享郊,開啟hystrixDashboard:

@SpringBootApplication

@EnableDiscoveryClient

@EnableHystrix

@EnableHystrixDashboard

public class ServiceRibbonApplication {

..//代碼省略

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市孝鹊,隨后出現(xiàn)的幾起案子炊琉,更是在濱河造成了極大的恐慌,老刑警劉巖又活,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苔咪,死亡現(xiàn)場離奇詭異,居然都是意外死亡柳骄,警方通過查閱死者的電腦和手機团赏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耐薯,“玉大人舔清,你說我怎么就攤上這事∏酰” “怎么了体谒?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長臼婆。 經(jīng)常有香客問我抒痒,道長,這世上最難降的妖魔是什么目锭? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任评汰,我火速辦了婚禮,結(jié)果婚禮上痢虹,老公的妹妹穿的比我還像新娘被去。我一直安慰自己抗俄,他們只是感情好挫酿,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剂桥,像睡著了一般丰捷。 火紅的嫁衣襯著肌膚如雪坯墨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天病往,我揣著相機與錄音捣染,去河邊找鬼。 笑死停巷,一個胖子當(dāng)著我的面吹牛耍攘,可吹牛的內(nèi)容都是我干的榕栏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蕾各,長吁一口氣:“原來是場噩夢啊……” “哼扒磁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起式曲,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤妨托,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吝羞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兰伤,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年脆贵,在試婚紗的時候發(fā)現(xiàn)自己被綠了医清。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片起暮。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡卖氨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出负懦,到底是詐尸還是另有隱情筒捺,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布纸厉,位于F島的核電站系吭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颗品。R本人自食惡果不足惜肯尺,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躯枢。 院中可真熱鬧则吟,春花似錦、人聲如沸锄蹂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽得糜。三九已至敬扛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朝抖,已是汗流浹背啥箭。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留治宣,地道東北人急侥。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓抬驴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缆巧。 傳聞我的和親對象是個殘疾皇子布持,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)陕悬,斷路器题暖,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 微服務(wù)架構(gòu)中,微服務(wù)之間相互調(diào)用捉超,springcloud可以用feign方式和RestTemplate+ribbo...
    Java黎先生閱讀 636評論 0 0
  • Spring Cloud 代碼地址:https://github.com/jedyang/springCloud ...
    運維開發(fā)筆記閱讀 742評論 0 5
  • 微服務(wù)架構(gòu)模式的核心在于如何識別服務(wù)的邊界胧卤,設(shè)計出合理的微服務(wù)。但如果要將微服務(wù)架構(gòu)運用到生產(chǎn)項目上拼岳,并且能夠發(fā)揮...
    java菜閱讀 2,940評論 0 6
  • 說明 在微服務(wù)的體系下枝誊,服務(wù)之間是與依賴關(guān)系的!服務(wù)的調(diào)用中也存在著各種可能的問題惜纸,如果一個服務(wù)處理緩慢叶撒,可能會導(dǎo)...
    hutou閱讀 4,043評論 0 3