SpringCloud(四)服務(wù)保護(hù)機(jī)制Hystrix

背景理論
假設(shè)Tomcat最大線程數(shù)是10個, 這個客戶端發(fā)來100個請求, 就會有90個請求被等待. 當(dāng)這10個請求有誰完成之后, 在去從90個里面取出一個繼續(xù)處理. 如果請求量巨大, 則會導(dǎo)致部分接口長時間處于等待狀態(tài). 如果高并發(fā)情況下,甚至導(dǎo)致服務(wù)器直接宕機(jī)。

為了解決這種高并發(fā)情況下,導(dǎo)致服務(wù)不可用的情況下,斷路器就排上用場了。可以把斷路器理解為保險絲,保險絲是怎么工作的,當(dāng)電流過大時,承受不了,我直接斷開,不給你通電了。斷路器也是一樣的,既然我一次只能處理10個請求,那我就只接受10個,多了我不接,因?yàn)榫退憬恿耍乙蔡幚聿涣耍悴缓茫炎约憾冀o搞廢了。

服務(wù)雪崩

Tomcat默認(rèn)情況下, 只有一個線程池去處理客戶端發(fā)來的所有請求, 線程池里的線程數(shù)是有上線的, 這樣在高并發(fā)的情況下, 如果客戶端所有的請求都訪問同一個接口, 導(dǎo)致線程池的所有線程都去處理該接口, 但是也會導(dǎo)致其它服務(wù)沒有線程接受請求, 這就是服務(wù)的雪崩效應(yīng).

服務(wù)降級

在高并發(fā)情況下,防止用戶一直等待,使用服務(wù)降級方式(直接返回一個友好的提示給客戶端,調(diào)用fallBack方法)
如果調(diào)用其他接口超時的時候(默認(rèn)是1秒時間), 如果一秒沒有響應(yīng)的話, 會直接走降級的方法.

服務(wù)熔斷(類似保險絲)

熔斷機(jī)制目的為了保護(hù)服務(wù),在高并發(fā)的情況下,如果請求達(dá)到一定極限(可以自己設(shè)置闊值)如果流量超出了設(shè)置閾值,直接拒絕訪問,保護(hù)當(dāng)前服務(wù)。使用服務(wù)降級方式返回一個友好提示,服務(wù)熔斷和服務(wù)降級一起使用

服務(wù)隔離

因?yàn)槟J(rèn)情況下,只有一個線程池會維護(hù)所有的服務(wù)接口,如果大量的請求訪問同一個接口,達(dá)到tomcat 線程池默認(rèn)極限,可能會導(dǎo)致其他服務(wù)無法訪問。
解決服務(wù)雪崩效應(yīng):使用服務(wù)隔離機(jī)制(線程池方式和信號量),使用線程池方式實(shí)現(xiàn)隔離的原理: 相當(dāng)于每個接口(服務(wù))都有自己獨(dú)立的線程池,因?yàn)槊總€線程池互不影響,這樣的話就可以解決服務(wù)雪崩效應(yīng)。
線程池隔離:
每個服務(wù)接口,都有自己獨(dú)立的線程池,每個線程池互不影響。
信號量隔離:
使用一個原子計數(shù)器(或信號量)來記錄當(dāng)前有多少個線程在運(yùn)行,當(dāng)請求進(jìn)來時先判斷計數(shù)器的數(shù)值,若超過設(shè)置的最大線程個數(shù)則拒絕該請求,若不超過則通行,這時候計數(shù)器+1,請求返 回成功后計數(shù)器-1。

服務(wù)限流

服務(wù)限流就是對接口訪問進(jìn)行限制,常用服務(wù)限流算法令牌桶、漏桶。計數(shù)器也可以進(jìn)行粗暴限流實(shí)現(xiàn)。

屏幕快照 2019-04-22 上午9.42.28.png

hystrix斷路器maven依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

yml文件配置

###開啟Hystrix斷路器 
feign:
  hystrix:
    enabled: true
#### hystrix服務(wù)超時時間, 默認(rèn)超時時間是1秒
hystrix:  
 command: 
   default: 
      execution: 
       timeout: 5000
        enabled: true

hystrix服務(wù)超時時間這個配置很重要, 如果使用HystrixCommand的接口中訪問了其他的Api, 如果不配置, 會直接走服務(wù)降級的訪問, 因?yàn)槟J(rèn)訪問超時時間是1秒.

@HystrixCommand注解使用

默認(rèn)開啟服務(wù)隔離方式 以線程池方式
默認(rèn)開啟服務(wù)降級執(zhí)行方法(callback)
默認(rèn)開啟服務(wù)熔斷機(jī)制(hystrix.threadpool.default.coreSize(默認(rèn)為10)

    @HystrixCommand(fallbackMethod = "hystrixFallback")
    @RequestMapping("/hystrixApi")
    public String orderToMemberUserInfoHystrix() {
        System.out.println("orderToMemberUserInfoHystrix:" + "線程池名稱:" + Thread.currentThread().getName());
                // 如果這里又調(diào)用了其他的服務(wù), 這個調(diào)用服務(wù)的線程和orderToMemberUserInfoHystrix處理邏輯的線程是同一個線程
        return "hello";
    }

    public String hystrixFallback() {
        return "服務(wù)降級,服務(wù)器忙,請稍后重試!";
    }

啟動類添加@EnableHystrix注解

當(dāng)訪問hystrixApi時, 如果訪問量超出Tomcat最大處理量時, 則會走降級hystrixFallback()方法.

再添加一個接口用于測試服務(wù)隔離

    @RequestMapping("/segregateApi")
    public String segregateApi() {
        System.out.println("orderInfo:" + "線程池名稱:" + Thread.currentThread().getName());
    }

當(dāng)分別訪問segregateApi接口和hystrixApi時, 線程名稱是不同的, 所以hystrix默認(rèn)是做了服務(wù)隔離的, 假設(shè)segregateApi服務(wù)被大量線程訪問, 發(fā)生服務(wù)降級了, hystrixApi是不會受到影響的.

使用類的方法使用斷路器

@FeignClient(value = "app-member", fallback = MemberFallback.class)
public interface MemberServiceFeigin  {
    @RequestMapping("/getMember")
    public UserEntity getMember(@RequestParam("name") String name);

    @RequestMapping("/getUserInfo")
    public ResponseBase getUserInfo();
}

@FeignClient是使用feign調(diào)用服務(wù)的注解, value = "app-member"是需要調(diào)用的服務(wù)的名稱, fallback = MemberFallback.classfallback是發(fā)生錯誤時的回調(diào)
實(shí)現(xiàn)MemberFallback

@Component
public class MemberFallback implements MemberServiceFeigin {

@Override
    public UserEntity getMember(String name) {
        // TODO Auto-generated method stub
        return null;
    }
@Override
    public ResponseBase getUserInfo() {

        return setResultError("服務(wù)器忙,請稍后重試!");
    }

}

當(dāng)調(diào)用發(fā)生失敗時, 會進(jìn)入對應(yīng)的fallback處理方法. 而且這種方式實(shí)現(xiàn)服務(wù)降級, 自動開啟線程隔離. 其線程與服務(wù)調(diào)用放的線程是獨(dú)立分開的.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 原文:https://my.oschina.net/7001/blog/1619842 摘要: Hystrix是N...
    laosijikaichele閱讀 4,336評論 0 25
  • 一、認(rèn)識Hystrix Hystrix是Netflix開源的一款容錯框架,包含常用的容錯方法:線程池隔離、信號量隔...
    新棟BOOK閱讀 4,086評論 0 19
  • 一、認(rèn)識Hystrix Hystrix是Netflix開源的一款容錯框架,包含常用的容錯方法:線程池隔離、信號量隔...
    新棟BOOK閱讀 26,538評論 1 37
  • 流程圖 下圖展示了當(dāng)你使用 Hystrix 來包裝你請求依賴服務(wù)時的流程: 接下來將詳細(xì)介紹如下問題: 1.構(gòu)建H...
    KingsChan閱讀 6,068評論 0 21
  • 我是一只隨波逐流的小船 你是一片靜謐的港灣 你希望留住我疲倦的身影 我卻不能承諾你一個準(zhǔn)確的時間
    一葉茶閱讀 390評論 4 3