史上最簡單的SpringCloud教程 | 第四篇:斷路器(Hystrix)

在微服務(wù)架構(gòu)中,我們將業(yè)務(wù)拆分成一個(gè)個(gè)的服務(wù),服務(wù)與服務(wù)之間可以相互調(diào)用(RPC)惩阶。為了保證其高可用,單個(gè)服務(wù)又必須集群部署扣汪。由于網(wǎng)絡(luò)原因或者自身的原因断楷,服務(wù)并不能保證服務(wù)的100%可用,如果單個(gè)服務(wù)出現(xiàn)問題崭别,調(diào)用這個(gè)服務(wù)就會出現(xiàn)網(wǎng)絡(luò)延遲冬筒,此時(shí)若有大量的網(wǎng)絡(luò)涌入,會形成任務(wù)累計(jì)茅主,導(dǎo)致服務(wù)癱瘓舞痰,甚至導(dǎo)致服務(wù)“雪崩”。

為了解決這個(gè)問題诀姚,就出現(xiàn)斷路器模型响牛。

一、斷路器簡介

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已經(jīng)創(chuàng)建了一個(gè)名為Hystrix的庫來實(shí)現(xiàn)斷路器模式。 在微服務(wù)架構(gòu)中娃善,多層服務(wù)調(diào)用是非常常見的论衍。

HystrixGraph.png

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

HystrixFallback.png

斷路打開后炬丸,可用避免連鎖故障瘫寝,fallback方法可以直接返回一個(gè)固定值。

二稠炬、準(zhǔn)備工作

基于上一篇文章的工程焕阿,首先啟動(dòng):
基于上一節(jié)的工程,啟動(dòng)eureka-server 工程首启;啟動(dòng)service-hi工程暮屡,它的端口為8762;

三、在ribbon使用斷路器

改造serice-ribbon 工程的代碼:

在pox.xml文件中加入:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

在程序的入口類加@EnableHystrix:

@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類毅桃,加上@HystrixCommand褒纲,并指定fallbackMethod方法。


@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!";
    }
}


啟動(dòng):service-ribbon 工程钥飞,當(dāng)我們訪問http://localhost:8764/hi?name=forezp,瀏覽器顯示:

hi forezp,i am from port:8762

此時(shí)關(guān)閉 service-hi ,工程莺掠,當(dāng)我們再訪問http://localhost:8764/hi?name=forezp,瀏覽器會顯示:

hi ,forezp,orry,error!

這就證明斷路器起作用了读宙。

四彻秆、Feign中使用斷路器

如果你使用了feign,feign是自帶斷路器的结闸,并且是已經(jīng)打開了唇兑。如果使用feign不想用斷路器的話,可以在配置文件中關(guān)閉它桦锄,配置如下:

feign.hystrix.enabled=false

基于service-feign我們在改造下,只需要在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類:

@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
    @Override
    public String sayHiFromClientOne(String name) {
        return "sorry "+name;
    }
}

啟動(dòng)四servcie-feign工程扎附,打開http://localhost:8765/hi?name=forezp,注意此時(shí)service-hi還沒打開,網(wǎng)頁顯示:

sorry forezp

打開service-hi,網(wǎng)頁顯示察纯;

hi forezp,i am from port:8762

這證明斷路器起到作用了帕棉。

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

基于service-ribbon 改造下:

pom.xml加入:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
        </dependency>

在主程序入口中加入@EnableHystrixDashboard注解饼记,開啟hystrixDashboard:

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableHystrixDashboard
public class ServiceRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRibbonApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

打開瀏覽器:訪問http://localhost:8764/hystrix,界面如下:

Paste_Image.png

點(diǎn)擊monitor stream香伴,進(jìn)入下一個(gè)界面,訪問:http://localhost:8764/hi?name=forezp

此時(shí)會出現(xiàn)監(jiān)控界面:

Paste_Image.png

本文源碼下載:
https://github.com/forezp/SpringCloudLearning/tree/master/chapter4

六具则、參考資料

circuit_breaker_hystrix

feign-hystrix

hystrix_dashboard

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末即纲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子博肋,更是在濱河造成了極大的恐慌低斋,老刑警劉巖蜂厅,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異膊畴,居然都是意外死亡掘猿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門唇跨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稠通,“玉大人,你說我怎么就攤上這事买猖「拈伲” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵玉控,是天一觀的道長飞主。 經(jīng)常有香客問我,道長高诺,這世上最難降的妖魔是什么碌识? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮懒叛,結(jié)果婚禮上丸冕,老公的妹妹穿的比我還像新娘。我一直安慰自己薛窥,他們只是感情好胖烛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诅迷,像睡著了一般佩番。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罢杉,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天趟畏,我揣著相機(jī)與錄音,去河邊找鬼滩租。 笑死赋秀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的律想。 我是一名探鬼主播猎莲,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼技即!你這毒婦竟也來了著洼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎身笤,沒想到半個(gè)月后豹悬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡液荸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年瞻佛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莹弊。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涤久,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忍弛,到底是詐尸還是另有隱情,我是刑警寧澤考抄,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布细疚,位于F島的核電站,受9級特大地震影響川梅,放射性物質(zhì)發(fā)生泄漏疯兼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一贫途、第九天 我趴在偏房一處隱蔽的房頂上張望吧彪。 院中可真熱鬧,春花似錦丢早、人聲如沸姨裸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傀缩。三九已至,卻和暖如春农猬,著一層夾襖步出監(jiān)牢的瞬間赡艰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工斤葱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慷垮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓揍堕,卻偏偏與公主長得像料身,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子鹤啡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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