源碼地址: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 和接口方法的返回值,需要保持一致。