SpringCloud學習筆記 -----Hystrix 服務降級、熔斷機制、服務隔離

一.什麼是服務雪崩效應

服務雪崩效應產生與服務堆積在同一個線程池中,因爲所有的請求都是同一個線程池進行處理,這時候如果在高併發情況下,所有的請求全部訪問同一個接口,
這時候可能會導致其他服務沒有線程進行接受請求,這就是服務雪崩效應效應。

二.怎麼解決雪崩效應?

解決雪崩的方案就是 服務降級+服務熔斷,服務隔離,服務限流

服務降級

在高併發情況下,防止用戶一直等待,使用服務降級方式(直接返回一個友好的提示給客戶端,調用fallBack方法)

服務熔斷

熔斷機制目的爲了保護服務,在高併發的情況下,如果請求達到一定極限(可以自己設置闊值)如果流量超出了設置閾值,讓後直接拒絕訪問,保護當前服務。使用服務降級方式返回一個友好提示,服務熔斷和服務降級一起使用

服務隔離

因爲默認情況下,只有一個線程池會維護所有的服務接口,如果大量的請求訪問同一個接口,達到tomcat 線程池默認極限,可能會導致其他服務無法訪問。

解決服務雪崩效應:使用服務隔離機制(線程池方式和信號量),使用線程池方式實現隔離的原理:  相當於每個接口(服務)都有自己獨立的線程池,因爲每個線程池互不影響,這樣的話就可以解決服務雪崩效應。

  線程池隔離:

  每個服務接口,都有自己獨立的線程池,每個線程池互不影響。

  信號量隔離:

使用一個原子計數器(或信號量)來記錄當前有多少個線程在運行,當請求進來時先判斷計數器的數值,若超過設置的最大線程個數則拒絕該請求,若不超過則通行,這時候計數器+1,請求返 回成功後計數器-1。

服務限流

   服務限流就是對接口訪問進行限制,常用服務限流算法令牌桶、漏桶。計數器也可以進行粗暴限流實現。

 

三.SpringCloud的組件Hystrix 完美提供瞭解決方案

Maven依賴信息

<!-- hystrix斷路器 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>

</dependency>

開啓Hystrix斷路器。記得別禁止超時時間,只要把超時時間設置長一點就行了

feign:

  hystrix:

enabled: true

    

#### hystrix禁止服務超時時間

hystrix:  

 command: 

   default: 

      execution: 

       timeout: 

        enabled: false

 

@SpringBootApplication

@EnableEurekaClient

@EnableFeignClients

@EnableHystrix

public class MyApplication{

public static void main(String[] args) {

SpringApplication.run(AppOrder.class, args);

}

 

}

 

 

 

服務降級處理

@HystrixCommand(fallbackMethod = "orderToUserInfoFallback")

@GetMapping("/orderToUserInfo")

public ResponseBase orderToUserInfoHystrix() {

System.out.println("orderToUserInfo:" + "當前線程池名稱:" + Thread.currentThread().getName());

return memberServiceFeigin.getUserInfo();

}

 

@RequestMapping("/orderToUserInfoFallback")

public ResponseBase orderToUserInfoFallback() {

return setResultError("系統錯誤!!!!");

}

使用@HystrixCommand 註解就接口對立一個線程池,就服務隔離的線程池隔離方案,不會影響到其他接口的正常使用,就是對CPU要求有點高,土豪可以無視

Fallback回調

@RequestMapping("/orderToUserInfo")

public ResponseBase orderToUserInfo() {

return memberServiceFeigin.getUserInfo();

}

 

  @Component

public class MemberServiceFallback extends BaseApiService implements   MemberServiceFeigin {

public ResponseBase getUserInfo() {

// 服務降級處理

return setResultError("系統錯誤,請稍後重試!");

}

 

}

 

 

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