Hystrix:熔斷器朝刊,容錯(cuò)管理工具耀里,旨在通過熔斷機(jī)制控制服務(wù)和第三方庫(kù)的節(jié)點(diǎn),從而對(duì)延遲和故障提供更強(qiáng)大的容錯(cuò)能力。
github地址:https://github.com/Netflix/hystrix
微服務(wù)存在的問題
在微服務(wù)架構(gòu)中拾氓,我們將系統(tǒng)拆分為很多個(gè)服務(wù)冯挎,各個(gè)服務(wù)之間通過注冊(cè)與訂閱的方式相互依賴,由于各個(gè)服務(wù)都是在各自的進(jìn)程中運(yùn)行咙鞍,就有可能由于網(wǎng)絡(luò)原因或者服務(wù)自身的問題導(dǎo)致調(diào)用故障或延遲房官,隨著服務(wù)的積壓,可能會(huì)導(dǎo)致服務(wù)崩潰续滋。為了解決這一系列的問題易阳,斷路器等一系列服務(wù)保護(hù)機(jī)制出現(xiàn)了。
斷路器本身是一種開關(guān)保護(hù)機(jī)制吃粒,類似于保險(xiǎn)絲潦俺,用于在電路上保護(hù)線路過載,當(dāng)線路中有電器發(fā)生短路時(shí),斷路器能夠及時(shí)切斷故障電路事示,防止發(fā)生過載早像、發(fā)熱甚至起火等嚴(yán)重后果。
在分布式架構(gòu)中肖爵,斷路器模式的作用也是類似的卢鹦。
針對(duì)上述問題,Spring Cloud Hystrix 實(shí)現(xiàn)了斷路器劝堪、線路隔離等一系列服務(wù)保護(hù)功能冀自。它也是基于 Netflix 的開源框架 Hystrix 實(shí)現(xiàn)的,該框架的目標(biāo)在于通過控制那些訪問遠(yuǎn)程系統(tǒng)秒啦、服務(wù)和第三方庫(kù)的節(jié)點(diǎn)熬粗,從而對(duì)延遲和故障提供更強(qiáng)大的容錯(cuò)能力。Hystrix 具備服務(wù)降級(jí)余境、服務(wù)熔斷驻呐、線程和信號(hào)隔離、請(qǐng)求緩存芳来、請(qǐng)求合并以及服務(wù)監(jiān)控等強(qiáng)大功能含末。
官方完整文檔,操作詳細(xì)信息和其他信息:https://github.com/Netflix/Hystrix/wiki
API文檔:https://netflix.github.io/Hystrix/javadoc/
場(chǎng)景展現(xiàn)
在上一篇文章Ribbon
(消費(fèi)者)的基礎(chǔ)下測(cè)試
訪問http://localhost:9999/consumer
關(guān)閉掉8082的實(shí)例即舌,再刷新服務(wù)的時(shí)候可以看到
端口為8082服務(wù)掛掉了并顯示出錯(cuò)誤信息
這樣的顯示對(duì)于用戶來說是十分不好的佣盒,這樣就需要引入斷路器
實(shí)現(xiàn)斷路器Hystrix
本次是在上一篇Ribbon(消費(fèi)者)的工程上搭建的
http://www.reibang.com/p/ede7aae5d78e
引入Spring Cloud Hystrix
的依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
使用 @EnableCircuitBreaker
注解開啟斷路器功能
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class SpringcloudConsumerRibbonApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SpringcloudConsumerRibbonApplication.class, args);
}
}
在Controller
調(diào)用方法的method
加上@HystrixCommand
注解,聲明依賴服務(wù)調(diào)用延遲或失敗時(shí)調(diào)用的方法
@RestController
public class RibbonController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/consumer")
@HystrixCommand(fallbackMethod ="Failback")
public String getMsg() {
return restTemplate.getForObject("http://springcloud-eureka-client/client", String.class);
}
public String Failback(){
return "服務(wù)中斷連接顽聂,請(qǐng)聯(lián)系管理員";
}
}
配置文件可以不用改(有需要設(shè)置參數(shù)的可以參考文章下方的推薦文章)
整體項(xiàng)目結(jié)構(gòu)(基本上可Ribbon的一樣)
Eureka
服務(wù)端 端口號(hào)是9090
兩個(gè)Eureka
客戶端 端口號(hào)分別是8081和8082 相同的服務(wù)名springcloud-eureka-client
Ribbon
消費(fèi)者客戶端 端口號(hào)是9999
啟動(dòng)服務(wù)進(jìn)行測(cè)試
先啟動(dòng)服務(wù)端再啟動(dòng)客戶端肥惭,客戶端啟動(dòng)順序沒要求
啟動(dòng)完后我們?cè)L問http://localhost:9999/consumer
關(guān)閉掉8082的實(shí)例,再刷新服務(wù)的時(shí)候可以看到
設(shè)置的服務(wù)中斷回調(diào)方法使用了芜飘,說明斷路器生效了
使用Hystrix-Dashboard實(shí)現(xiàn)hystrix
服務(wù)監(jiān)控功能
github地址:https://github.com/Netflix-Skunkworks/hystrix-dashboard
hystrix
還提供了服務(wù)監(jiān)控功能务豺,可以監(jiān)控服務(wù)消費(fèi)者的接口調(diào)用狀態(tài)磨总,但返回的監(jiān)控?cái)?shù)據(jù)為json
數(shù)據(jù)嗦明,不適合我們查看,因此需要我們搭建hystrix-dashboard
服務(wù)蚪燕,把json
數(shù)據(jù)整理為圖形化數(shù)據(jù)
1.引入hystrix-dashboard
依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
2.在主類中添加@EnableHystrixDashboard
注解開啟Hystrix
儀表盤
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableHystrixDashboard
public class SpringcloudConsumerRibbonApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SpringcloudConsumerRibbonApplication.class, args);
}
}
3.配置hystrix-metrics-event-stream
在整個(gè)監(jiān)控統(tǒng)計(jì)過程中娶牌,最主要的是用到hystrix-metrics-event-stream
hystrix-metrics-event-stream
:只要客戶端連接還連著,hystrix-metrics-event-stream
就會(huì)不斷的向客戶端以text/event-stream
的形式推送計(jì)數(shù)結(jié)果(metrics)
使用hystrix-metrics-event-stream
需要寫個(gè)配置類
@Configuration
public class HystrixMetricsStreamConfig {
@Bean
public HystrixMetricsStreamServlet hystrixMetricsStreamServlet(){
return new HystrixMetricsStreamServlet();
}
@Bean
public ServletRegistrationBean registration(HystrixMetricsStreamServlet servlet){
ServletRegistrationBean registrationBean = new ServletRegistrationBean();
registrationBean.setServlet(servlet);
registrationBean.setEnabled(true);
registrationBean.addUrlMappings("/hystrix.stream");
return registrationBean;
}
}
加上@Configuration
注解聲明為配置類
配置類中默認(rèn)的監(jiān)控路徑是/hystrix.stream
如果不寫的話是監(jiān)控不了的
完成上述配置后馆纳,訪問http://localhost:9999/hystrix可以看到小熊界面說明配置成功
輸入監(jiān)控的
stream
和title
诗良,點(diǎn)擊Monitor Stream
,便會(huì)出現(xiàn)圖形化的監(jiān)控頁(yè)面鲁驶。一般只需要填入監(jiān)控地址就可以了鉴裹,例如需要監(jiān)控端口號(hào)為9999的服務(wù)
就填入http://localhost:9999/hystrix.stream
點(diǎn)擊
Monitor Stream
,進(jìn)去都看到Loading...
,因?yàn)槎丝?999的服務(wù)還沒調(diào)用下面來訪問下http://localhost:9999/consumer
便會(huì)出現(xiàn)圖形化的監(jiān)控頁(yè)面径荔,這樣就實(shí)現(xiàn)了監(jiān)控的效果了督禽。
推薦文章:
關(guān)于Hystrix和Hystrix-Dashboard各種配置參數(shù)可以參考:https://blog.csdn.net/tongtong_use/article/details/78611225
關(guān)于hystrix-metrics-event-stream源碼解析的可以參考https://www.cnblogs.com/zhangwanhua/p/7904625.html