1. 程式人生 > >Spring Cloud 之 熔斷器 Hystrix、Hystrix Dashboard、Hystrix Turbine

Spring Cloud 之 熔斷器 Hystrix、Hystrix Dashboard、Hystrix Turbine

一、Hystrix 熔斷器

微服務架構中,服務之間相互呼叫,關係錯綜複雜,當某個基礎服務出現問題,網路原因或是其他原因,呼叫它的服務就可能出現執行緒阻塞,導致服務崩潰,引起雪崩效應。
Hystrix是Netflix公司的開源專案,提供熔斷器功能,防止分散式系統中的連鎖故障。
Hystrix核心:
- 快速失敗機制,當某個服務出現故障,呼叫該服務的快速失敗,阻止執行緒等待耗盡資源
- 提供回退方案,請求發生故障時,執行回退方案程式碼
當某個API介面的失敗次數在一定時間內小於一定的閥值(Hystrix 是5秒20次),熔斷器不工作,處於關閉狀態。反之。如果判定接口出現故障,開啟熔斷器,執行快速失敗邏輯,一定時間後處於半開啟狀態,執行部分請求,若執行成功了,關閉熔斷器,如果還是失敗了,熔斷器繼續開著。


#圖摘自官方文件,官方文件Spring Cloud Netflix 2.0
這裡寫圖片描述

1、在Ribbon上使用熔斷器

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

在應用主類添加註解@EnableHystrix

@SpringBootApplication
//通過@EnableEurekaClient向服務中心註冊
@EnableEurekaClient //開啟斷路器 @EnableHystrix @EnableDiscoveryClient public class RibbonApplication { public static void main(String[] args) { SpringApplication.run(RibbonApplication.class, args); } /** * 向程式的ioc注入一個bean: restTemplate;並通過@LoadBalanced註解表明這個restRemplate開啟負載均衡的功能。 */
@Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } }

改造HelloService
在helloService()方法上新增@HystrixCommand(fallbackMethod = “hiError”),這樣該方法就開啟了熔斷器功能。

@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;
    /**
     * 該註解對該方法建立了熔斷器的功能,並指定了fallbackMethod熔斷方法
     * fallbackMethod的返回值和引數型別需要和被@HystrixCommand註解的方法完全一致。否則會在執行時丟擲異常。
     * @param name
     * @return
     */
    @HystrixCommand(fallbackMethod = "hiError")
    public String helloService(String name) {
        return restTemplate.getForObject("http://SERVICE-HELLO/hi?name=" + name, String.class);
    }

    /**
     * 關閉SERVICE-HELLO,再訪問hiService方法就會跳這個方法
     * @param name
     * @return
     */
    public String hiError(String name) {
        return "hi," + name + ",sorry,error!";
    }
}

在熔斷器開啟的情況下訪問helloService()方法就會執行hiError()方法的邏輯。
依次啟動eureka-server,eureka-client,service-ribbon,訪問:http://localhost:8004/hello/hi?name=mistra
順利執行了helloService()方法的邏輯,瀏覽器輸出“hi mistra,i am from port:8003”。
現在關閉eureka-client服務,訪問:http://localhost:8004/hello/hi?name=mistra。瀏覽器輸出“hi,mistra,sorry,error!”。執行了fallbackMethod 的邏輯。
通過快速失敗,請求能夠及時得到處理,執行緒不在阻塞。

2、在Feign上使用熔斷器

改造這篇文章的工程:Spring Cloud 之 宣告式REST客戶端 Feign元件
檢視Maven依賴可以發現Feign包中已經預設集成了Hystrix。
這裡寫圖片描述
正常情況下是不需要再新增依賴的。但是今天我這裡啟動報了一個錯誤”Caused by: java.lang.NoClassDefFoundError: com/netflix/hystrix/contrib/javanica/aop/aspectj/HystrixC”,我新增了下面這個依賴:

 <dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-javanica</artifactId>
    <version>1.5.12</version>
</dependency>

feign是預設關閉了Hystrix功能的,只需要在配置檔案中開啟就可以了。
修改application.yml,新增配置

feign: 
  hystrix:
    enabled: true

工程結構:
這裡寫圖片描述
新建ServiceHiHystric作為快速失敗處理類,必須實現FeignService介面,並注入到Ioc容器。

@Component
public class ServiceHiHystric  implements FeignService{

    @Override
    public String sayHiFromClientOne(String name) {
        return "sorry " + name;
    }
}

改造FeignService,新增快速失敗處理邏輯類ServiceHiHystric

@Service
@FeignClient(value = "service-hello",fallback = ServiceHiHystric.class)
public interface FeignService {

    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String sayHiFromClientOne(@RequestParam(value = "name") String name);
}

依次啟動eureka-server,eureka-client,service-feign。
這裡寫圖片描述
訪問:http://localhost:8005/hi?name=mistra
瀏覽器正常輸出:”hi mistra,i am from port:8003”
關閉eureka-client服務,再次訪問
瀏覽器輸出:”sorry mistra”
由此可見,當呼叫的服務不可用時,會進入到fallback的邏輯處理類,執行相應的邏輯。

二、Hystrix Dashboard熔斷器監控

(在上面service-feign工程的基礎上修改)
顧名思義,就是對熔斷器的執行狀況和指標進行監控,提供圖形化介面展示。下圖來自官方文件文件地址
這裡寫圖片描述
在Hystix的基礎上新增依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

在應用主類上添加註解:

  • @EnableHystrixDashboard,開啟HystrixDashboard
  • @EnableCircuitBreaker,開啟Actuator

如果使用的Spring boot 為 2.0 +,為了安全,預設 Actuator 只暴露了2個端點,heath 和 info。我們還要配置暴露所有端點,配置檔案新增配置:

management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
      health:
        show-details: ALWAYS

瀏覽器訪問:http://localhost:專案埠/hystrix
這裡寫圖片描述
有3個輸入框,在第一個填入http://localhost:專案埠/actuator/hystrix.stream,下面的延遲和標題隨意。點選Monitor Stream連續監測
這裡寫圖片描述

三、Hystrix Turbine熔斷器聚合監控

(在上面service-feign工程的基礎上修改)
Hystrix Dashboard只是對單個model進行監控,程式有很多個model,Hystrix Turbine就是將每個服務Hystrix Dashboard資料進行了整合。將多個服務的Hystrix Dashboard資料放在一個頁面展示,進行集中監控。Turbine是聚合多個服務,通過服務例項 id 聚合,所以要註冊到 eureka-server 中,獲取服務列表,用以聚合監控。
在原來的基礎上引入依賴:

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

應用主類添加註解:@EnableTurbine

配置檔案新增配置:參考文件

turbine:
  # 配置 eureka-server 中的 serviceId 列表,指定要監控的服務
  app-config: service-feign,service-ribbon
  aggregator:
    cluster-config: default
  # 指定叢集名稱
  cluster-name-expression: "'default'" 

原始碼

這裡寫圖片描述