天天看點

SpringCloud之Hystrix斷路器(九)1、分布式面臨的問題2、Hystrix功能

Git源碼: https://github.com/chenhang666/SpringCloud

1、分布式面臨的問題

  • 對于高流量的應用來說,單一的後端依賴可能會導緻所有伺服器上的所有資源都在幾秒鐘内飽和。比失敗更糟糕的是這些應用程式還可能導緻服務之間的延遲增加,備份隊列,線程和其他系統資源緊張,導緻整個系統發生更多的級聯故障。
  • 服務雪崩:多個微服務之間調用的時候,假設微服務A調用微服務B和微服務C,微服務B和微服務C又調用其他的微服務,這就是所謂的“扇出”。如果扇出的鍊路上某個微服務的調用響應時間過長或者不可用,對微服務A的調用就會占用越來越多的系統資源,進而引起系統崩潰,所謂的“雪崩效應”。

2、Hystrix功能

2.1、服務熔斷

  • 當扇對外連結路的某個微服務不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速傳回“錯誤”的響應資訊。
  • 當檢測到該節點微服務響應正常後恢複調用鍊路,在SpringCloud架構裡熔斷機制通過Hystrix實作。
  • Hystrix會監控微服務調用的狀況,當失敗的調用到門檻值,預設是5秒内20次調用失敗就會啟動熔斷機制。
  • 一般是某個服務故障或者異常引起,類似現實世界中的“保險絲”,當某個異常條件被觸發,直接熔斷整個服務,而不是一直等到此服務逾時。

添加Maven依賴

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

 @HystrixCommand指定傳回資訊

package com.chen.springcloud.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.chen.springcloud.entity.Dept;
import com.chen.springcloud.service.DeptService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

@RestController
public class DeptController {

	@Autowired
	private DeptService service;
	
	//服務熔斷
	//一旦調用服務方法失敗并抛出了錯誤資訊後,會自動調用@HystrixCommand标注好的fallbackMethod調用類中的指定方法
	@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
	@HystrixCommand(fallbackMethod="processHystrix_Get")
	public Dept get(@PathVariable("id") long id) {
		Dept dept = service.get(id);
		if (null == dept) {
			throw new RuntimeException("該ID:"+id+"沒有對應的資訊");
		}
		return dept;
	}
	
	public Dept processHystrix_Get(@PathVariable("id") long id) {
		return new Dept().setDeptno(id)
				.setDname("該ID:"+id+"沒有對應的資訊,[email protected]")
				.setDb_source("no this database in MySQL");
	}
}
           

啟動類添加hystrix注解 

package com.chen.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient				//Eureka用戶端
@EnableDiscoveryClient			//發現服務
@EnableCircuitBreaker			//對hystrix熔斷機制的支援
public class DeptProvider8001_Hystrix_App {

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

2.2、服務降級

  • 向調用方傳回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者抛出調用方無法處理的異常

    會進行服務的降級,進而熔斷該節點微服務的調用,快速傳回“錯誤”的響應資訊。

  • 一般是從整體負荷考慮,當某個服務熔斷之後,伺服器将不再被調用,此時用戶端可以自己準備一個本地的fallback回調,傳回一個預設值。這樣雖然服務水準下降,但好歹可用,比直接挂掉要強。
  • 整體資源快不夠了,忍痛将某些服務先關掉,待度過難過,再開啟回來
  • 服務降級處理是在用戶端實作完成的,與服務端沒有關系

類似于服務熔斷實作,熔斷實作在Controller的接口上,降級是将其統一實作在service層 

package com.chen.springcloud.service;

import java.util.List;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.chen.springcloud.entity.Dept;

@FeignClient(value="MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
public interface DeptClientService {

	@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
	public Dept get(@PathVariable("id") long id);
	
	@RequestMapping(value="/dept/list",method=RequestMethod.GET)
	public List<Dept> list();
	
	@RequestMapping(value="/dept/add",method=RequestMethod.POST)
	public boolean add(Dept dept);
	
}
           
package com.chen.springcloud.service;

import java.util.List;
import org.springframework.stereotype.Component;
import com.chen.springcloud.entity.Dept;
import feign.hystrix.FallbackFactory;

@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService>{

	@Override
	public DeptClientService create(Throwable cause) {
		
		return new DeptClientService() {
			
			@Override
			public List<Dept> list() {
				
				return null;
			}
			
			@Override
			public Dept get(long id) {
				return new Dept().setDeptno(id)
						.setDname("該服務已暫停服務")
						.setDb_source("no this database in MySQL");
			}
			
			@Override
			public boolean add(Dept dept) {
				
				return false;
			}
		};
	}

}
           

2.3、服務監控

  • 準實時的調用監控(Hystrix Dashboard),Hystrix會持續的記錄所有通過Hystrix發起的請求執行資訊,并以統計報表和圖形的形式展示給使用者,包括每秒執行多少請求多少成功、多少失敗等。

啟動類添加@EnableHystrixDashboard

package com.chen.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;

@SpringBootApplication
@EnableHystrixDashboard			//開啟圖像化監控的注解
public class DeptConsumer_DashBoard_App {
	
	public static void main(String[] args) {
		SpringApplication.run(DeptConsumer_DashBoard_App.class, args);
	}

}
           

 啟動項目通路:http://localhost:9001/hystrix(Dashboard項目ip端口)

SpringCloud之Hystrix斷路器(九)1、分布式面臨的問題2、Hystrix功能

監控界面

SpringCloud之Hystrix斷路器(九)1、分布式面臨的問題2、Hystrix功能

繼續閱讀