springcloud熔斷器Hystrix的用法及說明
springcloud熔斷器Hystrix使用
說起springcloud熔斷讓我想起了去年股市中的熔斷,多次痛的領(lǐng)悟,隨意實施的熔斷對整個系統(tǒng)的影響是災(zāi)難性的,好了接下來我們還是說正事。
熔斷器
雪崩效應(yīng)
在微服務(wù)架構(gòu)中通常會有多個服務(wù)層調(diào)用,基礎(chǔ)服務(wù)的故障可能會導(dǎo)致級聯(lián)故障,進而造成整個系統(tǒng)不可用的情況,這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng)。服務(wù)雪崩效應(yīng)是一種因“服務(wù)提供者”的不可用導(dǎo)致“服務(wù)消費者”的不可用,并將不可用逐漸放大的過程。
如果下圖所示:A作為服務(wù)提供者,B為A的服務(wù)消費者,C和D是B的服務(wù)消費者。A不可用引起了B的不可用,并將不可用像滾雪球一樣放大到C和D時,雪崩效應(yīng)就形成了。

熔斷器(CircuitBreaker)
熔斷器的原理很簡單,如同電力過載保護器。它可以實現(xiàn)快速失敗,如果它在一段時間內(nèi)偵測到許多類似的錯誤,會強迫其以后的多個調(diào)用快速失敗,不再訪問遠程服務(wù)器,從而防止應(yīng)用程序不斷地嘗試執(zhí)行可能會失敗的操作,使得應(yīng)用程序繼續(xù)執(zhí)行而不用等待修正錯誤,或者浪費CPU時間去等到長時間的超時產(chǎn)生。熔斷器也可以使應(yīng)用程序能夠診斷錯誤是否已經(jīng)修正,如果已經(jīng)修正,應(yīng)用程序會再次嘗試調(diào)用操作。
熔斷器模式就像是那些容易導(dǎo)致錯誤的操作的一種代理。這種代理能夠記錄最近調(diào)用發(fā)生錯誤的次數(shù),然后決定使用允許操作繼續(xù),或者立即返回錯誤。
熔斷器開關(guān)相互轉(zhuǎn)換的邏輯如下圖:

熔斷器就是保護服務(wù)高可用的最后一道防線。
Feign Hystrix
因為熔斷只是作用在服務(wù)調(diào)用這一端,因此我們根據(jù)上一篇的示例代碼只需要改動spring-cloud-consumer項目相關(guān)代碼就可以。因為,F(xiàn)eign中已經(jīng)依賴了Hystrix所以在maven配置上不用做任何改動。
第一種方法
1、配置文件
application.properties添加這一條:
feign.hystrix.enabled=true
2、創(chuàng)建回調(diào)類
@Component
public class GradeClientImpl implements GradeClient {
@Override
public List<Grade> findAll() {
//可以:
//打印日志
//使用消息隊列發(fā)送消息
//發(fā)送短信
//測試用
List<Grade> list = new ArrayList<Grade>();
Grade grade = new Grade();
grade.setGradeId(404);
grade.setGradeName("進入了熔斷器");
list.add(grade);
return list;
}
}
3、添加fallback屬性
@FeignClient(name="eureka-grade",fallback = GradeClientImpl.class)
public interface GradeClient {
@GetMapping(value = "/grades")
List<Grade> findAll();
}
改動點就這點,很簡單吧。
第二種方法
1、添加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
2、在啟動類添加注解
@EnableHystrix
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class EurekaStudentApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaStudentApplication.class, args);
}
}
3、修改控制層代碼
@RestController
public class StudentController {
@Autowired
private StudentService studentService;
@Autowired
private GradeClient gradeClient;
@GetMapping(value = "/grades")
//一旦出錯則執(zhí)行Grades方法
@HystrixCommand(fallbackMethod = "Grades")
public List<Grade> findAll1(){
return gradeClient.findAll();
}
//出錯執(zhí)行的方法
public List<Grade> Grades() {
//可以:
//打印日志
//使用消息隊列發(fā)送消息
//發(fā)送短信
//測試
List<Grade> list = new ArrayList<>();
Grade grade = new Grade();
grade.setGradeId(0);
grade.setGradeName("出錯了,執(zhí)行了熔斷器");
list.add(grade);
return list;
}
@GetMapping(value = "/students")
public List<Student> findAll(){
return studentService.findAll();
}
}
以上兩種方法都是一樣的 然后測試一下:
那我們就來測試一下看看效果吧。
依次啟動eureka-server、eureka-client、eureka-student、eureka-grade四個項目


然后我們關(guān)閉 eureka-grade


SpringCloud使用Zuul構(gòu)建微服務(wù)網(wǎng)關(guān)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis自定義類型轉(zhuǎn)換器實現(xiàn)加解密
這篇文章主要介紹了MyBatis自定義類型轉(zhuǎn)換器實現(xiàn)加解密的相關(guān)資料,需要的朋友可以參考下2016-07-07
在SpringBoot中注入RedisTemplate實例異常的解決方案
這篇文章主要介紹了在SpringBoot中注入RedisTemplate實例異常的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringBoot?調(diào)用外部接口的三種實現(xiàn)方法
Spring Boot調(diào)用外部接口的方式有多種,常見的有以下三種方式:RestTemplate、Feign 和 WebClient,本文就詳細介紹一下,感興趣的可以了解一下2023-08-08
SSH框架網(wǎng)上商城項目第24戰(zhàn)之Struts2中處理多個Model請求的方法
這篇文章主要為大家詳細介紹了SSH框架網(wǎng)上商城項目第24戰(zhàn)之Struts2中處理多個Model請求的方法,感興趣的小伙伴們可以參考一下2016-06-06

