Hystrix服务降级的两种处理方式@HystrixCommand注解和定义统一fallback接口
項目地址:?鏈接:https://pan.baidu.com/s/1Mxo0ltvZbpz_r8mCU-mSpw?
提取碼:3j4a?
問題答疑:
Hystrix服務保護框架,在微服務中Hystrix能夠為我們解決哪些問題?
? ? ? ? 1.斷路器
?? ??? ?2.服務降級
?? ??? ?3.服務熔斷
?? ??? ?4.服務隔離機制
?? ??? ?5.服務雪崩效應 連環雪崩效應 如果嚴重的話,可能會導致整個微服務接口無法訪問,所有服務器都會癱瘓.
基于Hystrix解決服務雪崩效應原理:
? ? ? ? 服務降級
?? ??? ? ? ?1.在高并發的情況下,防止用戶一直等待.使用服務降級方式(返回一個友好的提示直接給客戶端,不會去處理請求,調用fallBack)
?? ??? ??? ??? ? ?目的是為了用戶體驗.
?? ??? ??? ?2.場景:秒殺-----當前請求人數過多,請稍后嘗試. (在tomcat中沒有線程進行處理客戶端請求的時候,不應該讓用戶一直轉圈等待)
?? ??? ??? ?3.如果調用其他接口超時的時候(默認是1秒時間),如果在一秒鐘沒有及時響應返回的話,(默認情況下業務邏輯是可以執行的)則直接執行服務降級.
?? ??? ?服務隔離機制
?? ??? ??? ?服務熔斷目的是為了保護服務,在高并發情況下,如果請求達到了一定的極限(可以自己設置閾值).如果流量
?? ??? ??? ?超出了設置的閾值,自動開啟保護服務功能,使用服務降級方式返回友好提示.熔斷機制和服務降級一起使用.
?? ??? ?服務熔斷
?? ??? ??? ?隔離方式線程池和信號量隔離.
?? ??? ??? ?線程池隔離:每個服務接口都有自己獨立的線程池,每個線程池互不影響,缺點:CPU占用率非常高.不是所有
?? ??? ??? ? ? ? ? ? ? 的接口都去采用線程池隔離,核心關鍵接口.
源碼地址 : 鏈接:https://pan.baidu.com/s/17-cFGA3fJFLF8gcnDZdWXg?
提取碼:1q9z? ?具體見解壓說明文件
1.先說常用和推薦使用的一種方式: 定義統一fallback接口
? ? 1.pom.xml依賴?
<!--Hystrix斷路器--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>? ? ?2.application.properties配置文件
#指定運行端口 server.port=8200 #服務名稱 spring.application.name=order #獲取注冊實例列表 eureka.client.fetch-registry=true #注冊到Eureka的注冊中心 eureka.client.register-with-eureka=true #配置注冊中心地址 #eureka.client.zhang.service-url.defaultZone=http://localhost:8001/eureka/ eureka.client.service-url.defaultZone=http://localhost:8000/eureka/#feign客戶端建立連接超時時間 feign.client.config.default.connect-timeout=10000 #feign客戶端建立連接后讀取資源超時時間 feign.client.config.default.read-timeout=10000#開啟Hystrix斷路器 feign.hystrix.enabled=true #配置Hystrix 超時時間 超時關閉 #hystrix.command.default.execution.timeout.enabled=false #超時時間(默認1000ms)在調用方配置,被該調用方的所有方法的超時時間都是該值,優先級低于下邊的指定配置 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000 #在調用方配置,被該調用方的指定方法(HystrixCommandKey方法名)的超時時間是該值 hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds=4000 #線程池核心線程數 默認為10 hystrix.threadpool.default.coreSize=10 #最大排隊長度。默認-1 如果要從-1換成其他值則需重啟,即該值不能動態調整,若要動態調整,需要使用到下邊這個配置 hystrix.threadpool.default.maxQueueSize=100 #排隊線程數量閾值,默認為5,達到時拒絕,如果配置了該選項,隊列的大小是該隊列 hystrix.threadpool.default.queueSizeRejectionThreshold=5 # 簡言之,10s內請求失敗數量達到20個,斷路器開。 當在配置時間窗口內達到此數量的失敗后,進行短路。默認20個 hystrix.command.default.circuitBreaker.requestVolumeThreshold=20 #短路多久以后開始嘗試是否恢復,默認5s hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5 #出錯百分比閾值,當達到此閾值后,開始短路。默認50% hystrix.command.default.circuitBreaker.errorThresholdPercentage=50% #調用線程允許請求HystrixCommand.GetFallback()的最大數量,默認10。超出時將會有異常拋出,注意:該項配置對于THREAD隔離模式也起作用 hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=50000? 3.定義Feign調用接口,和新建統一fallback處理類并實現Feign調用接口
@FeignClient(value = "member",fallback = MemberServiceFallback.class) public interface MemberServiceFeign extends IMemberService {//此處為方便調用member服務的接口,采用直接繼承member服務接口 不易寫錯且減少代碼量//@FeignClient(value = "member",fallback = MemberServiceFallback.class)//value值為被調用服務名 fallback 值為 統一定義的fallback 類} @Component public class MemberServiceFallback implements MemberServiceFeign {@Overridepublic UserEntity getMember(String name) {return null;}//服務降級友好提示@Overridepublic ResultVO getUserinfo() {return new ResultVO(StatusCode.RESULT_SUCCESS,"服務器忙!請稍后重試!!!");} }4.啟動類
@SpringBootApplication @EnableEurekaClient //開啟eureka客戶端 @EnableFeignClients //開啟feign調用 @EnableHystrix //開啟hystrix public class AppOrder {public static void main(String[] args) {SpringApplication.run(AppOrder.class, args);} }5.Feign調用服務降級測試接口(被調用member服務接口實現,睡眠5秒,配置超時3秒,故會超時)
@RestController public class OrderServcieImpl implements IOrderService {@Autowiredprivate MemberServiceFeign memberServiceFeign;//hystrix第二種寫法,使用類方式@RequestMapping("/orderToMemberUserInfoHystrixDemo02")public ResultVO orderToMemberUserInfoHystrixDemo02() {System.out.println("orderToMemberUserInfoHystrixDemo02: 線程池名稱:"+Thread.currentThread().getName());return memberServiceFeign.getUserinfo();} } @Override @RequestMapping("/getUserinfo") public ResultVO getUserinfo() {try {Thread.sleep(5000);}catch (Exception e){e.printStackTrace();}return new ResultVO(StatusCode.RESULT_SUCCESS,"訂單服務接口調用會員服務接口成功...."+serverPort);} }6.啟動eureka member? order 等服務,測試
2.@HystrixCommand注解方式
??1.pom.xml文件??application.properties配置文件? 啟動類? ?同方法一? ?Feign調用服務接口 不要fallback
? 2.測試代碼?
//解決服務雪崩效應 hystrix有兩種方式配置保護服務 通過注解和接口形式//fallbackMethod 方法的作用:服務降級執行//@HystrixCommand 默認開啟了線程池隔離方式 ,服務降級,服務熔斷@HystrixCommand(fallbackMethod = "orderToMemberUserInfoHystrixFallbackMethod")@RequestMapping("/orderToMemberUserInfoHystrix")public ResultVO orderToMemberUserInfoHystrix() {System.out.println("orderToMemberUserInfoHystrix: 線程池名稱:"+Thread.currentThread().getName());return memberServiceFeign.getUserinfo();}//服務降級處理方法public ResultVO orderToMemberUserInfoHystrixFallbackMethod(){return new ResultVO(StatusCode.RESULT_SUCCESS,"返回友好提示:服務降級 !!! 服務器忙,請稍后重試!!!!");}? 3.啟動服務,調用接口測試
總結
以上是生活随笔為你收集整理的Hystrix服务降级的两种处理方式@HystrixCommand注解和定义统一fallback接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSDN日报190219——表面上又佛又
- 下一篇: 手机验证码获取