SpringCloud Hystrix的使用
簡(jiǎn)介
在分布式系統(tǒng)中,服務(wù)與服務(wù)之間依賴錯(cuò)綜復(fù)雜,一種不可避免的情況就是某些服務(wù)將會(huì)出現(xiàn)失敗。Hystrix是一個(gè)庫(kù),它提供了服務(wù)與服務(wù)之間的容錯(cuò)功能,主要體現(xiàn)在延遲容錯(cuò)和容錯(cuò),從而做到控制分布式系統(tǒng)中的聯(lián)動(dòng)故障。Hystrix通過(guò)隔離服務(wù)的訪問(wèn)點(diǎn),阻止聯(lián)動(dòng)故障,并提供故障的解決方案,從而提高了這個(gè)分布式系統(tǒng)的彈性。
面對(duì)的問(wèn)題: 一個(gè)應(yīng)用一般會(huì)依賴多個(gè)服務(wù),每個(gè)服務(wù)由于網(wǎng)絡(luò)不可靠,機(jī)房的不可靠等等不穩(wěn)定的因素,總會(huì)導(dǎo)致服務(wù)的故障,如果我們不對(duì)這些故障做處理,就會(huì)進(jìn)而導(dǎo)致整個(gè)系統(tǒng)的不可用。
服務(wù)雪崩:


一個(gè)正常的用戶進(jìn)入調(diào)用微服務(wù)A然后調(diào)用B在調(diào)用C然后離開(kāi),而當(dāng)其中微服務(wù)C出現(xiàn)故障,導(dǎo)致用戶停留
B,越來(lái)越多的用戶進(jìn)入,請(qǐng)求,停留B在最終導(dǎo)致B的資源被耗盡,不可用,進(jìn)而A也慢慢不可用。這一系
列鏈?zhǔn)椒磻?yīng)就像雪崩一樣影響越來(lái)越大,稱為"服務(wù)雪崩"
服務(wù)熔斷
參考:chabaoo.cn/article/166784.htm
應(yīng)對(duì)雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制
當(dāng)調(diào)用鏈路的某個(gè)微服務(wù)不可用或者響應(yīng)時(shí)間太長(zhǎng)時(shí),會(huì)進(jìn)行服務(wù)熔斷,不再有該節(jié)點(diǎn)微服務(wù)的調(diào)用,快速返回錯(cuò)誤的響應(yīng)信息。當(dāng)檢測(cè)到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后,恢復(fù)調(diào)用鏈路。
在Spring Cloud中通過(guò)Hystrix實(shí)現(xiàn)。Hystrix會(huì)監(jiān)控微服務(wù)間調(diào)用的狀況,當(dāng)失敗的調(diào)用到一定閾值,缺省是5秒內(nèi)20次調(diào)用失敗,就會(huì)啟動(dòng)熔斷機(jī)制。
服務(wù)熔斷解決如下問(wèn)題:
- 當(dāng)所依賴的對(duì)象不穩(wěn)定時(shí),能夠起到快速失敗的目的;
- 快速失敗后,能夠根據(jù)一定的算法動(dòng)態(tài)試探所依賴對(duì)象是否恢復(fù)
實(shí)踐
項(xiàng)目搭建
根據(jù) 實(shí)驗(yàn)環(huán)境搭建中的項(xiàng)目copy建立一個(gè)新模塊名為springcloud-provider-dept-hystrix。
導(dǎo)入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
使用
在Controller層,使用@HystrixCommand來(lái)實(shí)現(xiàn)熔斷
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface HystrixCommand {
String groupKey() default "";
String commandKey() default "";
String threadPoolKey() default "";
String fallbackMethod() default "";
HystrixProperty[] commandProperties() default {};
HystrixProperty[] threadPoolProperties() default {};
Class<? extends Throwable>[] ignoreExceptions() default {};
ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;
HystrixException[] raiseHystrixExceptions() default {};
String defaultFallback() default "";
}
在@HystrixCommand中有 defaultFallback() 指定默認(rèn)的備用方法(default ""), fallbackMethod() 指定失敗后進(jìn)行的備用方法(default "")
當(dāng)正常的方法調(diào)用失敗后(5秒內(nèi)20次調(diào)用失敗),認(rèn)為是出故障了就進(jìn)行熔斷,快速返回錯(cuò)誤信息(調(diào)用備選方法)。
@RestController
public class DeptController {
@Autowired
private DeptImpl deptimpl;
@RequestMapping("/dev/{id}")
@HystrixCommand(fallbackMethod = "HystrixGet")//指明備用方法
public Dept DeptqueryByID(@PathVariable("id") Long id) {
Dept dept = deptimpl.queryByID(id);
System.out.println(dept);
if (dept==null) {
throw new RuntimeException("id--->" + id + "用戶不存在");
}
return dept;
}
public Dept HystrixGet(@PathVariable("id") Long id) {
Dept dept=new Dept();
dept.setDeptnumber(id.intValue());
dept.setDname("id"+id+"用戶不存在");
dept.setD_source("no~~~~~~");
return dept;
}
}
在啟動(dòng)類上添加@EnableCircuitBreaker開(kāi)啟熔斷支持
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker//開(kāi)啟熔斷支持
public class HApplication {
public static void main(String[] args) {
SpringApplication.run(HApplication.class,args);
}
}
服務(wù)降級(jí)
即在服務(wù)器壓力劇增的情況下,關(guān)閉一些很少被調(diào)用的服務(wù),騰出一些資源,保證正常運(yùn)行。
如淘寶雙十一關(guān)閉退款通道。
實(shí)踐
在原本的FeignClient指明fallbackFactory
@FeignClient(value = "PROVIDER-NAME",fallbackFactory = SerciceFallbackFactory.class)
public interface DeptClientService {
@RequestMapping(value = "/dev/add")
boolean add(Dept dept);
@RequestMapping(value = "/dev/{id}")
Dept queryByID(@PathVariable("id") Long id );
@PostMapping(value = "/dev/list")
List<Dept> queryAll();
}
定義自己的FallbackFactory
報(bào)錯(cuò)注意import feign.hystrix.FallbackFactory;
import feign.hystrix.FallbackFactory;
@Component
public class SerciceFallbackFactory implements FallbackFactory {
public DeptClientService create(Throwable cause) {
return new DeptClientService() {
public boolean add(Dept dept) {
return false;
}
//定義返回的錯(cuò)誤信息
public Dept queryByID(Long id) {
Dept dept = new Dept();
dept.setD_source("服務(wù)降級(jí)");
dept.setDname("fail");
dept.setDeptnumber(-1);
return dept;
}
public List<Dept> queryAll() {
return null;
}
};
}
}
在客戶端的配置文件中添加
#開(kāi)啟降級(jí)
feign:
hystrix:
enabled: true
結(jié)果:在我們關(guān)閉服務(wù)端后再次訪問(wèn)服務(wù)時(shí)

服務(wù)熔斷與服務(wù)降級(jí)的區(qū)別
- 服務(wù)熔斷是在服務(wù)端進(jìn)行的,而服務(wù)降級(jí)是在客戶端進(jìn)行的
- 服務(wù)熔斷的原因:發(fā)生故障,服務(wù)降級(jí):為整體負(fù)荷考慮,保證核心業(yè)務(wù)的運(yùn)行
服務(wù)監(jiān)控 Dashboard
建立項(xiàng)目
導(dǎo)入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
配置文件
server:
port: 9001
hystrix:
dashboard:
# Hystrix Dashboard會(huì)通過(guò)proxyUrl解析到host部分,然后通過(guò)配置的proxyStreamAllowList。判定是否允許被訪問(wèn)
proxy-stream-allow-list: "localhost"
開(kāi)啟監(jiān)控支持
@SpringBootApplication
@EnableHystrixDashboard//開(kāi)啟
@EnableDiscoveryClient
public class DashboardApplication {
public static void main(String[] args) {
SpringApplication.run(DashboardApplication.class,args);
}
}
運(yùn)行后訪問(wèn):http://localhost:9001/hystrix

根據(jù)提示在spingcloud-provider-dept-hystrix服務(wù)端添加bean
@Bean
public ServletRegistrationBean hystrixMetricsStreamServlet(){
ServletRegistrationBean servlet = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
servlet.addUrlMappings("/actuator/hystrix.stream");
return servlet;
}
運(yùn)行后訪問(wèn) http://localhost:8081/actuator/hystrix.stream 可以獲得一些服務(wù)的信息
注意: 需要調(diào)用一次標(biāo)注有 @HystrixCommand 方法才會(huì)有數(shù)據(jù)顯示,只會(huì)監(jiān)控有 @HystrixCommand 的方法

我們也可以通過(guò)在http://localhost:9001/hystrix 輸入

按下按鈕開(kāi)啟對(duì)該服務(wù)的監(jiān)控


以上就是SpringCloud Hystrix的使用的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud Hystrix的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作
驗(yàn)證碼登錄是非常常見(jiàn)的一種登錄方式,能夠簡(jiǎn)化用戶登錄的過(guò)程,本文主要介紹了SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
Java替換int數(shù)組中重復(fù)數(shù)據(jù)的方法示例
這篇文章主要介紹了Java替換int數(shù)組中重復(fù)數(shù)據(jù)的方法,涉及java針對(duì)數(shù)組的遍歷、轉(zhuǎn)換、判斷等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
詳解SpringBoot集成Redis來(lái)實(shí)現(xiàn)緩存技術(shù)方案
本篇文章主要介紹了詳解SpringBoot集成Redis來(lái)實(shí)現(xiàn)緩存技術(shù)方案,具有一定的參考價(jià)值,有興趣的可以了解一下2017-06-06
Java將對(duì)象寫入文件讀出_序列化與反序列化的實(shí)例
下面小編就為大家?guī)?lái)一篇Java將對(duì)象寫入文件讀出_序列化與反序列化的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
Java8使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并(去重并求和)
這篇文章主要介紹了Java8使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并(去重并求和),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
SpringBoot實(shí)現(xiàn)轉(zhuǎn)頁(yè)功能
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)轉(zhuǎn)頁(yè)功能,頁(yè)面的跳轉(zhuǎn)在web開(kāi)發(fā)中是經(jīng)常用的基礎(chǔ)功能,感興趣想要詳細(xì)了解可以閱讀下文,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2023-05-05
Java線程監(jiān)聽(tīng),意外退出線程后自動(dòng)重啟的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Java線程監(jiān)聽(tīng),意外退出線程后自動(dòng)重啟的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
java如何發(fā)送get請(qǐng)求獲取數(shù)據(jù)(附代碼)
這篇文章主要給大家介紹了關(guān)于java如何發(fā)送get請(qǐng)求獲取數(shù)據(jù)的相關(guān)資料,Java中的GET請(qǐng)求方法是HTTP協(xié)議中的一種請(qǐng)求方式,用于向服務(wù)器請(qǐng)求獲取資源,需要的朋友可以參考下2023-10-10
關(guān)于BindingResult的使用總結(jié)及注意事項(xiàng)
這篇文章主要介紹了關(guān)于BindingResult的使用總結(jié)及注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

