這篇文章主要講解了“如何理解SpringCloud中服務(wù)熔斷和降級(jí)Hystrix”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何理解SpringCloud中服務(wù)熔斷和降級(jí)Hystrix”吧!
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了柳南免費(fèi)建站歡迎大家使用!
分布式系統(tǒng)面臨的問(wèn)題
復(fù)雜分布式體系結(jié)構(gòu)中的應(yīng)用程序有數(shù)十個(gè)依賴關(guān)系,每個(gè)依賴關(guān)系在某些時(shí)候?qū)⒉豢杀苊獾厥 ? 服務(wù)雪崩 多個(gè)微服務(wù)之間調(diào)用的時(shí)候,假設(shè)微服務(wù)A調(diào)用微服務(wù)B和微服務(wù)C,微服務(wù)B和微服務(wù)C又調(diào)用其它的微服務(wù),這就是所謂的“扇出”。如果扇出的鏈路上某個(gè)微服務(wù)的調(diào)用響應(yīng)時(shí)間過(guò)長(zhǎng)或者不可用,對(duì)微服務(wù)A的調(diào)用就會(huì)占用越來(lái)越多的系統(tǒng)資源,進(jìn)而引起系統(tǒng)崩潰,所謂的“雪崩效應(yīng)”. 對(duì)于高流量的應(yīng)用來(lái)說(shuō),單一的后端依賴可能會(huì)導(dǎo)致所有服務(wù)器上的所有資源都在幾秒鐘內(nèi)飽和。比失敗更糟糕的是,這些應(yīng)用程序還可能導(dǎo)致服務(wù)之間的延遲增加,備份隊(duì)列,線程和其他系統(tǒng)資源緊張,導(dǎo)致整個(gè)系統(tǒng)發(fā)生更多的級(jí)聯(lián)故障。這些都表示需要對(duì)故障和延遲進(jìn)行隔離和管理,以便單個(gè)依賴關(guān)系的失敗,不能取消整個(gè)應(yīng)用程序或系統(tǒng)。 備注:一般情況對(duì)于服務(wù)依賴的保護(hù)主要有3中解決方案: (1)熔斷模式:這種模式主要是參考電路熔斷,如果一條線路電壓過(guò)高,保險(xiǎn)絲會(huì)熔斷,防止火災(zāi)。放到我們的系統(tǒng)中,如果某個(gè)目標(biāo)服務(wù)調(diào)用慢或者有大量超時(shí),此時(shí),熔斷該服務(wù)的調(diào)用,對(duì)于后續(xù)調(diào)用請(qǐng)求,不在繼續(xù)調(diào)用目標(biāo)服務(wù),直接返回,快速釋放資源。如果目標(biāo)服務(wù)情況好轉(zhuǎn)則恢復(fù)調(diào)用。 (2)隔離模式:這種模式就像對(duì)系統(tǒng)請(qǐng)求按類型劃分成一個(gè)個(gè)小島的一樣,當(dāng)某個(gè)小島被火少光了,不會(huì)影響到其他的小島。例如可以對(duì)不同類型的請(qǐng)求使用線程池來(lái)資源隔離,每種類型的請(qǐng)求互不影響,如果一種類型的請(qǐng)求線程資源耗盡,則對(duì)后續(xù)的該類型請(qǐng)求直接返回,不再調(diào)用后續(xù)資源。這種模式使用場(chǎng)景非常多,例如將一個(gè)服務(wù)拆開(kāi),對(duì)于重要的服務(wù)使用單獨(dú)服務(wù)器來(lái)部署,再或者公司最近推廣的多中心。 (3)限流模式:上述的熔斷模式和隔離模式都屬于出錯(cuò)后的容錯(cuò)處理機(jī)制,而限流模式則可以稱為預(yù)防模式。限流模式主要是提前對(duì)各個(gè)類型的請(qǐng)求設(shè)置最高的QPS閾值,若高于設(shè)置的閾值則對(duì)該請(qǐng)求直接返回,不再調(diào)用后續(xù)資源。這種模式不能解決服務(wù)依賴的問(wèn)題,只能解決系統(tǒng)整體資源分配問(wèn)題,因?yàn)闆](méi)有被限流的請(qǐng)求依然有可能造成雪崩效應(yīng)。
Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲和容錯(cuò)的開(kāi)源庫(kù),在分布式系統(tǒng)里,許多依賴不可避免的會(huì)調(diào)用失敗,比如超時(shí)、異常等,Hystrix能夠保證在一個(gè)依賴出問(wèn)題的情況下,不會(huì)導(dǎo)致整體服務(wù)失敗,避免級(jí)聯(lián)故障,以提高分布式系統(tǒng)的彈性。 “斷路器”本身是一種開(kāi)關(guān)裝置,當(dāng)某個(gè)服務(wù)單元發(fā)生故障之后,通過(guò)斷路器的故障監(jiān)控(類似熔斷保險(xiǎn)絲),向調(diào)用方返回一個(gè)符合預(yù)期的、可處理的備選響應(yīng)(FallBack),而不是長(zhǎng)時(shí)間的等待或者拋出調(diào)用方無(wú)法處理的異常,這樣就保證了服務(wù)調(diào)用方的線程不會(huì)被長(zhǎng)時(shí)間、不必要地占用,從而避免了故障在分布式系統(tǒng)中的蔓延,乃至雪崩。 服務(wù)降級(jí)、服務(wù)熔斷、服務(wù)限流、接近實(shí)時(shí)的監(jiān)控
服務(wù)熔斷 熔斷機(jī)制是應(yīng)對(duì)雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制。 當(dāng)扇出鏈路的某個(gè)微服務(wù)不可用或者響應(yīng)時(shí)間太長(zhǎng)時(shí),會(huì)進(jìn)行服務(wù)的降級(jí),進(jìn)而熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用,快速返回"錯(cuò)誤"的響應(yīng)信息。當(dāng)檢測(cè)到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后恢復(fù)調(diào)用鏈路。在SpringCloud框架里熔斷機(jī)制通過(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ī)制。熔斷機(jī)制的注解是@HystrixCommand。 =====處理異常業(yè)務(wù)邏輯=====provider client處理====
2.1>、參考cloud-provider-dept-8001新建cloud-provider-dept-8001-hystrix
2.2>、POM新增
<!-- hystrix 客戶端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>
2.3>、YML修改
eureka: instance: instance-id: cloud-dept8001-hystirx #eureka服務(wù)列表中顯示的名稱--hystix prefer-ip-address: true #訪問(wèn)路徑可以顯示IP地址
2.4>、修改DeptController
一旦調(diào)用服務(wù)方法失敗并排除了錯(cuò)誤信息后,會(huì)自動(dòng)調(diào)用@HystrixCommand標(biāo)注好的fallbackMethod調(diào)用類中的指定方法。
@HystrixCommand(fallbackMethod = "getHystrixCommand")
@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
public Dept get(@PathVariable("id") Long id)
{
if(id>200){
throw new RuntimeException();
}
return service.get(id);
}
//參數(shù)必須一樣
public Dept getHystrixCommand(@PathVariable("id") Long id){
return new Dept().setDname("這是一個(gè)null部門.");
}2.5>、修改主啟動(dòng)類APP
package com.lee.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableCircuitBreaker//對(duì)hystrixR熔斷機(jī)制的支持
@EnableEurekaClient //本服務(wù)啟動(dòng)后會(huì)自動(dòng)注冊(cè)進(jìn)eureka服務(wù)中
@SpringBootApplication
public class DeptProvider8001_APP_hystrix {
public static void main(String[] args) {
SpringApplication.run(DeptProvider8001_APP_hystrix.class,args);
}
}測(cè)試:
1>、啟動(dòng)3個(gè)Eureka服務(wù)
2>、啟動(dòng)cloud-provider-dept-8001-hystrix
3>、啟動(dòng)cloud-consumer-dept-80
4>、訪問(wèn)http://localhost:80/consumer/dept/get/9999
結(jié)果:
{"deptno":null,"dname":"這是一個(gè)null部門.","db_source":null}
思考:
服務(wù)熔斷,容易造成方法膨脹,如何解決呢?服務(wù)降級(jí)處理是在客戶端實(shí)現(xiàn)完成的,與服務(wù)端沒(méi)有關(guān)系
整體資源快不夠了,忍痛將某些服務(wù)先關(guān)掉,待渡過(guò)難關(guān),再開(kāi)啟回來(lái)。 ===關(guān)閉不重要的服務(wù)===consumer client處理=====
3.1>、修改cloud-consumer-dept-80項(xiàng)目中個(gè)的service接口
根據(jù)已有的DeptFeignService接口,新建一個(gè)實(shí)現(xiàn)了FallbackFactory接口的類DeptFeignServiceFallbackFactory
package com.lee.cloud.feign.service;
import com.lee.cloud.entity.Dept;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class DeptFeignServiceFallbackFactory implements FallbackFactory<DeptFeignService> {
@Override
public DeptFeignService create(Throwable throwable) {
return new DeptFeignService() {
@Override
public Dept get(long id) {
return new Dept().setDname("服務(wù)已經(jīng)降級(jí)。。").setDb_source("服務(wù)降級(jí) 沒(méi)有找到 database.");
}
@Override
public List<Dept> list() {
return null;
}
@Override
public boolean add(Dept dept) {
return false;
}
};
}
}3.2>、DeptFeignService接口在注解@FeignClient中添加fallbackFactory屬性值
@FeignClient(value = "CLOUD-DEPT",fallbackFactory = DeptFeignServiceFallbackFactory.class)
3.3>、cloud-consumer-dept-80-feign工程修改yml
添加 feign: hystrix: enabled: true
測(cè)試:
1》、啟動(dòng)3個(gè)eureka服務(wù)
2》、啟動(dòng)服務(wù)提供者cloud-provider-dept-8001服務(wù),注意不是cloud-provider-dept-8001-hystrix
3》、啟動(dòng)cloud-consumer-dept-80-feign
4》、正常訪問(wèn)測(cè)試 http://localhost:80/consumer/dept/get/1
5》、故意關(guān)閉cloud-provider-dept-8001
6》、客戶端自己調(diào)用提示
結(jié)果:
{"deptno":null,"dname":"服務(wù)已經(jīng)降級(jí)。。","db_source":"服務(wù)降級(jí) 沒(méi)有找到 database."}思考: 服務(wù)熔斷 和 服務(wù)降級(jí) 有什么區(qū)別? 【服務(wù)熔斷】 一般是某個(gè)服務(wù)故障或者異常引起,類似現(xiàn)實(shí)世界中的"保險(xiǎn)絲",當(dāng)某個(gè)異常條件被處罰,直接熔斷整個(gè)服務(wù),而不是一直等到此服務(wù)超時(shí)。 【服務(wù)降級(jí)】 所謂降級(jí),一般是從整體負(fù)荷考慮,就是當(dāng)某個(gè)服務(wù)熔斷之后,服務(wù)器將不再被調(diào)用。 此時(shí)客戶端可以自己準(zhǔn)備一個(gè)本地的fallback回調(diào),返回一個(gè)缺省值。 這樣做,雖然服務(wù)水平下降,但好歹可用,比直接掛掉要強(qiáng)。
除了隔離依賴服務(wù)的調(diào)用以外,Hystrix還提供了準(zhǔn)實(shí)時(shí)的調(diào)用監(jiān)控(Hystrix Dashboard),Hystrix會(huì)持續(xù)地記錄所有通過(guò)Hystrix發(fā)起的請(qǐng)求的執(zhí)行信息,并以統(tǒng)計(jì)報(bào)表和圖形的形式展示給用戶,包括每秒執(zhí)行多少請(qǐng)求多少成功,多少失敗等。Netflix通過(guò)hystrix-metrics-event-stream項(xiàng)目實(shí)現(xiàn)了對(duì)以上指標(biāo)的監(jiān)控。Spring Cloud也提供了Hystrix Dashboard的整合,對(duì)監(jiān)控內(nèi)容轉(zhuǎn)化成可視化界面。
4.1>、新建module,cloud-consumer-dept-9001-hystirx-dashboard
4.2>、POM文件
<dependencies>
<!-- 自己定義的api -->
<dependency>
<groupId>com.lee</groupId>
<artifactId>cloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改后立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- Ribbon相關(guān) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- feign相關(guān) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!-- hystrix和 hystrix-dashboard相關(guān)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
</dependencies>4.3>、YML文件
server: port: 9001
4.4>、主啟動(dòng)類
package com.lee.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
@EnableHystrixDashboard
@SpringBootApplication
public class DeptConsumer_DashBoard_9001_App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_DashBoard_9001_App.class,args);
}
}4.5>、所有provider微服務(wù)提供者都需要添加監(jiān)控依賴
<!-- actuator監(jiān)控信息完善 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
測(cè)試:
1、啟動(dòng)cloud-consumer-dept-9001-hystrix-dashboard 訪問(wèn):http://localhost:9001/hystrix 2、啟動(dòng)3個(gè)eureka集群 3、啟動(dòng)cloud-provider-dept-8001-hystrix 訪問(wèn):http://localhost8001/dept/list 4、http://localhost:8001/hystrix.stream delay:2000ms title: demo1


感謝各位的閱讀,以上就是“如何理解SpringCloud中服務(wù)熔斷和降級(jí)Hystrix”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何理解SpringCloud中服務(wù)熔斷和降級(jí)Hystrix這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
分享題目:如何理解SpringCloud中服務(wù)熔斷和降級(jí)Hystrix
網(wǎng)站鏈接:http://chinadenli.net/article24/jhjdje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、網(wǎng)站營(yíng)銷、面包屑導(dǎo)航、企業(yè)網(wǎng)站制作、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)