1. 程式人生 > >springboot中使用Hystrix做超時處理示例及問題分析

springboot中使用Hystrix做超時處理示例及問題分析

前言

此示例專案基於springboot 2.06 +hystrix

通過另一個專案在6543埠上開放一個介面,用於測試呼叫hystrix呼叫介面超時時候的處理策略。

具體實現

1. 開放介面

(此用於測試的介面我是在另一個springboot專案中開放的,且埠設定為6543,避免與8080埠衝突)

@RequestMapping(value = "hystrix_anther_sleep",method = RequestMethod.GET)
public String hystrixSlepp(){

    try {
        sleep(6000);
  } catch (InterruptedException e) {
        e.printStackTrace();
  }

    return "hystrix sleep 6s";
}

此介面訪問地址為:http://localhost:6543/leadsscoring/hystrix_sleep。

通過在介面中sleep 6s,測試當hystrix設定超時時間超過6s和小於6s時候的處理。

2. 測試hystrix的springboot專案

1) pom.xml

pom檔案與一般的springboot並無差別,只是在引入hystrix的依賴包的時候要注意一下,因為hystrix是springcloud中的微服務。我這裡引入的是微服務的依賴。所以需要註明springcloud的版本。

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

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

以上幾部分的配置就是在springboot中使用springcloud元件的方式。

2) application啟動類

@SpringBootApplication
@EnableCreateCacheAnnotation
@MapperScan("com.example.demo.dao")
@EnableMethodCache(basePackages = "com.example.demo")
@EnableHystrix
public class SpringbootDemoApplication {

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

上面幾個註解只有@EnableHystrix是我們本次測試hystrix所要用到的註解。其他是我測試其他東西所使用的註解。

3) controller

@RestController
public class HystrixController {

    @Autowired
    private IHystrixService hystrixService;
    
    @RequestMapping("get_hystrix_response")
    public String getHystrixResponse(){
        
        String another_result = hystrixService.anotherGetHystrixResponse("hdjh");
        
        return "another hystrix response:...."+another_result;
    }
    
}

4) service

@HystrixCommand(commandKey = "test2Command", groupKey = "testGroup",fallbackMethod = "TimeOutFallBack",ignoreExceptions = {Exception.class},
            commandProperties = {
                    @HystrixProperty(name = "execution.isolation.strategy",value = "THREAD"),
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "8000" )
            })
    @Override
    public String anotherGetHystrixResponse(String id) {
        
        RestTemplate restTemplate = new RestTemplate();
        
        HttpHeaders headers = new HttpHeaders();
        
        headers.add("Content-Type", "application/json; charset=UTF-8");
        headers.add("Accept", "*/*");
        
        HttpEntity<String> requestEntity = new HttpEntity<>("", headers);
        ResponseEntity<String> exchange = restTemplate.exchange("http://localhost:6543/leadsscoring/hystrix_anther_sleep", HttpMethod.GET, requestEntity,String.class);
        
        String body = exchange.getBody();
        
        return body;
        
    }
    
public String TimeOutFallBack(String id){
    return "sorry, the request is timeout";
}

service中關於hystrix中的註解功能的使用可以檢視筆記學習/springCloud/@HystrixCommand和@HystrixProperty的介紹與使用。這裡只做示例程式碼和遇到的一些問題記錄。

呼叫介面的方式是springboot中的restTemplate提供的方法。

進行測試

因為呼叫的介面是延遲了6秒再返回結果,所以我們分別測試超時時間設定為4秒和8秒的結果,按照預期的結果是超時的話會執行TimeOutFallBack方法。

設定超時時間為4s,頁面返回結果是:
在這裡插入圖片描述

設定超時時間為4s,頁面返回結果是:
在這裡插入圖片描述

由此可見,超時限制是沒有問題的。

遇到的問題

1. 問題1: 設定了超時時間卻沒有作用

專案啟動沒有報錯,介面呼叫也沒有問題。但是超時了卻沒有執行fallback方法。

沒有在application啟動類上加EnableHystrix

2. 問題2: 報錯fallback method wasn’t found: TimeOutFallBack([class java.lang.String])

在這裡插入圖片描述

在呼叫使用了hystrix註解的方法時候出現了這個錯誤,錯誤提示也很明顯,fallback的方法找不到,又看了一下官方的文件,

fallbackMethod:方法執行時熔斷、錯誤、超時時會執行的回退方法,需要保持此方法與 Hystrix 方法的簽名和返回值一致。

原來是fallback方法的名車與引數也要和hystrix的方法保持一致。