詳解SpringCloud微服務(wù)架構(gòu)之Hystrix斷路器
一:什么是Hystrix
在分布式環(huán)境中,許多服務(wù)依賴項中的一些將不可避免地失敗。Hystrix是一個庫,通過添加延遲容差和容錯邏輯來幫助您控制這些分布式服務(wù)之間的交互。Hystrix通過隔離服務(wù)之間的訪問點,停止其間的級聯(lián)故障以及提供回退選項,從而提高系統(tǒng)的整體彈性。
Hystrix旨在執(zhí)行以下操作
1:對通過第三方客戶端庫訪問(通常通過網(wǎng)絡(luò))的依賴關(guān)系提供保護并控制延遲和故障。
2:隔離復(fù)雜分布式系統(tǒng)中的級聯(lián)故障。
3:快速發(fā)現(xiàn)故障,盡快恢復(fù)。
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)定性。
(圖片官方圖片)
當(dāng)一切都健康時,請求可以看起來像這樣
當(dāng)許多后端服務(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)系正常運行時間。
當(dāng)使用Hystrix進行熔斷后,每個依賴關(guān)系彼此隔離了,限制了當(dāng)發(fā)生延遲時的阻塞。
四:Hystrix結(jié)合Feign使用
創(chuàng)建一個工程eureka_feign_hystrix_client
pom.xml文件內(nèi)容
<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
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class FeignHystrixApplication { public static void main(String[] args) { SpringApplication.run(FeignHystrixApplication.class, args); } }
UserClient類
@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
@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ù)不可用。。"; } }
當(dāng)網(wǎng)絡(luò)出現(xiàn)異常的時候或直接跳轉(zhuǎn)到這里實現(xiàn)類里面
創(chuàng)建action類
UserController
@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ù),那么我們 打開 http://127.0.0.1:8005/getuserinfostr
出現(xiàn)
UserClientHystrix getuserinfostr() is fallback 服務(wù)不可用。。
這個就是我們自定義的熔斷返回結(jié)果
如果不用熔斷 頁面會出現(xiàn)這個
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使用和學(xué)習(xí)。
有興起的可以看下官方的Hystrix很詳細(xì),就是看起來有點費勁,
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Transactional注解導(dǎo)致Spring Bean定時任務(wù)失效的解決方法
這篇文章主要介紹了Transactional注解導(dǎo)致Spring Bean定時任務(wù)失效的解決方法,文中通過代碼示例介紹的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下2024-10-10Java與C++實現(xiàn)相同的MD5加密算法簡單實例
下面小編就為大家?guī)硪黄狫ava與C++實現(xiàn)相同的MD5加密算法簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09Java內(nèi)存溢出的幾個區(qū)域總結(jié)(注意避坑!)
內(nèi)存溢出是指應(yīng)用系統(tǒng)中存在無法回收的內(nèi)存或使用的內(nèi)存過多,最終使得程序運行要用到的內(nèi)存大于虛擬機能提供的最大內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于Java內(nèi)存溢出的幾個區(qū)域,總結(jié)出來給大家提醒注意避坑,需要的朋友可以參考下2022-11-11Maven指令打包SpringBoot項目提示沒有主清單文件問題
在Java開發(fā)中,打包Jar時常會遇到“沒有主清單屬性”的錯誤,這通常是因為在pom.xml文件中沒有正確配置maven插件導(dǎo)致的,特別是在使用自定義的<parent/>節(jié)點而非spring-boot-starter-parent時2024-09-09Springboot如何使用mybatis實現(xiàn)攔截SQL分頁
這篇文章主要介紹了Springboot使用mybatis實現(xiàn)攔截SQL分頁,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06