一.什麼是服務雪崩效應
服務雪崩效應產生與服務堆積在同一個線程池中,因爲所有的請求都是同一個線程池進行處理,這時候如果在高併發情況下,所有的請求全部訪問同一個接口,
這時候可能會導致其他服務沒有線程進行接受請求,這就是服務雪崩效應效應。
二.怎麼解決雪崩效應?
解決雪崩的方案就是 服務降級+服務熔斷,服務隔離,服務限流
服務降級
在高併發情況下,防止用戶一直等待,使用服務降級方式(直接返回一個友好的提示給客戶端,調用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("系統錯誤,請稍後重試!"); }
}
|