SpringCloud-Hystrix組件使用方法
https://github.com/Netflix/Hystrix
在分布式環(huán)境中,許多服務(wù)依賴(lài)項(xiàng)不可避免地會(huì)失敗。Hystrix是一個(gè)庫(kù),它通過(guò)添加延遲容忍和容錯(cuò)邏輯來(lái)幫助您控制這些分布式服務(wù)之間的交互。Hystrix通過(guò)隔離服務(wù)之間的訪問(wèn)點(diǎn)、停止它們之間的級(jí)聯(lián)故障以及提供后備選項(xiàng)來(lái)實(shí)現(xiàn)這一點(diǎn),所有這些都可以提高系統(tǒng)的整體彈性。
通俗定義: Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲和容錯(cuò)的開(kāi)源庫(kù),在分布式系統(tǒng)中,許多依賴(lài)不可避免的會(huì)調(diào)用失敗,超時(shí)、異常等,Hystrix能夠保證在一個(gè)依賴(lài)出問(wèn)題的情況下,不會(huì)導(dǎo)致整體服務(wù)失敗,避免級(jí)聯(lián)故障(服務(wù)雪崩現(xiàn)象),提高分布式系統(tǒng)的彈性。
1.服務(wù)雪崩
1.服務(wù)雪崩在微服務(wù)之間進(jìn)行服務(wù)調(diào)用是由于某一個(gè)服務(wù)故障,導(dǎo)致級(jí)聯(lián)服務(wù)故障的現(xiàn)象,稱(chēng)為雪崩效應(yīng)。雪崩效應(yīng)描述的是提供方不可用,導(dǎo)致消費(fèi)方不可用并將不可用逐漸放大的過(guò)程。
2.圖解雪崩效應(yīng)如存在如下調(diào)用鏈路:
而此時(shí),Service A的流量波動(dòng)很大,流量經(jīng)常會(huì)突然性增加!那么在這種情況下,就算Service A能扛得住請(qǐng)求,Service B和Service C未必能扛得住這突發(fā)的請(qǐng)求。此時(shí),如果Service C因?yàn)榭共蛔≌?qǐng)求,變得不可用。那么Service B的請(qǐng)求也會(huì)阻塞,慢慢耗盡Service B的線程資源,Service B就會(huì)變得不可用。緊接著,Service A也會(huì)不可用,這一過(guò)程如下圖所示
2.服務(wù)熔斷
1.服務(wù)熔斷“熔斷器”本身是一種開(kāi)關(guān)裝置,當(dāng)某個(gè)服務(wù)單元發(fā)生故障之后,通過(guò)斷路器的故障監(jiān)控,某個(gè)異常條件被觸發(fā),直接熔斷整個(gè)服務(wù)。向調(diào)用方法返回一個(gè)符合預(yù)期的、可處理的備選響應(yīng)(FallBack),而不是長(zhǎng)時(shí)間的等待或者拋出調(diào)用方法無(wú)法處理的異常,就保證了服務(wù)調(diào)用方的線程不會(huì)被長(zhǎng)時(shí)間占用,避免故障在分布式系統(tǒng)中蔓延,乃至雪崩。如果目標(biāo)服務(wù)情況好轉(zhuǎn)則恢復(fù)調(diào)用。服務(wù)熔斷是解決服務(wù)雪崩的重要手段。
2.服務(wù)熔斷圖示
3.服務(wù)降級(jí)
1.服務(wù)降級(jí)說(shuō)明
- 服務(wù)壓力劇增的時(shí)候根據(jù)當(dāng)前的業(yè)務(wù)情況及流量對(duì)一些服務(wù)和頁(yè)面有策略的降級(jí),以此環(huán)節(jié)服務(wù)器的壓力,以保證核心任務(wù)的進(jìn)行。同時(shí)保證部分甚至大部分任務(wù)客戶(hù)能得到正確的相應(yīng)。也就是當(dāng)前的請(qǐng)求處理不了了或者出錯(cuò)了,給一個(gè)默認(rèn)的返回。
- 通俗: 關(guān)閉系統(tǒng)中邊緣服務(wù) 保證系統(tǒng)核心服務(wù)的正常運(yùn)行 稱(chēng)之為服務(wù)降級(jí)
淘寶 刪除地址 確認(rèn)收貨 刪除訂單 取消支付 節(jié)省cpu 內(nèi)存
4.降級(jí)和熔斷總結(jié)
1.共同點(diǎn)
- 目的很一致,都是從可用性可靠性著想,為防止系統(tǒng)的整體緩慢甚至崩潰,采用的技術(shù)手段;
- 最終表現(xiàn)類(lèi)似,對(duì)于兩者來(lái)說(shuō),最終讓用戶(hù)體驗(yàn)到的是某些功能暫時(shí)不可達(dá)或不可用;
- 粒度一般都是服務(wù)級(jí)別,當(dāng)然,業(yè)界也有不少更細(xì)粒度的做法,比如做到數(shù)據(jù)持久層(允許查詢(xún),不允許增刪改);
- 自治性要求很高,熔斷模式一般都是服務(wù)基于策略的自動(dòng)觸發(fā),降級(jí)雖說(shuō)可人工干預(yù),但在微服務(wù)架構(gòu)下,完全靠人顯然不可能,開(kāi)關(guān)預(yù)置、配置中心都是必要手段;
2.異同點(diǎn)
- 觸發(fā)原因不太一樣,服務(wù)熔斷一般是某個(gè)服務(wù)(下游服務(wù))故障引起,而服務(wù)降級(jí)一般是從整體負(fù)荷考慮;
- 管理目標(biāo)的層次不太一樣,熔斷其實(shí)是一個(gè)框架級(jí)的處理,每個(gè)微服務(wù)都需要(無(wú)層級(jí)之分),而降級(jí)一般需要對(duì)業(yè)務(wù)有層級(jí)之分(比如降級(jí)一般是從最外圍服務(wù)開(kāi)始)
3.總結(jié)熔斷必會(huì)觸發(fā)降級(jí),所以熔斷也是降級(jí)一種,區(qū)別在于熔斷是對(duì)調(diào)用鏈路的保護(hù),而降級(jí)是對(duì)系統(tǒng)過(guò)載的一種保護(hù)處理
5.服務(wù)熔斷的實(shí)現(xiàn)
服務(wù)熔斷的實(shí)現(xiàn)思路
- 引入hystrix依賴(lài),并開(kāi)啟熔斷器(斷路器)
- 模擬降級(jí)方法
- 進(jìn)行調(diào)用測(cè)試
1.項(xiàng)目中引入hystrix依賴(lài)
在商品服務(wù)下面 <!--引入hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
2.開(kāi)啟斷路器
@SpringBootApplication @EnableCircuitBreaker //用來(lái)開(kāi)啟斷路器 public class Products9998Application { public static void main(String[] args) { SpringApplication.run(Products9998Application.class, args); } }
3.使用HystrixCommand注解實(shí)現(xiàn)斷路
//服務(wù)熔斷 @GetMapping("/product/break") @HystrixCommand(fallbackMethod = "testBreakFall" ) public String testBreak(int id){ log.info("接收的商品id為: "+ id); if(id<=0){ throw new RuntimeException("數(shù)據(jù)不合法!!!"); } return "當(dāng)前接收商品id: "+id; } // 觸發(fā)熔斷的方法 public String testBreakFall(int id){ return "當(dāng)前數(shù)據(jù)不合法: "+id; }
4.訪問(wèn)測(cè)試
- 正常參數(shù)訪問(wèn)
- 錯(cuò)誤參數(shù)訪問(wèn)
一直使用錯(cuò)誤參數(shù)訪問(wèn),那么再使用正常參數(shù)訪問(wèn)也會(huì)顯示不合法,因?yàn)橛|發(fā)了斷路器,但過(guò)一點(diǎn)時(shí)間又會(huì)自動(dòng)的關(guān)閉,訪問(wèn)又合法了
5.總結(jié)從上面演示過(guò)程中會(huì)發(fā)現(xiàn)如果觸發(fā)一定條件斷路器會(huì)自動(dòng)打開(kāi),過(guò)了一點(diǎn)時(shí)間正常之后又會(huì)關(guān)閉。那么斷路器打開(kāi)條件是什么呢?
6.斷路器打開(kāi)條件官網(wǎng): https://cloud.spring.io/spring-cloud-netflix/2.2.x/reference/html/
A service failure in the lower level of services can cause cascading failure all the way up to the user. When calls to a particular service exceed circuitBreaker.requestVolumeThreshold
(default: 20 requests) and the failure percentage is greater than circuitBreaker.errorThresholdPercentage
(default: >50%) in a rolling window defined by metrics.rollingStats.timeInMilliseconds
(default: 10 seconds), the circuit opens and the call is not made. In cases of error and an open circuit, a fallback can be provided by the developer.--摘自官方
原文翻譯之后,總結(jié)打開(kāi)關(guān)閉的條件:
1 當(dāng)滿(mǎn)足一定的閥值的時(shí)候(默認(rèn)10秒內(nèi)超過(guò)20個(gè)請(qǐng)求次數(shù))
2、當(dāng)失敗率達(dá)到一定的時(shí)候(默認(rèn)10秒內(nèi)超過(guò)50%的請(qǐng)求失敗)
3、到達(dá)以上閥值,斷路器將會(huì)開(kāi)啟
4、當(dāng)開(kāi)啟的時(shí)候,所有請(qǐng)求都不會(huì)進(jìn)行轉(zhuǎn)發(fā)5、一段時(shí)間之后(默認(rèn)是5秒),這個(gè)時(shí)候斷路器是半開(kāi)狀態(tài),會(huì)讓其中一個(gè)請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)。
如果成功,斷路器會(huì)關(guān)閉,若失敗,繼續(xù)開(kāi)啟。重復(fù)4和5。
7.默認(rèn)的服務(wù)FallBack處理方法如果為每一個(gè)服務(wù)方法開(kāi)發(fā)一個(gè)降級(jí),對(duì)于我們來(lái)說(shuō),可能會(huì)出現(xiàn)大量的代碼的冗余,不利于維護(hù),這個(gè)時(shí)候就需要加入默認(rèn)服務(wù)降級(jí)處理方法
@GetMapping("/product/hystrix") @HystrixCommand(defaultFallback = "testHystrixFallBack") //通過(guò)HystrixCommand降級(jí)處理 指定出錯(cuò)的方法 public String testHystrix(String name) { log.info("接收名稱(chēng)為: " + name); int n = 1/0; return "服務(wù)[" + port + "]響應(yīng)成功,當(dāng)前接收名稱(chēng)為:" + name; } //服務(wù)降級(jí)處理 public String testHystrixFallBack(String name) { return port + "當(dāng)前服務(wù)已經(jīng)被降級(jí)處理!!!,接收名稱(chēng)為: "+name; }
6.服務(wù)降級(jí)的實(shí)現(xiàn)
還是再之前項(xiàng)目的基礎(chǔ)之上
1.客戶(hù)端openfeign + hystrix實(shí)現(xiàn)服務(wù)降級(jí)實(shí)現(xiàn)
- 引入hystrix依賴(lài)
- 配置文件開(kāi)啟feign支持hystrix
- 在feign客戶(hù)端調(diào)用加入fallback指定降級(jí)處理
- 開(kāi)發(fā)降級(jí)處理方法
2.開(kāi)啟openfeign支持服務(wù)降級(jí)
feign.hystrix.enabled=true #開(kāi)啟openfeign支持降級(jí)
3.在openfeign客戶(hù)端中加如Hystrix
// 創(chuàng)建一個(gè)ProductClientFallBack類(lèi)實(shí)現(xiàn)這個(gè)接口,并實(shí)現(xiàn)這個(gè)接口的所有方法,為了對(duì)每個(gè)方法做不同的響應(yīng)錯(cuò)略 // 指定當(dāng)前的接口是openfeign組件,value是調(diào)用的服務(wù)名 @FeignClient(value = "products",fallback = ProductClientFallBack.class) public interface ProductClient { @GetMapping("/product/findOne") Map<String, Object> findOne(@RequestParam("productId") String productId); }
4.開(kāi)發(fā)fallback處理類(lèi)
package com.md.fallback; @Component public class ProductClientFallBack implements ProductClient { @Override public Map<String, Object> findOne(String productId) { HashMap<String, Object> map = new HashMap<>(); map.put("status","false"); map.put("msg","當(dāng)前查詢(xún)不可以使用,服務(wù)已經(jīng)被降級(jí)"); return map; } }
正常訪問(wèn)
然后直接將產(chǎn)品服務(wù)關(guān)閉,再進(jìn)行訪問(wèn)
注意:如果服務(wù)端降級(jí)和客戶(hù)端降級(jí)同時(shí)開(kāi)啟,要求服務(wù)端降級(jí)方法的返回值必須與客戶(hù)端方法降級(jí)的返回值一致!!!
7.Hystrix Dashboard
0.說(shuō)明Hystrix Dashboard的一個(gè)主要優(yōu)點(diǎn)是它收集了關(guān)于每個(gè)HystrixCommand的一組度量。Hystrix儀表板以高效的方式顯示每個(gè)斷路器的運(yùn)行狀況。
只是一個(gè)有UI頁(yè)面的組件,創(chuàng)建一個(gè)新的項(xiàng)目,還是根據(jù)之前的springcloud的環(huán)境搭建
1.項(xiàng)目中引入依賴(lài)
<!--引入hystrix dashboard 依賴(lài)--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
2.入口類(lèi)中開(kāi)啟hystrix dashboard
@SpringBootApplication @EnableHystrixDashboard //開(kāi)啟監(jiān)控面板 public class Hystrixdashboard9990Application { public static void main(String[] args) { SpringApplication.run(Hystrixdashboard9990Application.class, args); } }
在配置文件中指定端口號(hào)9990
3.啟動(dòng)hystrix dashboard應(yīng)用http://localhost:9990(dashboard端口)/hystrix
4.監(jiān)控的項(xiàng)目中入口類(lèi)中加入監(jiān)控路徑配置[新版本坑],并啟動(dòng)監(jiān)控項(xiàng)目
@Bean public ServletRegistrationBean getServlet() { HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; }
5.通過(guò)監(jiān)控界面監(jiān)控
后面的hystrix.stream是固定的
6.點(diǎn)擊監(jiān)控,一致loading,打開(kāi)控制臺(tái)發(fā)現(xiàn)報(bào)錯(cuò)[特別坑]
# 解決方案 - 新版本中springcloud將jquery版本升級(jí)為3.4.1,定位到monitor.ftlh文件中,js的寫(xiě)法如下: $(window).load(function() - jquery 3.4.1已經(jīng)廢棄上面寫(xiě)法 - 修改方案 修改monitor.ftlh為如下調(diào)用方式: $(window).on("load",function() - 編譯jar源文件,重新打包引入后,界面正常響應(yīng)。
8.Hystrix停止維護(hù)
官方地址:https://github.com/Netflix/Hystrix
- 翻譯:Hystrix(版本1.5.18)足夠穩(wěn)定,可以滿(mǎn)足Netflix對(duì)我們現(xiàn)有應(yīng)用的需求。同時(shí),我們的重點(diǎn)已經(jīng)轉(zhuǎn)移到對(duì)應(yīng)用程序的實(shí)時(shí)性能作出反應(yīng)的更具適應(yīng)性的實(shí)現(xiàn),而不是預(yù)先配置的設(shè)置(例如,通過(guò)自適應(yīng)并發(fā)限制)。對(duì)于像Hystrix這樣的東西有意義的情況,我們打算繼續(xù)在現(xiàn)有的應(yīng)用程序中使用Hystrix,并在新的內(nèi)部項(xiàng)目中利用諸如resilience4j這樣的開(kāi)放和活躍的項(xiàng)目。我們開(kāi)始建議其他人也這樣做。
- Dashboard也被廢棄
到此這篇關(guān)于SpringCloud-Hystrix組件使用方法的文章就介紹到這了,更多相關(guān)SpringCloud-Hystrix組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java學(xué)習(xí)筆記之eclipse+tomcat 配置
俗話說(shuō):工欲善其事必先利其器,既然要學(xué)習(xí)java,首先把java的開(kāi)發(fā)環(huán)境搗鼓一下吧,這里我們來(lái)談?wù)別clipse+tomcat的配置方法。2014-11-11一文掌握J(rèn)ava開(kāi)發(fā)工具M(jìn)aven(簡(jiǎn)單上手)
掌握maven的相關(guān)知識(shí)是Java開(kāi)發(fā)必備的技能,今天通過(guò)本文從入門(mén)安裝開(kāi)始,逐步深入講解maven的相關(guān)知識(shí),包括maven的安裝到簡(jiǎn)單上手maven項(xiàng)目開(kāi)發(fā),感興趣的朋友跟隨小編一起看看吧2021-06-06springmvc+shiro+maven 實(shí)現(xiàn)登錄認(rèn)證與權(quán)限授權(quán)管理
Shiro 是一個(gè) Apache 下的一開(kāi)源項(xiàng)目項(xiàng)目,旨在簡(jiǎn)化身份驗(yàn)證和授權(quán),下面通過(guò)實(shí)例代碼給大家分享springmvc+shiro+maven 實(shí)現(xiàn)登錄認(rèn)證與權(quán)限授權(quán)管理,感興趣的朋友一起看看吧2017-09-09Mybatis Order by動(dòng)態(tài)參數(shù)防注入方式
這篇文章主要介紹了Mybatis Order by動(dòng)態(tài)參數(shù)防注入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04springboot 中 thymeleaf 常用的語(yǔ)法完整實(shí)例
在 Spring Boot 項(xiàng)目中,Thymeleaf 是一個(gè)常用的模板引擎,它提供了豐富的語(yǔ)法來(lái)動(dòng)態(tài)渲染 HTML 頁(yè)面,下面給大家介紹springboot 中 thymeleaf 常用的語(yǔ)法完整實(shí)例,感興趣的朋友一起看看吧2024-03-03