spring cloud之斷路器hystrix(五)

青鳥&飛魚發表於2017-11-28

1.Hystrix介紹

斷路器:Hystrix客戶端

Netflix的創造了一個呼叫的庫Hystrix實現了斷路器圖案。在微服務架構中,通常有多層服務呼叫。

HystrixGraph

圖1.微服務圖

較低階別的服務中的服務故障可能導致使用者級聯故障。當對特定服務的呼叫達到一定閾值時(Hystrix中的預設值為5秒內的20次故障),電路開啟,不進行通話。在錯誤和開路的情況下,開發人員可以提供後備。

HystrixFallback

圖2. Hystrix回退防止級聯故障

開放式電路會停止級聯故障,並允許不必要的或失敗的服務時間來癒合。回退可以是另一個Hystrix保護的呼叫,靜態資料或一個正常的空值。回退可能被連結,所以第一個回退使得一些其他業務電話又回到靜態資料。

 

2.專案中的使用Hystrix

要在專案中包含Hystrix,請使用組org.springframework.cloud和artifact id spring-cloud-starter-hystrix的啟動器。有關使用當前的Spring Cloud釋出列表設定構建系統的詳細資訊,請參閱Spring Cloud專案頁面

示例啟動應用程式:

pom.xml中加

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud</artifactId>
        <groupId>com.alen</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <artifactId>hystrix-service</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!--spring-cloud-starter-eureka已經引了,所以可引可不引-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
       <!-- 斷路器-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

使用EnableCircuitBreaker或者 EnableHystrix 表明Spring boot工程啟用hystrix,兩個註解是等價的. 

@SpringBootApplication
//通過註解@EnableEurekaClient 表明自己是一個eurekaclient.
@EnableEurekaClient
//註解開啟Hystrix
@EnableHystrix
public class HystrixApplication {

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

   /**
    * 向程式的ioc注入一個bean: restTemplate;
    * 並通過@LoadBalanced註解表明這個restRemplate開啟負載均衡的功能。
    */
   @Bean
   @LoadBalanced
    public     RestTemplate restTemplate() {
      return new RestTemplate();
   }
}

@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;
    @Value("${eurekaclientURL}")
    private String eurekaclientURL;

    //該註解對該方法建立了熔斷器的功能,並指定了fallbackMethod熔斷方法
    //有個坑 這個方法fallbackMethod = "failError"的方法引數還得和getAge原方法的一樣才行
    @HystrixCommand(fallbackMethod = "failError")
    public String getAge(Integer age) {
        return restTemplate.getForObject(eurekaclientURL + age, String.class);
    }

    public String failError(Integer age) {
        return "hi,"+age+",sorry,error!";
    }
}

 

@RestController
public class HelloController {
    @Autowired
    private HelloService helloService;

    /**
     * 服務呼叫 消費者
     * @param age
     * @return
     */
    @RequestMapping("/getage")
    public String getConsumer(@RequestParam Integer age) {
        return helloService.getAge(age);
    }
}


失敗時結果:
hi,10,sorry,error!

 

3.Feign中使用斷路器

Feign是自帶斷路器的

基於service-feign工程進行改造,只需要在FeignClient的HelloService介面的註解中加上fallback的指定類就行了:

@FeignClient(value ="eureka-client",fallback = HelloServiceImpl.class)
public interface HelloService {
    @RequestMapping("/hello")
     //必須顯示的指定age,不顯示還不行
      String hello(@RequestParam("age") Integer age);
}

HelloServiceImpl 需要實現HelloService 介面,並注入到Ioc容器中,程式碼如下:
public class HelloServiceImpl implements HelloService {
    @Override
    public String hello(Integer age) {
        return age+"失敗";
    }
}

呼叫失敗時:10失敗

這證明斷路器起到作用了。

4.Hystrix Dashboard (斷路器:Hystrix 儀表盤)

Hystrix儀表板

Hystrix的主要優點之一是它收集關於每個HystrixCommand的一套指標。Hystrix儀表板以有效的方式顯示每個斷路器的執行狀況。

基於hystrix-service 改造,Feign的改造和這一樣。

首選在pom.xml引入spring-cloud-starter-hystrix-dashboard的起步依賴:

 
      <!--Hystrix儀表板
      Hystrix的主要優點之一是它收集關於每個HystrixCommand的一套指標。
      Hystrix儀表板以有效的方式顯示每個斷路器的執行狀況-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
      </dependency>

在主程式啟動類中加入@EnableHystrixDashboard註解,開啟hystrixDashboard:

@SpringBootApplication
//通過註解@EnableEurekaClient 表明自己是一個eurekaclient.
@EnableEurekaClient
//開啟Feign的功能
@EnableFeignClients
public class FeignServiceApp {
   public static void main(String[] args) {
      SpringApplication.run(FeignServiceApp.class, args);
   }
}

開啟瀏覽器:訪問http://localhost:8085/hystrix,介面如下:

健康指標

連線斷路器的狀態也暴露在呼叫應用程式的/health端點中。

{
    "hystrix": {
        "openCircuitBreakers": [
            "StoreIntegration::getStoresByLocationLink"
        ],
        "status": "CIRCUIT_OPEN"
    },
    "status": "UP"
}

Hystrix指標流

要使Hystrix指標流包含對spring-boot-starter-actuator的依賴。這將使/hystrix.stream作為管理端點。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

 

5.Hystrix超時和Ribbon客戶

當使用包含Ribbon客戶端的Hystrix命令時,您需要確保您的Hystrix超時配置為長於配置的Ribbon超時,包括可能進行的任何潛在的重試。例如,如果您的Ribbon連線超時為一秒鐘,並且Ribbon客戶端可能會重試該請求三次,那麼您的Hystrix超時應該略超過三秒鐘。

 

參考:

http://blog.csdn.net/forezp/article/details/69934399

https://springcloud.cc/spring-cloud-dalston.html#_circuit_breaker_hystrix_clients

相關文章