SpringCloud無廢話入門04:Hystrix熔斷器及監控

1.斷路器(Circuit Breaker)模式html

        在上文中,咱們人爲停掉了一個provider,在實際的生產環境中,由於意外某個服務down掉,甚至某一層服務down掉也是會是有發生的。一旦發生這種狀況,咱們須要將損失減小到最低限度。java

        那怎麼減小損失。在電力系統中,若是某個電器發生過載等問題,該段電路的繼電器中的保險絲就會熔斷。在分佈式系統中,咱們也能夠設計這樣的模式,併爲它賦有專有名詞:斷路器(Circuit Breaker)模式。web

        其基本模式在Martin Fowler的一篇文章中進行過專有描述,其大概的架構圖以下:spring

        它描述了兩個狀態:close、open,以及一個動做:trip,瀏覽器

        close狀態下, client經過熔斷器向supplier發起的服務請求, supplier的返回值通過熔斷器返回client。架構

        open狀態下,c client經過熔斷器向supplier發起的服務請求,熔斷器直接返回值給client, client和supplier之間被隔斷。app

        Trip動做: 若是在close狀態下, supplier持續超時報錯, 熔斷器就進行trip,而後熔斷器將狀態從close進入open。分佈式

        除了基本模式,Martin Fowler還描述了一種擴展模式。即熔斷器按期探測supplier的服務的狀態, 一旦服務恢復, 就將狀態設置回close,而且熔斷器進行重試時的狀態爲half-open狀態。ide

        對於熔斷器模式,再也不詳細展開。接下來咱們看看在SpringCloud的系統中,熔斷器是怎麼提供的。spring-boot

2.Hystrix熔斷與服務降級

        SpringCloud Netflix實現的熔斷器叫Hystrix。咱們首先看看微服務架構下, 瀏覽器如何訪問後臺服務,

        而後,服務異常狀況下,Hystrix經過提供Fallback進行了熔斷的保護,

        Hystrix設定的熔斷閾值是:5秒以內發生20次調用失敗,而後熔斷器就會被處於open狀態, 在熔斷狀態下,服務再也不被調用, Hystrix提供一個Fallback回調。固然,這個回調能夠由咱們實現。

        Fallback是一種降級操做,這種行爲咱們定義爲:服務降級。 

3.實現

        首先,在服務接口的聲明中,加入FeignClient註解的fallback屬性,

package com.zuikc;

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(value = "hello-service",fallback = FeignFallBack.class)

public interface HelloService {

    //服務中方法的映射路徑

    @RequestMapping("/hello")

    String hello();

}

        注意,假設這裏咱們沒有使用FeignClient註解,而是原先那種url方式來啓動LB的話,那麼,那麼就須要在具體的service中直接使用註解:@HystrixCommand(fallbackMethod = "helloFallBack"),來實現熔斷和服務降級。helloFallBack能夠是具體服務類中的一個指定的方法。

        接下來,而後接着說FeignClient,實現該FeignFallBack類,

package com.zuikc;

import org.springframework.stereotype.Component;

/**

 * @ClassName FeignFallBack

 * @Description 咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系「碼農星球」

 * @Author 碼農星球

 **/

@Component

public class FeignFallBack implements HelloService {

    //實現的方法是服務調用的降級方法

    @Override

    public String hello() {

        return "error";

    }

}

        這個類實現了HelloService。若是provider調用失敗,就會執行該類的實現。

        最後,還得配置,

server:

  port: 9291

spring:

  application:

    name: Ribbon-Consumer

eureka:

  client:

    service-url:

      defaultZone: http://localhost:9091/eureka/

#providers這個是本身命名的,ribbon,listOfServer這兩個是規定的

providers:

  ribbon:

    listOfServers: http://localhost:9191/eureka,http://localhost:9192/eureka

feign:

  hystrix:

    enabled: true

        粗體部分就是新加的配置。Feign默認禁用熔斷器,因此咱們須要配置爲enabled。

        通過以上功能的改進後,中止provider吧,看看結果是什麼呢?

4.監控

        SpringCloud作的比dubbo好的一點就是其監控很是的明瞭。咱們能夠用hystrix的監控方便的看到熔斷器的數據指標。

        要想監控這些數據,咱們還得繼續改造咱們的項目。

        首先,在provider的pom中加入依賴:

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-actuator</artifactId>

        </dependency>

        其次,在咱們ribbon項目中,加入依賴:

        <dependency>

            <groupId>com.netflix.hystrix</groupId>

            <artifactId>hystrix-javanica</artifactId>

            <version>RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-netflix-hystrix-dashboard</artifactId>

        </dependency>

        第一個依賴表示咱們得有監控,第二個依賴表示咱們得有一個儀表盤。

        接着,讓咱們在ribbon的啓動類中加入一個servlet,以下:

package com.zuikc;

import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.web.servlet.ServletRegistrationBean;

import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;

import org.springframework.cloud.openfeign.EnableFeignClients;

import org.springframework.context.annotation.Bean;

import org.springframework.web.client.RestTemplate;

/**

 * @ClassName ServiceRibbonApplication

 * @Description 咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系「碼農星球」

 * @Author 碼農星球

 **/

@SpringBootApplication

@EnableDiscoveryClient

@EnableFeignClients

@EnableCircuitBreaker

@EnableHystrixDashboard

public class ServiceRibbonApplication {

    public static void main(String[] args) {

        SpringApplication.run(ServiceRibbonApplication.class, args);

    }

    @Bean

    @LoadBalanced

    RestTemplate restTemplate() {

        return new RestTemplate();

    }

    @Bean

    public ServletRegistrationBean getServlet(){

        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();

        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);

        registrationBean.setLoadOnStartup(1);

        registrationBean.addUrlMappings("/actuator/hystrix.stream");

        registrationBean.setName("HystrixMetricsStreamServlet");

        return registrationBean;

    }

}

        在這個啓動類中,除了這個servlet要註冊以外,就是加入

        @EnableCircuitBreaker

        @EnableHystrixDashboard

        這兩個註解了。注意,因爲hystrix默認就是支持熔斷器的,因此@EnableCircuitBreaker註解以前咱們並無加。可是,這裏要使用監控了,就必需要加入這個註解了。

        以上都操做完畢。來打開:http://localhost:9291/hystrix

        而後在出來的以下界面中,首先填入servlet的地址,其次點擊下面的monitor按鈕,

        最終進入到以下這個監控儀表盤界面。每一次對provider的調用,都會清清楚楚被儀表盤呈現出來。

        Ok。本章告一段落。

        感謝關注「碼農星球」。本文版權屬於「碼農星球」。咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系咱們。

本文的參考1:

https://martinfowler.com/bliki/CircuitBreaker.html

本文的參考2:

http://cloud.spring.io/spring-cloud-netflix/multi/multi__circuit_breaker_hystrix_clients.html

相關文章
相關標籤/搜索