SpringCloud快速入門學(xué)習(xí)(六)之服務(wù)容錯和Hystrix的應(yīng)用

前言

在這篇文章介紹并記錄關(guān)于Spring Cloud 服務(wù)容錯和Hystrix 的簡單應(yīng)用。

為什么使用Hystrix

在微服務(wù)架構(gòu)中砍鸠,我們將系統(tǒng)拆分為很多個服務(wù),各個服務(wù)之間通過注冊與訂閱的方式相互依賴耕驰,由于各個服務(wù)都是在各自的進(jìn)程中運(yùn)行爷辱,就有可能由于網(wǎng)絡(luò)原因或者服務(wù)自身的問題導(dǎo)致調(diào)用故障或延遲,隨著服務(wù)的積壓朦肘,可能會導(dǎo)致服務(wù)崩潰饭弓。為了解決這一系列的問題,斷路器等一系列服務(wù)保護(hù)機(jī)制出現(xiàn)了媒抠。

例如

復(fù)雜分布式系統(tǒng)通常有很多依賴弟断,如果一個應(yīng)用不能對來自依賴 故障進(jìn)行隔離,那么應(yīng)用本身就處在被拖垮的風(fēng)險中趴生。在一個高流量的網(wǎng)站中阀趴,某個單一后端一旦發(fā)生延遲,將會在數(shù)秒內(nèi)導(dǎo)致 所有應(yīng)用資源被耗盡(一個臭雞蛋影響一籃筐)

如秒殺苍匆、搶購刘急、雙十一等場景,在某一時間點(diǎn)會有爆發(fā)式的網(wǎng)絡(luò)流量涌入浸踩,如果沒有好的網(wǎng)絡(luò)流量限制叔汁,任由流量壓到后臺服務(wù)實(shí)例,很有可能造成資源耗盡检碗,服務(wù)無法響應(yīng)据块,甚至嚴(yán)重的導(dǎo)致應(yīng)用崩潰。
Hystrix 具備服務(wù)降級后裸、服務(wù)熔斷瑰钮、依賴隔離 及服務(wù)監(jiān)控等強(qiáng)大功能。

使用機(jī)制

  1. 服務(wù)降級

    Fallback相當(dāng)于是降級操作. 對于查詢操作, 我們可以實(shí)現(xiàn)一個fallback方法, 當(dāng)請求后端服務(wù)出現(xiàn)異常的時候, 可以使用fallback方法返回的值. fallback方法的返回值一般是設(shè)置的默認(rèn)值或者來自緩存.告知后面的請求服務(wù)不可用了微驶,不要再來了浪谴。

  2. 服務(wù)熔斷

    當(dāng)服務(wù)者無法正常為消費(fèi)者提供服務(wù)時 ,如請求超時因苹、后臺服務(wù)無響應(yīng)苟耻、后臺服務(wù)異常等, 通過容錯機(jī)制直接返回統(tǒng)一處理結(jié)果扶檐,并對下次請求進(jìn)行同樣處理凶杖,直到后臺服務(wù)功能正常。

  3. 依賴隔離
    (采用艙壁模式款筑,Docker就是艙壁模式的一種):在Hystrix中, 主要通過線程池來實(shí)現(xiàn)資源隔離. 通常在使用的時候我們會根據(jù)調(diào)用的遠(yuǎn)程服務(wù)劃分出多個線程池

    4.監(jiān)控(Hystrix Dashboard

一智蝠、項(xiàng)目案例

接著原來的項(xiàng)目user服務(wù)上添加配置
####### 1.1 application.java 配置
新增@EnableCircuitBreaker 腾么、@EnableHystrixDashboard注解

@EnableFeignClients
@EnableEurekaClient
@EnableCircuitBreaker    //
@EnableDiscoveryClient
@EnableHystrixDashboard
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
......省略
}
1.2 ....yml配置
....
#開啟監(jiān)控端點(diǎn)
management:
  endpoints:
    web:
      exposure:
        include: hystrix.stream
#http://localhost:9001/mi-user/actuator/hystrix.stream 訪問.
...
二、使用Hystrixjiang 從而實(shí)現(xiàn)降級
2.1 在user服務(wù)創(chuàng)建一個接口實(shí)現(xiàn)hystrix

@FeignClient(value = "appoint"
, fallback = AppointClientHystrix.class
) 當(dāng)這個服務(wù)超時或者沒開啟的時候就會實(shí)現(xiàn)服務(wù)降級

@FeignClient(value = "appoint"
        , fallback = AppointClientHystrix.class
)
public interface AppointClient {
    // 調(diào)用 Appoint 服務(wù)
    // 聲明接口式地址 @GetMapping("/mi-appoint/msg")
    // 在到本服務(wù) Controller 調(diào)用 方法
    // 訪問地址為本服務(wù)地址  localhost:9001/mi-appoint/controller地址

    @GetMapping("/mi-appoint/msg")
    public String appointMsg();

    @GetMapping("/mi-appoint/appoint/uplist")
    List<Appointment> upList();

}

2.2 接需要在appoint服務(wù)也創(chuàng)建一個給user服務(wù)接口調(diào)用
    /**
     * 獲取列表
     * @return
     */
   @GetMapping("uplist")
    public List<Appointment>  upList(){
        return appointService.findUpAll();
   }
2.3 測試不開啟appoint服務(wù)

此時示例的是返回為空
當(dāng)我們訪問地址的時候


image.png
2.4 測試開啟appoint服務(wù)

此時示例的是返回是有數(shù)據(jù)


image.png
三杈湾、Hystrix-dashboard 熔斷可視化界面

3.1 引入 pom 依賴包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

3.2 創(chuàng)建一個HystrixController

@DefaultProperties(defaultFallback = "defaultFallback") 是使用本類的一個默認(rèn)失敗提示
@HystrixCommand 是配置一些降級配置

@RestController
@Slf4j
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {
    
    //設(shè)置降級配置
    // 超時時間3秒
    @HystrixCommand(
            commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"),  //超時時間
         //    斷熔器
            @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),                  //設(shè)置熔斷
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //請求數(shù)達(dá)到后才計(jì)算
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠時間窗
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),   //錯誤率
    }
    )
    @GetMapping("getAppointInfoList")
    public String getAppointByList(@RequestParam("number") Integer number){
        if (number % 2 == 0) {
            return "success";
        }
        log.info("mi-user:getAppointByList - > ");
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(
                "http://127.0.0.1:9002/mi-appoint/appoint/appointList",
                String.class
        );
    }

    @RequestMapping("test")
    public String test(){
        return "test";
    }


    private String fallback() {
        return "太擁擠了, 請稍后再試~~";
    }

    private String defaultFallback() {
        return "默認(rèn)提示:太擁擠了, 請稍后再試~~";
    }
}
3.3 開啟Hystrix-dashboard

訪問地址:http://localhost:9001/mi-user/hystrix

輸入地址是:http://localhost:9001/mi-user/actuator/hystrix.stream

image.png

3.3 進(jìn)入監(jiān)控頁面
image.png
四解虱、測試使用監(jiān)控案例

通過兩個訪問地址通過監(jiān)控來觸發(fā)降級
http://localhost:9001/mi-user/getAppointInfoList?number=1
http://localhost:9001/mi-user/getAppointInfoList?number=1

4.1 測試過程

當(dāng)我們訪問第一個頁面的地址的時候,不斷刷新訪問


image.png

監(jiān)控的訪問接口圈圈子漆撞,隨著不斷刷新殴泰,會使百分比會達(dá)到我們配置觸發(fā)斷熔器設(shè)置的時候回實(shí)現(xiàn)降級服務(wù)


image.png

假設(shè)一開始我們訪問第二個地址是成功返回值的,而監(jiān)控里的值也沒有變化浮驳,此時是訪問成功的
image.png

然后我們一直刷新第一個頁面之后悍汛,監(jiān)控里的值會開始變化,再此訪問第二個頁面就會實(shí)現(xiàn)降級


image.png

然后當(dāng)我們在次多刷新的時候等待一會后至会,訪問第二個頁面离咐,就會開啟斷熔器,訪問成功
image.png

對于本次章節(jié)是對服務(wù)容錯和Hystrix簡單應(yīng)用
github項(xiàng)目地址:https://github.com/mi499938150/SpringCloud-Example.git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奋献,一起剝皮案震驚了整個濱河市健霹,隨后出現(xiàn)的幾起案子旺上,更是在濱河造成了極大的恐慌瓶蚂,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宣吱,死亡現(xiàn)場離奇詭異窃这,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)征候,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門杭攻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疤坝,你說我怎么就攤上這事兆解。” “怎么了跑揉?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵锅睛,是天一觀的道長。 經(jīng)常有香客問我历谍,道長现拒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任望侈,我火速辦了婚禮印蔬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脱衙。我一直安慰自己侥猬,他們只是感情好例驹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著退唠,像睡著了一般眠饮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铜邮,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天仪召,我揣著相機(jī)與錄音,去河邊找鬼松蒜。 笑死扔茅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秸苗。 我是一名探鬼主播召娜,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惊楼!你這毒婦竟也來了玖瘸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤檀咙,失蹤者是張志新(化名)和其女友劉穎雅倒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弧可,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔑匣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了棕诵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裁良。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖校套,靈堂內(nèi)的尸體忽然破棺而出价脾,到底是詐尸還是另有隱情,我是刑警寧澤笛匙,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布侨把,位于F島的核電站,受9級特大地震影響膳算,放射性物質(zhì)發(fā)生泄漏座硕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一涕蜂、第九天 我趴在偏房一處隱蔽的房頂上張望华匾。 院中可真熱鬧,春花似錦、人聲如沸蜘拉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旭旭。三九已至谎脯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間持寄,已是汗流浹背源梭。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稍味,地道東北人废麻。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像模庐,于是被迫代替她去往敵國和親烛愧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

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