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


一:什么是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很詳細,就是看起來有點費勁,

 

Dubbo結合Hystrix使用:https://my.oschina.net/yangshaokai/blog/674685


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM