一:什么是hystrix
在分布式環(huán)境中,許多服務(wù)依賴項中的一些將不可避免地失敗。hystrix是一個庫,通過添加延遲容差和容錯邏輯來幫助您控制這些分布式服務(wù)之間的交互。hystrix通過隔離服務(wù)之間的訪問點,停止其間的級聯(lián)故障以及提供回退選項,從而提高系統(tǒng)的整體彈性。
hystrix旨在執(zhí)行以下操作
1:對通過第三方客戶端庫訪問(通常通過網(wǎng)絡(luò))的依賴關(guān)系提供保護并控制延遲和故障。
2:隔離復雜分布式系統(tǒng)中的級聯(lián)故障。
3:快速發(fā)現(xiàn)故障,盡快恢復。
4:回退,盡可能優(yōu)雅地降級。
5:啟用近實時監(jiān)控,警報和操作控制。
二:為什么需要hystrix?
大型分布式系統(tǒng)中,一個客戶端或者服務(wù)依賴外部服務(wù),如果一個服務(wù)宕了,那么由于我們設(shè)置了服務(wù)調(diào)用系統(tǒng)超時時間,勢必會影響相應(yīng)時間,在高并發(fā)的情況下大多數(shù)服務(wù)器的線程池就出現(xiàn)阻塞(block),影響整個線上服務(wù)的穩(wěn)定性。
(圖片官方圖片)
當一切都健康時,請求可以看起來像這樣
當許多后端服務(wù)系統(tǒng)中的一個宕掉時,整個用戶請求:
如果多個客戶端調(diào)用同一個異常服務(wù)的時候,出現(xiàn)的情況是:
三:hystrix解決什么問題?
分布式架構(gòu)中的應(yīng)用程序具有幾十個依賴關(guān)系,每個依賴關(guān)系在某個時刻將不可避免的出現(xiàn)異常。如果應(yīng)用程序不與這些外部故障隔離,則可能出現(xiàn)線程池阻塞,引起系統(tǒng)雪崩。
例如,對于依賴30個服務(wù)的應(yīng)用程序,每個服務(wù)的正常運行時間為99.99%,您可以:
99.99%的30次方 = 99.7%正常運行時間
0.3%的10億次請求= 3,000,000次故障
2+小時宕機/月,即使所有依賴關(guān)系正常運行時間。
當使用hystrix進行熔斷后,每個依賴關(guān)系彼此隔離了,限制了當發(fā)生延遲時的阻塞。
四:hystrix結(jié)合feign使用
創(chuàng)建一個工程eureka_feign_hystrix_client
pom.xml文件內(nèi)容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
<dependencies> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-feign</artifactid> </dependency> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-eureka</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-actuator</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> </dependencies> <dependencymanagement> <dependencies> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-dependencies</artifactid> <version>brixton.sr5</version> <type>pom</type> <scope> import </scope> </dependency> </dependencies> </dependencymanagement> |
創(chuàng)建啟動文件
feignhystrixapplication
1
2
3
4
5
6
7
8
9
|
@springbootapplication @enablediscoveryclient @enablefeignclients public class feignhystrixapplication { public static void main(string[] args) { springapplication.run(feignhystrixapplication. class , args); } } |
userclient類
1
2
3
4
5
6
7
8
9
|
@feignclient (value = "biz-service-0" ,fallback = userclienthystrix. class ) public interface userclient { @requestmapping (method = requestmethod.get, value = "/getuser" ) public user getuserinfo(); @requestmapping (method = requestmethod.get, value = "/getuser" ) public string getuserinfostr(); @requestmapping (method = requestmethod.get, value = "/info" ) public string info(); } |
創(chuàng)建熔斷類userclienthystrix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@service public class userclienthystrix implements userclient { @override public user getuserinfo() { throw new nullpointerexception( " user getuserinfo() 服務(wù)不可用。。" ); } @override public string getuserinfostr() { return " userclienthystrix getuserinfostr() is fallback 服務(wù)不可用。。" ; } @override public string info() { return " userclienthystrix info() is fallback 服務(wù)不可用。。" ; } } |
當網(wǎng)絡(luò)出現(xiàn)異常的時候或直接跳轉(zhuǎn)到這里實現(xiàn)類里面
創(chuàng)建action類
usercontroller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@autowired userclient userclient; @requestmapping (value = "/getuserinfo" , method = requestmethod.get) public user getuserinfo() { return userclient.getuserinfo(); } @requestmapping (value = "/getuserinfostr" , method = requestmethod.get) public string getuserinfostr() { return userclient.getuserinfostr(); } @requestmapping (value = "/info" , method = requestmethod.get) public string info() { return userclient.info(); } |
先啟動:eureka_register_service(注冊中心)工程
然后運行我們寫好的feignhystrixapplication
這個時候我們明顯發(fā)現(xiàn)沒有運行biz-service-0 服務(wù),那么我們 打開
出現(xiàn)
userclienthystrix getuserinfostr() is fallback 服務(wù)不可用。。
這個就是我們自定義的熔斷返回結(jié)果
如果不用熔斷 頁面會出現(xiàn)這個
1
2
3
4
5
6
7
8
9
|
whitelabel error page this application has no explicit mapping for /error, so you are seeing this as a fallback. wed mar 22 14 : 32 : 21 cst 2017 there was an unexpected error (type=internal server error, status= 500 ). getuserinfo failed and fallback failed. |
代碼地址:https://github.com/zhp8341/springclouddemo
本人也看了一些hystrix相關(guān)原理,由于沒有全部看完所以暫時沒有寫上去,本文是結(jié)合feign使用和學習。
有興起的可以看下官方的hystrix很詳細,就是看起來有點費勁,
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/xiaojunbo/p/7094438.html