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的方法保持一致。