Hystrix結(jié)合Eureka+OpenFeign的使用

概述

Hystrix是一個(gè)用于處理分布式系統(tǒng)的延遲和容錯(cuò)的開(kāi)元庫(kù),在分布式系統(tǒng)里,許多以來(lái)不可避免的會(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)控(類(lèi)似熔斷保險(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ù)熔斷

類(lèi)似保險(xiǎn)絲達(dá)到最大服務(wù)訪問(wèn)后,直接拒絕訪問(wèn),拉閘限電,然后調(diào)用服務(wù)降級(jí)的方法并返回友好提示

  • 服務(wù)降級(jí)

程序運(yùn)行異常,超時(shí),服務(wù)熔斷出發(fā)服務(wù)降級(jí),線程池/信號(hào)量打滿也會(huì)導(dǎo)致服務(wù)降級(jí).服務(wù)器忙,請(qǐng)稍后再試,不讓客戶端等待并立刻返回一個(gè)友好提示,fallback

  • 服務(wù)限流

秒殺高并發(fā)等操作,嚴(yán)禁一窩蜂的過(guò)來(lái)?yè)頂D,大家排隊(duì),一秒鐘N個(gè),有序進(jìn)行

  • 接近實(shí)時(shí)的監(jiān)控

實(shí)操

構(gòu)建

  • 引入jar包
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

高并發(fā)測(cè)試

在使用我們的jmeter200線程,200輪次的2w次請(qǐng)求同一耗時(shí)比較慢的接口時(shí)

public String paymentInfo_error(Integer id) {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "線程池" + Thread.currentThread().getName() + "\t" + id + "\t" + "^_^" + "耗時(shí)3秒鐘";
    }

這個(gè)時(shí)候,即使訪問(wèn)比較快的方法,也會(huì)受到拖累,因?yàn)閠omcat默認(rèn)200個(gè)線程,因?yàn)樯鲜龇椒▓?zhí)行時(shí),多數(shù)線程都被調(diào)用去擁擠到那兒去執(zhí)行滿方法,導(dǎo)致我們?cè)菊5姆?wù)也會(huì)被變慢

public String paymentInfo_OK(Integer id) {
        return "線程池" + Thread.currentThread().getName() + "\t" + id + "\t" + "^_^";
    }

hyxtrix如何解決

降級(jí)處理緯度

  • 服務(wù)端down機(jī),不能讓客戶端一直等待,必須有服務(wù)降級(jí)(選擇較多)
  • 對(duì)方服務(wù)執(zhí)行成功,但時(shí)間大于我所期待的時(shí)間,自己做服務(wù)降級(jí)處理
  1. 服務(wù)端處理

在主啟動(dòng)類(lèi)上加上開(kāi)啟配置注解

@EnableCircuitBreaker

在可能出錯(cuò)的業(yè)務(wù)類(lèi)中添加服務(wù)降級(jí)fallback方法,并指定

 /**
     * @HystrixCommand 指定fallback降級(jí)方法
     * @HystrixProperty 指定峰值等待時(shí)間
     */
    @HystrixCommand(fallbackMethod = "paymentInfo_error_timeOutHandler", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")})
    public String paymentInfo_error(Integer id) {
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "線程池" + Thread.currentThread().getName() + "\t" + id + "\t" + "^_^" + "耗時(shí)5秒鐘";
    }
    public String paymentInfo_error_timeOutHandler(Integer id) {
        return "線程池" + Thread.currentThread().getName() + "\t" + id + "\t" + "┭┮﹏┭┮" + "8001服務(wù)超時(shí)";
    }
  1. 客戶端處理(openFeign+hyxtrix)

主啟動(dòng)類(lèi)加載開(kāi)啟配置注解

@EnableHystrix

yml配置文件開(kāi)啟hyxtrix

feign:
  hystrix:
    enabled: true

控制層添加fallback方法并指定

/**
     * @HystrixCommand 指定fallback降級(jí)方法
     * @HystrixProperty 指定峰值等待時(shí)間
     */
    @GetMapping("error/{id}")
    @HystrixCommand(fallbackMethod = "paymentInfo_error_timeOutHandler", commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")})
    public String error(@PathVariable("id") Integer id) {
        return feignService.error(id);
    }
    public String paymentInfo_error_timeOutHandler(Integer id) {
        return "線程池" + Thread.currentThread().getName() + "\t" + id + "\t" + "┭┮﹏┭┮" + "80服務(wù)超時(shí)";
    }

全局服務(wù)降級(jí)配置

由于每個(gè)方法都要配置一個(gè)fallback,導(dǎo)致代碼膨脹和麻煩,所以我們可以定義一個(gè)全局通用的服務(wù)降級(jí)處理,和自定義分開(kāi)

  1. 再需要做服務(wù)降級(jí)的restControll上加上全局降級(jí)配置注解(defaultFallback參數(shù)為,類(lèi)中的共享fallback方法名)

@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")

  1. 再需要做服務(wù)降級(jí)的方法上,加上服務(wù)降級(jí)處理,并不需要加參數(shù),默認(rèn)走我們的全局服務(wù)降級(jí)處理

@HystrixCommand

全局服務(wù)降級(jí)配置(二)

由于業(yè)務(wù)不同,需要考慮解耦性的情況下,對(duì)于一個(gè)服務(wù)調(diào)用接口,再不同的controller里都有用到,那么對(duì)每一個(gè)controller進(jìn)行配置,也會(huì)增加耦合性,所以也有另一種方式來(lái)實(shí)現(xiàn)這種情況

  1. 針對(duì)于服務(wù)發(fā)現(xiàn)接口類(lèi)去實(shí)現(xiàn)一個(gè)專(zhuān)門(mén)去配置fallback的類(lèi),并實(shí)現(xiàn)他們的接口方法
  2. 并在接口上的Fileclent注解上,指定這個(gè)class為,服務(wù)調(diào)用失敗統(tǒng)一的fallback處理

@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = FeignFallbackServiceImpl.class)

服務(wù)熔斷

服務(wù)熔斷類(lèi)比保險(xiǎn)絲達(dá)到最大服務(wù)訪問(wèn)后,直接拒絕訪問(wèn),拉閘限電,然后調(diào)用服務(wù)降級(jí)的方法并返回友好提示

熔斷機(jī)制是應(yīng)對(duì)雪崩效應(yīng)的一種微服務(wù)鏈路保護(hù)機(jī)制,當(dāng)扇出鏈路的某個(gè)微服務(wù)出錯(cuò)不可用或者訪問(wèn)時(shí)間太長(zhǎng)時(shí)間,會(huì)進(jìn)行服務(wù)的降級(jí),勁兒熔斷該節(jié)點(diǎn)微服務(wù)的調(diào)用,快速返回錯(cuò)誤的響應(yīng)信息

在Spring Cloud框架里,熔斷機(jī)制通過(guò)Hystrix實(shí)現(xiàn),Hystrix會(huì)監(jiān)控微服務(wù)之間的調(diào)用狀況,當(dāng)失敗的調(diào)用到一定閾值,缺省是五秒內(nèi)20次調(diào)用失敗,就會(huì)啟動(dòng)熔斷機(jī)制,熔斷機(jī)制.當(dāng)檢測(cè)到該節(jié)點(diǎn)微服務(wù)調(diào)用響應(yīng)正常后,恢復(fù)調(diào)用鏈路

實(shí)現(xiàn)

在需要服務(wù)熔斷的接口上添加服務(wù)熔斷注解

// =============服務(wù)熔斷
    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),//是否開(kāi)啟斷路器
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),//請(qǐng)求次數(shù)
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//時(shí)間范圍
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")//失敗率%達(dá)到多少后跳閘
    })
    public String paymentCircuitBreaker(Integer id) {
        if (id < 0) {
            throw new RuntimeException("id 不能負(fù)數(shù)");
        }
        return Thread.currentThread().getName() + "\t" + "調(diào)用成功,流水號(hào): " + IdUtil.fastSimpleUUID();
    }

其他配置可參考HystrixCommandProperties類(lèi),有詳細(xì)參數(shù)

總結(jié)

服務(wù)熔斷器是,當(dāng)我們?cè)O(shè)定好的閾值達(dá)到了,便進(jìn)行服務(wù)熔斷的機(jī)制,再次重復(fù)調(diào)用直接返回fallback服務(wù)降級(jí)處理,根據(jù)內(nèi)部算法慢慢的將服務(wù)進(jìn)行恢復(fù)正臣值耄可調(diào)用狀態(tài)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市港柜,隨后出現(xiàn)的幾起案子刘陶,更是在濱河造成了極大的恐慌胳赌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匙隔,死亡現(xiàn)場(chǎng)離奇詭異疑苫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纷责,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)捍掺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人再膳,你說(shuō)我怎么就攤上這事挺勿。” “怎么了喂柒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵不瓶,是天一觀的道長(zhǎng)禾嫉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)湃番,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任吭露,我火速辦了婚禮吠撮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讲竿。我一直安慰自己泥兰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布题禀。 她就那樣靜靜地躺著鞋诗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迈嘹。 梳的紋絲不亂的頭發(fā)上削彬,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音秀仲,去河邊找鬼融痛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛神僵,可吹牛的內(nèi)容都是我干的雁刷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼保礼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沛励!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起炮障,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤目派,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后胁赢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體址貌,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年徘键,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了练对。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吹害,死狀恐怖螟凭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情它呀,我是刑警寧澤螺男,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布棒厘,位于F島的核電站,受9級(jí)特大地震影響下隧,放射性物質(zhì)發(fā)生泄漏奢人。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一淆院、第九天 我趴在偏房一處隱蔽的房頂上張望何乎。 院中可真熱鬧,春花似錦土辩、人聲如沸支救。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)各墨。三九已至,卻和暖如春启涯,著一層夾襖步出監(jiān)牢的瞬間贬堵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工结洼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扁瓢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓补君,卻偏偏與公主長(zhǎng)得像引几,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挽铁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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