SpringCloud框架初探(六) : Hystrix容錯保護

源碼地址:SpringCloud學習源碼

在微服務架構中,根據業務來拆分成一個個的服務,服務與服務之間可以相互調用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來調用。爲了保證其高可用,單個服務通常會集羣部署。由於網絡原因或者自身的原因,服務並不能保證100%可用,如果單個服務出現問題,調用這個服務就會出現線程阻塞,此時若有大量的請求湧入,Servlet容器的線程資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應。

針對上述問題,Spring Cloud Hystrix實現了斷路器、線程隔離等一系列服務保護功能。它也是基於Netflix的開源框架Hystrix實現的,該框架的目標在於通過控制那些訪問遠程系統、服務和第三方庫的節點, 從而對延遲和故障提供更強大的容錯能力。Hystrix具備服務降級、服務熔斷、線程和信號隔離、請求緩存、請求合併以及服務監控等強大功能。

在未加入斷路器之前,如果將Eureka服務提供者停掉,那麼在執行Eureka 消費者的時候,會發生錯誤:
在這裏插入圖片描述

配置斷路器:

在服務消費者中啓用斷路器機制@EnableHystrix或者@EnableCircuitBreaker

@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class ConsumerMovieRibbonApplication {

  @Bean
  @LoadBalanced
  public RestTemplate restTemplate() {
    return new RestTemplate();
  }

  public static void main(String[] args) {
    SpringApplication.run(ConsumerMovieRibbonApplication.class, args);
  }
}

在接口上方配置@HystrixCommand(fallbackMethod = “fallback”)

定義對應的fallbackMethod 。

@RestController
public class MovieController {
  @Autowired
  private RestTemplate restTemplate;
  @Autowired
  private LoadBalancerClient loadBalancerClient;


  @HystrixCommand(fallbackMethod = "fallback")
  @GetMapping("/movie/{id}")
  public String findById(@PathVariable Long id) {
    ServiceInstance serviceInstance = this.loadBalancerClient.choose("provider-user");
    System.out.println("===" + ":" + serviceInstance.getServiceId() + ":" + serviceInstance.getHost() + ":" + serviceInstance.getPort());
    return this.restTemplate.getForObject("http://provider-user/simple/" + id, User.class).toString();
  }
  
  
  public String fallback(Long id){
      return "fallback error:"+id;
  }

}

然後,再次啓用Eureka 註冊中心,Eureka服務消費者,關閉Eureka服務提供者,執行消費者請求,會發現:

在這裏插入圖片描述

需要注意的是:fallbackMethod 和接口方法的返回值,需要保持一致。

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