天天看點

【微服務架構】SpringCloud之Hystrix斷路器(六)

【微服務架構】SpringCloud之Hystrix斷路器

    • 一:什麼是Hystrix
    • 二:為什麼需要Hystrix?
    • 三:Hystrix解決什麼問題?
    • 四:Hystrix結合Feign使用

原文連結

一:什麼是Hystrix

在分布式環境中,許多服務依賴項中的一些将不可避免地失敗。Hystrix是一個庫,通過添加延遲容差和容錯邏輯來幫助您控制這些分布式服務之間的互動。Hystrix通過隔離服務之間的通路點,停止其間的級聯故障以及提供回退選項,進而提高系統的整體彈性。

Hystrix旨在執行以下操作

1:對通過第三方用戶端庫通路(通常通過網絡)的依賴關系提供保護并控制延遲和故障。

2:隔離複雜分布式系統中的級聯故障。

3:快速發現故障,盡快恢複。

4:回退,盡可能優雅地降級。

5:啟用近實時監控,警報和操作控制。

二:為什麼需要Hystrix?

大型分布式系統中,一個用戶端或者服務依賴外部服務,如果一個服務宕了,那麼由于我們設定了服務調用系統逾時時間,勢必會影響相應時間,在高并發的情況下大多數伺服器的線程池就出現阻塞(BLOCK),影響整個線上服務的穩定性。

(圖檔官方圖檔)

當一切都健康時,請求可以看起來像這樣

當許多後端服務系統中的一個宕掉時,整個使用者請求:

如果多個用戶端調用同一個異常服務的時候,出現的情況是:

三:Hystrix解決什麼問題?

分布式架構中的應用程式具有幾十個依賴關系,每個依賴關系在某個時刻将不可避免的出現異常。如果應用程式不與這些外部故障隔離,則可能出現線程池阻塞,引起系統雪崩。

例如,對于依賴30個服務的應用程式,每個服務的正常運作時間為99.99%,您可以:
99.99%的30次方 = 99.7%正常運作時間
0.3%的10億次請求= 3,000,000次故障
2+小時當機/月,即使所有依賴關系正常運作時間。
           

當使用Hystrix進行熔斷後,每個依賴關系彼此隔離了,限制了當發生延遲時的阻塞。

四:Hystrix結合Feign使用

建立一個工程eureka_feign_hystrix_client

pom.xml檔案内容

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Brixton.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
                

建立啟動檔案

FeignHystrixApplication

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignHystrixApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(FeignHystrixApplication.class, args);
    }
 
}
                

UserClient類

@FeignClient(value = "biz-service-0",fallback = UserClientHystrix.class)
public interface UserClient {
 
    @RequestMapping(method = RequestMethod.GET, value = "/getuser")
    public User getuserinfo();
     
    @RequestMapping(method = RequestMethod.GET, value = "/getuser")
    public String getuserinfostr();
     
    @RequestMapping(method = RequestMethod.GET, value = "/info")
    public  String  info();
 
}
                

建立熔斷類UserClientHystrix

@Service
public class UserClientHystrix implements UserClient {
 
    @Override
    public User getuserinfo() {
        throw new NullPointerException(" User getuserinfo() 服務不可用。。");
    }
 
    @Override
    public String getuserinfostr() {
 
        return " UserClientHystrix getuserinfostr() is fallback 服務不可用。。";
    }
 
    @Override
    public String info() {
 
        return " UserClientHystrix info() is fallback 服務不可用。。";
    }
 
}
                

當網絡出現異常的時候或直接跳轉到這裡實作類裡面

建立action類

UserController

@Autowired
    UserClient userClient;
 
    @RequestMapping(value = "/getuserinfo", method = RequestMethod.GET)
    public User getuserinfo() {
        return userClient.getuserinfo();
    }
     
    @RequestMapping(value = "/getuserinfostr", method = RequestMethod.GET)
    public String getuserinfostr() {
        return userClient.getuserinfostr();
    }
     
    @RequestMapping(value = "/info", method = RequestMethod.GET)
    public String info() {
        return userClient.info();
    }
                

先啟動:eureka_register_service(注冊中心)工程

然後運作我們寫好的FeignHystrixApplication

這個時候我們明顯發現沒有運作biz-service-0 服務,那麼我們 打開 http://127.0.0.1:8005/getuserinfostr

出現

UserClientHystrix getuserinfostr() is fallback 服務不可用。
           

這個就是我們自定義的熔斷傳回結果

如果不用熔斷 頁面會出現這個

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed Mar 22 14:32:21 CST 2017
There was an unexpected error (type=Internal Server Error, status=500).
getuserinfo failed and fallback failed.
           

本人也看了一些Hystrix相關原理,由于沒有全部看完是以暫時沒有寫上去,本文是結合Feign使用和學習。

有興起的可以看下官方的Hystrix很詳細,就是看起來有點費勁,

繼續閱讀