Hystrix 简介和使用
Hystrix
- 一、概念
- 二、使用
- 1. 環(huán)境搭建
- 2. 服務(wù)降級(jí)
- 3. 異常熔斷
- 4. 自定義異常熔斷器
- 5.Hystrix儀表盤監(jiān)控
- 三、測(cè)試
- 1. 異常熔斷
- 2. 超時(shí)熔斷
- 3. 熔斷器獲得異常
- 4. 異常忽略
- 5. 自定義異常熔斷器
一、概念
為了解決上述問題,微服務(wù)架構(gòu)中引入了熔斷器的服務(wù)保護(hù)機(jī)制。
二、使用
1. 環(huán)境搭建
在消費(fèi)端加入依賴:spring-cloud-starter-netflix-hystrix
在入口類使用@EnableCircuitBreaker注解開啟熔斷器功能,也可以使用@SpringCloudApplication注解來代替主類上的三個(gè)注解
在消費(fèi)端調(diào)用遠(yuǎn)程服務(wù)的方法上添加注解:@HystrixCommand(fallbackMethod="error",commandProperties={ @HystrixProperty(name="execution.isolation.thread.timeoutInMillisecond",value="1500") })標(biāo)記當(dāng)前控制器方法采用Hystrix熔斷機(jī)制,當(dāng)遠(yuǎn)程服務(wù)出現(xiàn)了異常或超時(shí),就會(huì)自動(dòng)進(jìn)行熔斷。
- 屬性fallbackMethod用于指定一個(gè)本地方法的名稱,當(dāng)服務(wù)熔斷以后就會(huì)調(diào)用這個(gè)方法來替代服務(wù)提供者的響應(yīng)信息。避免用戶看到錯(cuò)誤信息或無限等待。
- 屬性commandProperties可以指定超時(shí)時(shí)間。
2. 服務(wù)降級(jí)
當(dāng)某個(gè)服務(wù)熔斷之后,服務(wù)端提供的服務(wù)不再被調(diào)用,此時(shí)由客戶端自己準(zhǔn)備一個(gè)本地的fallbackMethod回調(diào),返回一個(gè)默認(rèn)值來代表服務(wù)端的返回。
這種做法,雖然不能得到正確的返回結(jié)果,但至少保證了服務(wù)的可用,比直接拋出錯(cuò)誤或服務(wù)的不可用要好得多,當(dāng)然這需要根據(jù)業(yè)務(wù)場(chǎng)景來選擇。
3. 異常熔斷
我們?cè)谡{(diào)用服務(wù)提供者時(shí),我們會(huì)有可能拋出異常,默認(rèn)情況下方法拋出了異常會(huì)自動(dòng)進(jìn)行服務(wù)降級(jí),交給服務(wù)降級(jí)中的方法去處理;
當(dāng)我們自己發(fā)生異常后,只需要在服務(wù)降級(jí)方法中添加一個(gè)Throwable類型的參數(shù)就能夠獲取到拋出的異常的類型,如下:
如果遠(yuǎn)程服務(wù)有一個(gè)異常拋出后我們不希望進(jìn)入到服務(wù)降級(jí)方法中去處理,而是直接講異常拋出給用戶,那么我們可以在@HystrixCommand注解中添加忽略異常@HystrixCommand(fallbackMethod = "error", ignoreExceptions = { HttpServerErrorException.InternalServerError.class})
4. 自定義異常熔斷器
我們也可以自定義類繼承HystrixCommand來實(shí)現(xiàn)自定義的Hystrix請(qǐng)求,在getFallback方法中調(diào)用getExecutionException方法來獲取服務(wù)拋出的異常;
public class MyHystrixCommand extends HystrixCommand<String> {private RestTemplate restTemplate;private String url;/*** 定義一個(gè)有參構(gòu)造(必須)由于弗雷沒有無參構(gòu)造因此子類必須使用有參構(gòu)造*/public MyHystrixCommand(Setter setter, RestTemplate restTemplate, String url) {super(setter);this.restTemplate = restTemplate;this.url = url;}/*** 這個(gè)方法不能手動(dòng)調(diào)用,Spring會(huì)自動(dòng)調(diào)用這個(gè)方法來訪問我們的服務(wù)提供者*/@Overridepublic String run() throws Exception {return restTemplate.getForEntity(url,String.class).getBody();}/*** 服務(wù)降級(jí)方法:當(dāng)Spring自動(dòng)調(diào)用run方法以后,如果服務(wù)出現(xiàn)了異常則自動(dòng)調(diào)用這個(gè)服務(wù)降級(jí)方法來進(jìn)行異常的熔斷處理*/@Overridepublic String getFallback() {//獲取異常信息System.out.println(super.getFailedExecutionException().getClass());System.out.println(super.getFailedExecutionException().getMessage());return "自定義異常熔斷器熔斷了服務(wù)";} }5.Hystrix儀表盤監(jiān)控
Hystrix儀表盤(Hystrix Dashboard):監(jiān)控Hystrix的實(shí)時(shí)運(yùn)行狀態(tài),通過查看Hystrix的各項(xiàng)指標(biāo)信息,從而快速發(fā)現(xiàn)系統(tǒng)中的問題進(jìn)而解決它。
這個(gè)功能我們可以在原來的消費(fèi)者應(yīng)用上添加,讓原來的消費(fèi)者具備Hystrix儀表盤功能,但一般的,微服務(wù)架構(gòu)思想推崇服務(wù)的拆分,Hystrix Dashboard也是一個(gè)服務(wù),所以通常會(huì)單獨(dú)創(chuàng)建一個(gè)新的工程專用做Hystrix Dashboard服務(wù)。
消費(fèi)端配置:
Hystrix Dashboard 服務(wù)端:
點(diǎn)擊進(jìn)入:
三、測(cè)試
1. 異常熔斷
- provider:
- consumer:
- 結(jié)果:由于服務(wù)端的異常,消費(fèi)端使用了熔斷機(jī)制
2. 超時(shí)熔斷
- provider:
- consumer:
- 結(jié)果:沒有熔斷機(jī)制的時(shí)候會(huì)一直等待15s,得到服務(wù);
有熔斷機(jī)制的時(shí)候調(diào)用error函數(shù),進(jìn)行服務(wù)降級(jí)。
3. 熔斷器獲得異常
- 服務(wù)端異常
- 結(jié)果:使用熔斷機(jī)制并且輸出異常信息
- 消費(fèi)端異常
- 結(jié)果:使用熔斷機(jī)制輸出異常信息
4. 異常忽略
-
服務(wù)端
-
消費(fèi)端
-
結(jié)果(錯(cuò)誤直接暴露給用戶)
5. 自定義異常熔斷器
- 消費(fèi)端
- 服務(wù)端沒有異常時(shí):得到服務(wù)端的響應(yīng)
- 服務(wù)端有異常時(shí):熔斷機(jī)制服務(wù)降級(jí)
總結(jié)
以上是生活随笔為你收集整理的Hystrix 简介和使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pandas中的元素替换
- 下一篇: Android官方开发文档Trainin