小白學SpringCloud(六):服務降級(Hystrix)

hystrix_logo

在微服務架構中,我們將系統拆分爲很多個服務,各個服務之間通過註冊與訂閱的方式相互依賴,由於各個服務都是在各自的進程中運行,就有可能由於網絡原因或者服務自身的問題導致調用故障或延遲,隨着服務的積壓,可能會導致服務崩潰。爲了解決這一系列的問題,斷路器等一系列服務保護機制出現了。

一、Hystrix簡介

Netflix提供了一個叫Hystrix的類庫,它實現了斷路器模式。在微服務架構中,通常一個微服務會調用多個其他的微服務。一個相對低層級的服務失敗可能造成上層應用的級聯失敗,服務訪問量越大失敗率越高。當斷路打開的時候,這個調用就被終止了。打開的斷路可以阻止級聯失敗。
Hystrix_1
較底層的服務如果出現故障,會導致連鎖故障。當對特定的服務的調用的不可用達到一個閥值(Hystric 是5秒20次) 斷路器將會被打開。
Hystrix_2

二、Hystrix使用

這裏我們使用之前的Client項目進行演示。
1.在服務調用方添加pom

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

2.添加@EnableCircuitBreaker註解
這個註解只需要在springboot工程的啓動application類上就好了

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
//@SpringCloudApplication
public class ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }
}

這時我們發現我們的啓動類上添加了很多的註解,所以Spring Cloud將這些註解封裝了一下,提供了一個@SpringCloudApplication的註解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}

3.對要服務進行降級
之前的例子裏我們有一個restHello的接口,這個接口調用的Discovery的hello接口。
我們現在在他上面添加一個@HystrixCommand註解

    @HystrixCommand(fallbackMethod  = "helloFallback")
    @GetMapping("/restHello")
    public String CliHello() {
        return restTemplate.getForObject("http://discovery/hello",String.class);
    }

我們使用fallbackMethod屬性指定一個fallback方法,在需要降級的時候調用這個方法

    private String helloFallback() {
        return "哎呀,服務器開小差了!請稍後再試。";
    }

這時候我們將服務端和客戶端都啓動進行訪問
Hystrix_3
這時候我們將服務端Discover關掉然後再訪問這個地址,他就會去訪問降級的地址
Hystrix_4
這樣我們就實現了服務降級。但是這樣需要沒一個接口都添加這個註解,有沒有更快一點的方法呢?

4.配置默認服務降級註解
在類上添加@DefaultProperties註解配置默認的降級方法

@RestController
@RefreshScope
@DefaultProperties(defaultFallback = "helloFallback")
public class ClientController {
        //@HystrixCommand(fallbackMethod  = "helloFallback")
    @GetMapping("/restHello")
    public String CliHello() {
        return restTemplate.getForObject("http://discovery/hello",String.class);
    }

    private String helloFallback() {
        return "哎呀,服務器開小差了!請稍後再試。";
    }
}

這樣我們再進行剛纔的操作,可以發現是同樣的效果^_^
Hystrix_4


本文作者: catalinaLi
本文鏈接: http://catalinali.top/2018/startHystrix/
版權聲明: 原創文章,有問題請評論中留言。非商業轉載請註明作者及出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章