詳解SpringCloud微服務(wù)架構(gòu)之Hystrix斷路器
一:什么是Hystrix
在分布式環(huán)境中,許多服務(wù)依賴項(xiàng)中的一些將不可避免地失敗。Hystrix是一個(gè)庫(kù),通過(guò)添加延遲容差和容錯(cuò)邏輯來(lái)幫助您控制這些分布式服務(wù)之間的交互。Hystrix通過(guò)隔離服務(wù)之間的訪問(wèn)點(diǎn),停止其間的級(jí)聯(lián)故障以及提供回退選項(xiàng),從而提高系統(tǒng)的整體彈性。
Hystrix旨在執(zhí)行以下操作
1:對(duì)通過(guò)第三方客戶端庫(kù)訪問(wèn)(通常通過(guò)網(wǎng)絡(luò))的依賴關(guān)系提供保護(hù)并控制延遲和故障。
2:隔離復(fù)雜分布式系統(tǒng)中的級(jí)聯(lián)故障。
3:快速發(fā)現(xiàn)故障,盡快恢復(fù)。
4:回退,盡可能優(yōu)雅地降級(jí)。
5:?jiǎn)⒂媒鼘?shí)時(shí)監(jiān)控,警報(bào)和操作控制。
二:為什么需要Hystrix?
大型分布式系統(tǒng)中,一個(gè)客戶端或者服務(wù)依賴外部服務(wù),如果一個(gè)服務(wù)宕了,那么由于我們?cè)O(shè)置了服務(wù)調(diào)用系統(tǒng)超時(shí)時(shí)間,勢(shì)必會(huì)影響相應(yīng)時(shí)間,在高并發(fā)的情況下大多數(shù)服務(wù)器的線程池就出現(xiàn)阻塞(BLOCK),影響整個(gè)線上服務(wù)的穩(wěn)定性。
(圖片官方圖片)
當(dāng)一切都健康時(shí),請(qǐng)求可以看起來(lái)像這樣

當(dāng)許多后端服務(wù)系統(tǒng)中的一個(gè)宕掉時(shí),整個(gè)用戶請(qǐng)求:

如果多個(gè)客戶端調(diào)用同一個(gè)異常服務(wù)的時(shí)候,出現(xiàn)的情況是:
三:Hystrix解決什么問(wèn)題?
分布式架構(gòu)中的應(yīng)用程序具有幾十個(gè)依賴關(guān)系,每個(gè)依賴關(guān)系在某個(gè)時(shí)刻將不可避免的出現(xiàn)異常。如果應(yīng)用程序不與這些外部故障隔離,則可能出現(xiàn)線程池阻塞,引起系統(tǒng)雪崩。
例如,對(duì)于依賴30個(gè)服務(wù)的應(yīng)用程序,每個(gè)服務(wù)的正常運(yùn)行時(shí)間為99.99%,您可以:
99.99%的30次方 = 99.7%正常運(yùn)行時(shí)間
0.3%的10億次請(qǐng)求= 3,000,000次故障
2+小時(shí)宕機(jī)/月,即使所有依賴關(guān)系正常運(yùn)行時(shí)間。
當(dāng)使用Hystrix進(jìn)行熔斷后,每個(gè)依賴關(guān)系彼此隔離了,限制了當(dāng)發(fā)生延遲時(shí)的阻塞。
四:Hystrix結(jié)合Feign使用
創(chuàng)建一個(gè)工程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)建啟動(dò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)異常的時(shí)候或直接跳轉(zhuǎn)到這里實(shí)現(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();
}
先啟動(dòng):eureka_register_service(注冊(cè)中心)工程
然后運(yùn)行我們寫好的FeignHystrixApplication
這個(gè)時(shí)候我們明顯發(fā)現(xiàn)沒(méi)有運(yùn)行biz-service-0 服務(wù),那么我們 打開(kāi) http://127.0.0.1:8005/getuserinfostr
出現(xiàn)
UserClientHystrix getuserinfostr() is fallback 服務(wù)不可用。。
這個(gè)就是我們自定義的熔斷返回結(jié)果
如果不用熔斷 頁(yè)面會(huì)出現(xiàn)這個(gè)
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)原理,由于沒(méi)有全部看完所以暫時(shí)沒(méi)有寫上去,本文是結(jié)合Feign使用和學(xué)習(xí)。
有興起的可以看下官方的Hystrix很詳細(xì),就是看起來(lái)有點(diǎn)費(fèi)勁,
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java?-jar參數(shù)設(shè)置小結(jié)
本文主要介紹了Java?-jar參數(shù)設(shè)置小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
java?mybatis如何操作postgresql?array數(shù)組類型
這篇文章主要介紹了java?mybatis如何操作postgresql?array數(shù)組類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
使用mybatis-plus分頁(yè)出現(xiàn)兩個(gè)Limit的問(wèn)題解決
在使用MyBatis-Plus進(jìn)行分頁(yè)查詢時(shí),可能會(huì)遇到查詢SQL中出現(xiàn)兩個(gè)limit語(yǔ)句的問(wèn)題,這通常是由于在多個(gè)模塊中重復(fù)引入了MyBatis-Plus的分頁(yè)插件所導(dǎo)致的,下面就來(lái)介紹一下如何解決,感興趣的可以了解一下2024-10-10
Java中實(shí)現(xiàn)多重排序的幾種方法小結(jié)
Java中的多重排序通常指的是同時(shí)對(duì)一個(gè)集合中的兩個(gè)或更多列或多維度的數(shù)據(jù)進(jìn)行排序,這通常通過(guò)自定義Comparator實(shí)現(xiàn),可以結(jié)合Arrays.sort()或Collections.sort()方法,當(dāng)需要進(jìn)行多重排序時(shí),即根據(jù)多個(gè)字段進(jìn)行排序,我們可以采用以下幾種方法2024-10-10
SpringBoot3整合SpringCloud啟動(dòng)后nacos報(bào)錯(cuò)獲取不到配置、無(wú)法注冊(cè)服務(wù)的解決方案
文章介紹了如何使用Spring Boot 3.3.4和Spring Cloud 2023.0.3搭建微服務(wù)項(xiàng)目,并解決與Nacos服務(wù)注冊(cè)發(fā)現(xiàn)和配置中心的集成問(wèn)題,主要解決了依賴版本不兼容、配置文件導(dǎo)入問(wèn)題及服務(wù)注冊(cè)失敗等問(wèn)題,感興趣的朋友跟隨小編一起看看吧2025-02-02
Java如何優(yōu)雅地關(guān)閉資源try-with-resource及其異常抑制
這篇文章主要介紹了Java如何優(yōu)雅地關(guān)閉資源try-with-resource及其異常抑制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Java之Scanner.nextLine()讀取回車的問(wèn)題及解決
這篇文章主要介紹了Java之Scanner.nextLine()讀取回車的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java中g(shù)etParameterTypes()方法的使用與原理分析
本文詳細(xì)介紹了Java中g(shù)etParameterTypes()方法的使用方式、工作原理及其在實(shí)際開(kāi)發(fā)中的應(yīng)用,該方法用于獲取方法的參數(shù)類型列表,并通過(guò)反射機(jī)制在運(yùn)行時(shí)動(dòng)態(tài)地獲取這些信息,感興趣的朋友跟隨小編一起看看吧2025-01-01
Java小程序賽馬游戲?qū)崿F(xiàn)過(guò)程詳解
這篇文章主要介紹了Java小程序賽馬游戲?qū)崿F(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03

