天天看點

springCloud五大元件——Hystrix

  • 分布式系統面臨的問題

    複雜分布式體系結構中的應用程式有數十個依賴關系,每個依賴關系在某些時候将不可避免地失敗。

  • 服務雪崩

    多個微服務之間調用的時候,假設微服務A調用微服務B和微服務C,微服務B和微服務C又調用其它的微服務,這就是所謂的“扇出”。如果扇出的鍊路上某個微服務的調用響應時間過長或者不可用,對微服務A的調用就會占用越來越多的系統資源,進而引起系統崩潰,所謂的“雪崩效應”.

對于高流量的應用來說,單一的後端依賴可能會導緻所有伺服器上的所有資源都在幾秒鐘内飽和。比失敗更糟糕的是,這些應用程式還可能導緻服務之間的延遲增加,備份隊列,線程和其他系統資源緊張,導緻整個系統發生更多的級聯故障。這些都表示需要對故障和延遲進行隔離和管理,以便單個依賴關系的失敗,不能取消整個應用程式或系統。
  • 什麼是Hystrix?

    Hystrix是一個用于處理分布式系統的延遲和容錯的開源庫,在分布式系統裡,許多依賴不可避免的會調用失敗,比如逾時、異常等,Hystrix能夠保證在一個依賴出問題的情況下,不會導緻整體服務失敗,避免級聯故障,以提高分布式系統的彈性。

  • 什麼是斷路器?

    “斷路器”本身是一種開關裝置,當某個服務單元發生故障之後,通過斷路器的故障監控(類似熔斷保險絲),向調用方傳回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者抛出調用方無法處理的異常,這樣就保證了服務調用方的線程不會被長時間、不必要地占用,進而避免了故障在分布式系統中的蔓延,乃至雪崩。

服務熔斷

熔斷機制是應對雪崩效應的一種微服務鍊路保護機制。

當扇對外連結路的某個微服務不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速傳回"錯誤"的響應資訊。當檢測到該節點微服務調用響應正常後恢複調用鍊路。在SpringCloud架構裡熔斷機制通過Hystrix實作。Hystrix會監控微服務間調用的狀況,當失敗的調用到一定門檻值,預設是5秒内20次調用失敗就會啟動熔斷機制。熔斷機制的注解是**@HystrixCommand。**

  • 實作服務熔斷

    1、建立microservicecloud-provider-dept-hystrix-8001

springCloud五大元件——Hystrix

2、修改pom.xml 引入hystrix

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

3、修改applicatiom.yml

instance-id: microservicecloud-dept8001-hystrix #自定義hystrix相關的服務名稱資訊
eureka:
  client: #用戶端注冊進eureka服務清單内
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: microservicecloud-dept8001-hystrix   #自定義hystrix相關的服務名稱資訊
    prefer-ip-address: true    
           

4、模拟熔斷

@HystrixCommand(fallbackMethod = “processHystrix_Get”)

@RestController
public class DeptController
{
	@Autowired
	private DeptService service = null;

	@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
	//一旦調用服務方法失敗并抛出了錯誤資訊後,會自動調用@HystrixCommand标注好的fallbackMethod調用類中的指定方法
	@HystrixCommand(fallbackMethod = "processHystrix_Get")
	public Dept get(@PathVariable("id") Long id)
	{

		Dept dept = this.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");
	}
}
           

5、修改啟動類 @EnableCircuitBreaker//對hystrixR熔斷機制的支援

@SpringBootApplication
@EnableEurekaClient //本服務啟動後會自動注冊進eureka服務中
@EnableDiscoveryClient //服務發現
@EnableCircuitBreaker//對hystrixR熔斷機制的支援
public class DeptProvider8001_Hystrix_App
{
	public static void main(String[] args)
	{
		SpringApplication.run(DeptProvider8001_Hystrix_App.class, args);
	}
}
           

6、測試

springCloud五大元件——Hystrix

服務降級

整體資源快不夠了,忍痛将某些服務先關掉,待渡過難關,再開啟回來。

  • 模拟實作服務降級

    1、改造microservicecloud-api接口

    建立一個專門處理的類 DeptClientServiceFallbackFactory

@Component // 不要忘記添加,不要忘記添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService>
{
	@Override
	public DeptClientService create(Throwable throwable)
	{
		return new DeptClientService() {
			@Override
			public Dept get(long id)
			{
				return null;
				return new Dept().setDeptno(id).setDname("該ID:" + id + "沒有沒有對應的資訊,Consumer用戶端提供的降級資訊,此刻服務Provider已經關閉")
						.setDb_source("no this database in MySQL");
			}

			@Override
			public List<Dept> list()
			{
				return null;
			}

			@Override
			public boolean add(Dept dept)
			{
				return false;
			}
		};
	}
}
           

接口類:有了問題就找fallbackFactory 實作解耦

@FeignClient(value=“MICROSERVICECLOUDDEPT”,fallbackFactory=DeptClientServiceFallbackFacory.class)

/**
 * 
 * @Description: 修改microservicecloud-api工程,根據已經有的DeptClientService接口

建立一個實作了FallbackFactory接口的類DeptClientServiceFallbackFactory
 * 
 * 
 */
//@FeignClient(value = "MICROSERVICECLOUD-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);
}
           

mvn clean install

2、microservicecloud-consumer-dept-feign yml修改

feign: 
  hystrix: 
    enabled: true
           

測試

springCloud五大元件——Hystrix

即便是provider服務端Down了 ,因為我們做了降級服務處理,讓用戶端在服務端不可用時也會獲得提示資訊而不會挂起耗死伺服器

springCloud五大元件——Hystrix

總結:

  • 服務熔斷

    一般是某個服務故障或異常引起,類似保險絲,當某個異常觸發,直接熔斷整個服務,而不是一直等到服務逾時。

  • 服務降級

    所謂降級,一般是從整體負荷考慮。就是當某個服務熔斷之後,伺服器将不再被調用。

    此時用戶端可以自己準備一個本地的fallback回調,傳回一個預設值。

    這樣做,雖然服務水準下降,但好歹可用,總比挂掉強。

Hystrix Dashbord

除了隔離依賴服務的調用以外,Hystrix還提供了準實時的調用監控(Hystrix Dashboard),Hystrix會持續地記錄所有通過Hystrix發起的請求的執行資訊,并以統計報表和圖形的形式展示給使用者,包括每秒執行多少請求多少成功,多少失敗等。Netflix通過hystrix-metrics-event-stream項目實作了對以上名額的監控。Spring Cloud也提供了Hystrix Dashboard的整合,對監控内容轉化成可視化界面。

  • 實作

    1、建立microservicecloud-consumer-hystrix-dashboard

    springCloud五大元件——Hystrix
    2、pom.xml
<!-- hystrix和 hystrix-dashboard相關 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
        </dependency>
           

3、application.yml

server:
  port: 9001
           

4、修改主啟動類 @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

springCloud五大元件——Hystrix

啟動三個Eureka叢集,啟動microservicecloud-provider-dept-hystrix-8001

通路http://localhost:8001/hystrix.stream

springCloud五大元件——Hystrix

圖形化監控

springCloud五大元件——Hystrix
springCloud五大元件——Hystrix

所有的provider微服務提供類都需要 監控依賴配置

<!-- actuator監控資訊完善 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
           

繼續閱讀