spring cloud 如何實(shí)現(xiàn)服務(wù)熔斷服務(wù)降級(jí)

Why

在微服務(wù)架構(gòu)中协屡,由于調(diào)用關(guān)系的復(fù)雜性,如果調(diào)用鏈路中的某個(gè)資源不穩(wěn)定全谤,最終會(huì)導(dǎo)致請(qǐng)求發(fā)生堆積肤晓。可能導(dǎo)致服務(wù)間延遲增加认然,備份隊(duì)列补憾,線程和其他系統(tǒng)資源緊張,導(dǎo)致整個(gè)系統(tǒng)發(fā)生更多的級(jí)聯(lián)故障卷员。
為了維護(hù)服務(wù)的穩(wěn)定盈匾,我們需要在調(diào)用鏈路中某個(gè)資源出現(xiàn)不穩(wěn)定狀態(tài)時(shí)(例如調(diào)用超時(shí)或異常比例升高),對(duì)這個(gè)資源的調(diào)用進(jìn)行限制毕骡,讓請(qǐng)求快速失敗削饵,避免影響到其它的資源而導(dǎo)致級(jí)聯(lián)錯(cuò)誤。當(dāng)資源被降級(jí)后未巫,在接下來(lái)的降級(jí)時(shí)間窗口之內(nèi)窿撬,對(duì)該資源的調(diào)用都自動(dòng)熔斷(默認(rèn)行為是拋出 DegradeException)。

How

  • 服務(wù)熔斷
    一般發(fā)生于下游服務(wù)叙凡,下游服務(wù)發(fā)生故障時(shí)劈伴,將服務(wù)熔斷不可用
    電路中的保險(xiǎn)絲,超過(guò)負(fù)荷握爷,直接熔斷跛璧,斷電,不可用新啼,保護(hù)整體安全
  • 服務(wù)降級(jí)
    將某一服務(wù)降級(jí)暫時(shí)不可用追城,為了服務(wù)整體的穩(wěn)定,犧牲部分不重要的功能燥撞,保證核心功能的進(jìn)行
    媽媽讓小明去買醬油漓柑,給了10塊錢,小明到超市看到自己喜歡的玩具2塊錢,拿上玩具和醬油去柜臺(tái)結(jié)賬發(fā)現(xiàn)一共需要12元辆布,為了完成媽媽的任務(wù)瞬矩,選擇不買玩具。等下次在買玩具

所以從上述分析來(lái)看锋玲,兩者其實(shí)從有些角度看是有一定的類似性的:
目的很一致:都是從可用性可靠性著想景用,為防止系統(tǒng)的整體緩慢甚至崩潰,采用的技術(shù)手段惭蹂;
最終表現(xiàn)類似:對(duì)于兩者來(lái)說(shuō)伞插,最終讓用戶體驗(yàn)到的是某些功能暫時(shí)不可達(dá)或不可用;
自治性要求很高:熔斷模式一般都是服務(wù)基于策略的自動(dòng)觸發(fā)盾碗,降級(jí)雖說(shuō)可人工干預(yù)媚污,但在微服務(wù)架構(gòu)下,完全靠人顯然不可能廷雅,開關(guān)預(yù)置耗美、配置中心都是必要手段;

而兩者的區(qū)別也是明顯的:
觸發(fā)原因不太一樣航缀,服務(wù)熔斷一般是某個(gè)服務(wù)(下游服務(wù))故障引起商架,而服務(wù)降級(jí)一般是從整體負(fù)荷考慮;

What

由于我司使用nacos作為服務(wù)注冊(cè)和發(fā)現(xiàn)芥玉,所以我們使用sentinel進(jìn)行熔斷降級(jí)蛇摸。
首先導(dǎo)入依賴

// Gradle
implementation('com.alibaba.cloud:spring-cloud-starter-alibaba-sentinel') {
        exclude module: 'guava'
   }
// Maven
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

配置文件中打開sentinel

feign:
  sentinel:
     enabled: true

使用語(yǔ)言 kotlin
閱讀@FeignClient源碼,我們發(fā)現(xiàn)fallback是由spring創(chuàng)建

    /**
     * Fallback class for the specified Feign client interface. The fallback class must
     * implement the interface annotated by this annotation and be a valid spring bean.
     * @return fallback class for the specified Feign client interface
     */
    Class<?> fallback() default void.class;

    /**
     * Define a fallback factory for the specified Feign client interface. The fallback
     * factory must produce instances of fallback classes that implement the interface
     * annotated by {@link FeignClient}. The fallback factory must be a valid spring bean.
     *
     * @see feign.hystrix.FallbackFactory for details.
     * @return fallback factory for the specified Feign client interface
     */
    Class<?> fallbackFactory() default void.class;

1.fallbackFactory

package com.karl.cloud;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import com.karl.DTO.UserInfoDTO;

@FeignClient(value = "karl-service-user", fallbackFactory = UserFallbackFactory::class)
interface UserFeign {
    @GetMapping("/karl/user")
    fun getUser(): UserInfoDTO
}

@Component
class UserFallbackFactory: FallbackFactory<UserFeign> {
    val logger = LoggerFactory.getLogger(UserFallbackFactory::class.java)!!

    override fun create(cause: Throwable): DataFeign {
        logger.error(cause.message, cause)
        return UserFallback()
    }
}

class UserFallback: UserFeign {
    override fun getUser(): UserInfoDTO{
        return UserInfoDTO()
    }
}

2.fallback

package com.karl.cloud;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import com.karl.DTO.UserInfoDTO;

@FeignClient(value = "karl-service-user", fallback = UserFallback::class)
interface UserFeign {
    @GetMapping("/karl/user")
    fun getUser(): UserInfoDTO
}

@Component
class UserFallback: UserFeign {
    override fun getUser(): UserInfoDTO{
        return UserInfoDTO()
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灿巧,一起剝皮案震驚了整個(gè)濱河市赶袄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抠藕,老刑警劉巖弃鸦,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幢痘,居然都是意外死亡唬格,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門颜说,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)购岗,“玉大人,你說(shuō)我怎么就攤上這事门粪『盎” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵玄妈,是天一觀的道長(zhǎng)乾吻。 經(jīng)常有香客問(wèn)我髓梅,道長(zhǎng),這世上最難降的妖魔是什么绎签? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任枯饿,我火速辦了婚禮,結(jié)果婚禮上诡必,老公的妹妹穿的比我還像新娘奢方。我一直安慰自己,他們只是感情好爸舒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布蟋字。 她就那樣靜靜地躺著,像睡著了一般扭勉。 火紅的嫁衣襯著肌膚如雪鹊奖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天涂炎,我揣著相機(jī)與錄音忠聚,去河邊找鬼。 笑死璧尸,一個(gè)胖子當(dāng)著我的面吹牛咒林,可吹牛的內(nèi)容都是我干的熬拒。 我是一名探鬼主播爷光,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼澎粟!你這毒婦竟也來(lái)了蛀序?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤活烙,失蹤者是張志新(化名)和其女友劉穎徐裸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啸盏,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡重贺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了回懦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片气笙。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怯晕,靈堂內(nèi)的尸體忽然破棺而出潜圃,到底是詐尸還是另有隱情,我是刑警寧澤舟茶,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布谭期,位于F島的核電站堵第,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏隧出。R本人自食惡果不足惜踏志,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸳劳。 院中可真熱鬧狰贯,春花似錦、人聲如沸赏廓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)幔摸。三九已至摸柄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間既忆,已是汗流浹背驱负。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留患雇,地道東北人跃脊。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像苛吱,于是被迫代替她去往敵國(guó)和親酪术。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354