1. 程式人生 > >spring-cloud-starter-hystrix(斷路器)服務不通或者調用失敗後的錯誤處理和回調

spring-cloud-starter-hystrix(斷路器)服務不通或者調用失敗後的錯誤處理和回調

系統 comm cli 處理 參考 quest 微服務架構 ron 100%

雪崩效應

在微服務架構中通常會有多個服務層調用,大量的微服務通過網絡進行通信,從而支撐起整個系統。各個微服務之間也難免存在大量的依賴關系。然而任何服務都不是100%可用的,網絡往往也是脆弱的,所以難免有些請求會失敗。基礎服務的故障導致級聯故障,進而造成了整個系統的不可用,這種現象被稱為服務雪崩效應。服務雪崩效應描述的是一種因服務提供者的不可用導致服務消費者的不可用,並將不可用逐漸放大的過程。

Netflix Hystrix斷路器

Netflix的Hystrix類庫實現了斷路器模式,在微服務架構中有多個層的服務調用。一個低水平的服務群中一個服務掛掉會給用戶導致級聯失效。調用一個特定的服務達到一定閾值(在Hystrix裏默認是5秒內20個失敗),斷路由開啟並且調用沒有成功的。開發人員能夠提供錯誤原因和開啟一個斷路由回調。

斷路器簡介

Netflix has created a library called Hystrix that implements the circuit breaker pattern. In a microservice architecture it is common to have multiple layers of service calls.

—-摘自官網

Netflix已經創建了一個名為Hystrix的庫來實現斷路器模式。 在微服務架構中,多層服務調用是非常常見的。

技術分享

較底層的服務如果出現故障,會導致連鎖故障。當對特定的服務的調用達到一個閥值(hystric 是5秒20次) 斷路器將會被打開。

技術分享

斷路打開後,可用避免連鎖故障,fallback方法可以直接返回一個固定值。

使用Hystrix

第一步:

POM添加依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>

Application入口main方法上增加@EnableCircuitBreaker註解

技術分享

第二步:

基於RestTemplate的調用方式集成:

在方法上加上@HystrixCommand,並指定fallbackMethod方法。

@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "hiError")
    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }

    public String hiError(String name) {
        return "hi,"+name+",sorry,error!";
    }
}

基於Feign的方式:

在SchedualServiceHi接口的註解中加上fallback的指定類就行了:

@FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class)
public interface SchedualServiceHi {
    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}

SchedualServiceHiHystric類:

@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
    @Override
    public String sayHiFromClientOne(String name) {
        return "sorry "+name;
    }
}

果使用feign不想用斷路器的話,可以在配置文件中關閉它,配置如下:

feign.hystrix.enabled=false

第三步:

一些通用配置:

參考官網:https://github.com/Netflix/Hystrix/wiki/Configuration

Maven示例:

https://github.com/easonjim/spring-cloud-demo/tree/master/ZooKeeper

參考:

https://zhuanlan.zhihu.com/p/26426835(以上內容部分內容轉自此篇文章)

http://blog.csdn.net/w_x_z_/article/details/53444199(以上內容部分內容轉自此篇文章)

spring-cloud-starter-hystrix(斷路器)服務不通或者調用失敗後的錯誤處理和回調