微服務spring cloud—Hystrix簡介和通過方式整合H
阿新 • • 發佈:2018-11-07
Hystrix簡介
Hystrix是由Netflix開源的延遲和容錯庫,用於隔離訪問遠端系統、服務或者第三方庫,防止級聯失敗,從而提升系統的可用性與容錯性。Hystrix主要通過以下幾點實現延遲和容錯。
包裹請求:使用HystrixCommand(或HystrixObservableCommand)包裹對以來 的呼叫邏輯,每個命令在獨立執行緒中執行。這是用到了設計模式中的“命令模式”。 跳閘機制:當某服務的錯誤率超過一定閾值,Hystrix可以自動或者手動跳閘, 停止請求該服務一段時間。 資源隔離:Hystrix為每個依賴都維護一個小型的執行緒池(或者訊號量)。如果 該執行緒池已滿,發往該依賴的請求就被立即拒絕,而不是排隊等待,從而加速 失敗判定。 監控:Hystrix可以近乎實時地監控執行指標和配置的變化,例如成功、失敗、 超時、以及被拒絕的請求等。 回退機制:當請求失敗、超時、被拒絕,或當斷路器開啟時,執行回退邏輯。 回退邏輯可由開發人員自行提供,例如返回一個預設值。 自我修復:斷路器開啟一段時間後,會自動進入“半開”狀態。斷路器開啟、關閉、 半開的邏輯轉換。
通用方式整合Hystrix
1.複製專案microservice-consumer-movie-ribbon,將ArtifactId修改為microservice-consumer-movie-ribbon-hystrix。
2.為專案新增hystrix依賴。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
< version>2.0.2.RELEASE</version>
</dependency>
3.在啟動類上添加註解@EnableCircuitBreaker或@EnableHystrix,從而為專案啟用斷路器支援。
4.修改MovieController,讓其中的findById方法具備容錯能力
@RestController
public class MovieController {
private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class );
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@HystrixCommand(fallbackMethod = "findByIdFallback")
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id){
return this.restTemplate.getForObject("http://users/" + id, User.class);
}
public User findByIdFallback(Long id) {
User user = new User();
user.setId(-1L);
user.setName("預設使用者");
return user;
}
}
有程式碼可知,為findById方法編寫一個回退方法findByIdFallback,該方法與findById方法具有相同的引數與返回值型別,該方法返回一個預設的User。
在findById方法上,使用註解@HystrixCommand的fallbackMethod屬性,指定回退方法是fallByIdFallback。
5.測試
1.啟動專案microservice-discovery-eureka。
2.啟動專案microservice-provider-user。
3.啟動專案microservice-consumer-movie-ribbon-hystrix。
4.訪問http://localhost:8010/user/1,獲得如下結果
5.停止microservice-provider-user。
6.再次訪問http://localhost:8010/user/1,獲得如下結果。
說明當使用者微服務不可用時,進入了回退方法。
本文大部分內容轉載自周立的《Spring Cloud與Docker微服務架構實戰》