這篇文章,主要介紹微服務組件之Hystrix實現(xiàn)服務降級和服務熔斷。
目錄
一、服務降級
1.1、什么是服務降級
1.2、實現(xiàn)服務降級
(1)引入依賴
(2)編寫Service層代碼
(3)編寫Controller層代碼
(4)運行測試
(5)fallbackMethod屬性
二、服務熔斷
2.1、什么是服務熔斷
2.2、實現(xiàn)服務熔斷
(1)引入依賴
(2)編寫Service層代碼
(3)編寫Controller層代碼
(4)運行測試
一、服務降級
1.1、什么是服務降級
服務降級:發(fā)生在客戶端側,當某個微服務自身出現(xiàn)大量的請求,從而沒辦法處理過來的時候,這個時候可以采取某種策略,將那些不重要的請求直接中斷,返回事先定義好的fallback方法(可以叫做兜底方法),這樣就可以為那些核心業(yè)務接口提供更多的資源。
服務降級是最簡單的一種實現(xiàn)方式,那什么情況下會出發(fā)服務降級呢???
- 第一種情況:當出現(xiàn)【HystrixBadRequestException】之外的異常時候,就會觸發(fā)服務降級。
- 第二種情況:當接口方法調用超時,觸發(fā)服務降級。
- 第三種情況:熔斷器開啟的時候。
- 第四種情況:線程池、隊列、信號量已經(jīng)達到最大值的時候。
1.2、實現(xiàn)服務降級
(1)引入依賴
<!--hystrix 依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)編寫Service層代碼
- 在service層中需要開啟服務降級的方法上面,使用【@HystrixCommand】注解,并且通過【fallbackMethod】屬性指定降級之后的兜底方法。
package com.gitcode.hystrix.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;
/**
* @version 1.0.0
* @Date: 2023/4/10 21:47
* @Author ZhuYouBin
* @Description 服務降級
*/
@Service
public class HystrixFallbackService {
/**
* 標記當前方法開啟服務降級
*/
@HystrixCommand(fallbackMethod = "reductionGradeFallback")
public String reductionGrade(String id) {
if (id.equals("1001")) {
throw new RuntimeException("模擬業(yè)務異常");
}
System.out.println("模擬調用其他微服務接口......");
return "success.";
}
/**
* fallback 方法,必須和 @HystrixCommand 注解標記的方法具備相同的【參數(shù)列表】、【返回值類型】
*/
private String reductionGradeFallback(String id) {
System.out.println("服務降級,請稍后重試!");
return "服務降級,請稍后重試!";
}
}
(3)編寫Controller層代碼
package com.gitcode.hystrix.controller;
import com.gitcode.hystrix.service.HystrixFallbackService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @version 1.0.0
* @Date: 2023/4/10 21:46
* @Author ZhuYouBin
* @Description 服務降級
*/
@RestController
@RequestMapping("/hystrix/fallback")
public class HystrixFallbackController {
@Autowired
private HystrixFallbackService hystrixFallbackService;
@GetMapping("/reduce")
public String reductionGrade(String id) {
return hystrixFallbackService.reductionGrade(id);
}
}
(4)運行測試
啟動工程,瀏覽器訪問【http://127.0.0.1:9898/hystrix/fallback/reduce?id=1001】時候,此時會拋出異常,觸發(fā)服務降級功能;修改id為其他的值,可以正常調用。
(5)fallbackMethod屬性
fallbackMethod屬性用于指定服務降級或者熔斷之后,調用的備選方法,在這個方法里面,我們可以根據(jù)具體的業(yè)務場景返回一些模擬數(shù)據(jù)。例如:當接口出現(xiàn)降級或者熔斷之后,可以從緩存里面、從數(shù)據(jù)庫里面查詢備選數(shù)據(jù),返回給客戶端。fallbackMethod 屬性指定的方法必須滿足下面這些規(guī)則:
- 1. 方法必須和 @HystrixCommand 注解標記的方法在【同一個類】里面。
- 2. 方法的【參數(shù)列表】必須和 @HystrixCommand 注解標記的方法參數(shù)列表相同。
- 3. 方法的【返回值類型】必須和 @HystrixCommand 注解標記的方法返回值相同。
二、服務熔斷
2.1、什么是服務熔斷
服務熔斷:發(fā)生在服務端側,當某個微服務出現(xiàn)故障導致服務不可用的時候,此時調用端服務發(fā)現(xiàn)服務不可用,此時就會開啟熔斷機制,阻斷所有請求服務端的請求,直接返回事先定義好的fallback方法。
服務熔斷,就像是電路中的保險絲一樣,當發(fā)現(xiàn)下游系統(tǒng)服務不可用的時候,此時hystrix就會開啟熔斷器,阻斷所有調用下游系統(tǒng)的接口,直接返回fallback方法。如果沒有設置fallback方法,則會執(zhí)行默認的返回策略。
熔斷器機制,hystrix提供了熔斷器,它的工作原理大致如下所示:
- 當調用下游服務接口正常時候,不會開啟熔斷器機制。
- 當調用下游服務接口的次數(shù)超過20個,并且接口調用失敗率超過50%,那么此時就會開啟熔斷器。
- 一旦熔斷器開啟之后,微服務就不會繼續(xù)調用下游系統(tǒng)接口,而是直接返回fallback指定的兜底方法(默認指定就執(zhí)行默認的方式)。
- 但是熔斷器不能一直處于熔斷狀態(tài),必須有重新開啟的時候,所以hystrix會默認每隔【5秒】嘗試調用下游系統(tǒng),判斷下游系統(tǒng)服務是否可用。
- 當hystrix發(fā)現(xiàn)下游系統(tǒng)服務重新可用的時候,此時就會關閉熔斷器。
服務降級和服務熔斷都可以使用一個事先準備好的fallback方法,這就相當于是一個后備方案,只不過這個方案不是正確的業(yè)務結果,但是通過這種方式,可以提高系統(tǒng)的可用性,為什么可以提高性能呢?可以這么想,因為每次請求到達服務器之后,都是直接返回fallback的結果,而不需要發(fā)起一個HTTP請求去調用另外一個微服務,所以這就減少了請求的次數(shù)。
2.2、實現(xiàn)服務熔斷
(1)引入依賴
<!--hystrix 依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
(2)編寫Service層代碼
package com.gitcode.hystrix.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* @version 1.0.0
* @Date: 2023/4/10 21:47
* @Author ZhuYouBin
* @Description 服務熔斷
*/
@Service
public class HystrixCircuitBreakerService {
/**
* 標記當前方法開啟服務降級
*/
@HystrixCommand(
commandProperties = {
// 啟用熔斷器
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED, value = "true"),
// 設置請求線程數(shù)量,默認是20個時候,發(fā)生熔斷,這設置成5個
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "5"),
// 請求線程失敗的比率,默認是大于50%時候發(fā)生熔斷
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "50"),
// 熔斷機制重試策略的時間間隔,默認是5秒重試一次
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "5"),
},
fallbackMethod = "circuitBreakFallback"
)
public String circuitBreaker(String id) {
if (id.equals("1001")) {
throw new RuntimeException("模擬業(yè)務異常");
}
System.out.println("模擬調用其他微服務接口......當前時間:" + LocalDateTime.now());
return "success.";
}
/**
* fallback 方法,必須和 @HystrixCommand 注解標記的方法具備相同的【參數(shù)列表】、【返回值類型】
*/
private String circuitBreakFallback(String id) {
System.out.println("服務熔斷降級,請稍后重試!");
return "服務熔斷降級,請稍后重試!";
}
}
(3)編寫Controller層代碼
package com.gitcode.hystrix.controller;
import com.gitcode.hystrix.service.HystrixCircuitBreakerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @version 1.0.0
* @Date: 2023/4/10 21:46
* @Author ZhuYouBin
* @Description 服務熔斷
*/
@RestController
@RequestMapping("/hystrix/fallback")
public class HystrixCircuitBreakerController {
@Autowired
private HystrixCircuitBreakerService service;
@GetMapping("/breaker")
public String circuitBreaker(String id) {
return service.circuitBreaker(id);
}
}
(4)運行測試
啟動工程,瀏覽器訪問【http://127.0.0.1:9898/hystrix/fallback/breaker?id=1001】,多訪問幾次,此時會導致hystrix開啟熔斷器,然后在訪問id不是1001的請求,查看控制臺輸出結果。
到此,Hystrix中服務降級和服務熔斷功能就介紹完啦。文章來源:http://www.zghlxwxcb.cn/news/detail-410363.html
綜上,這篇文章結束了,主要介紹微服務組件之Hystrix實現(xiàn)服務降級和服務熔斷。文章來源地址http://www.zghlxwxcb.cn/news/detail-410363.html
到了這里,關于【微服務筆記10】微服務組件之Hystrix實現(xiàn)服務降級和服務熔斷的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!