這篇文章給大家分享的是有關(guān)Spring Cloud中Feign與Hystrix整合的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供廣靈企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、成都網(wǎng)站建設(shè)、HTML5、小程序制作等業(yè)務(wù)。10年已為廣靈眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進行中。
Feign對Hystrix提供了支持,為“服務(wù)調(diào)用者”加入以下Feign依賴:
org.springframework.cloud spring-cloud-starter-feign
在application.yml中打開Feign的Hystrix開關(guān),請見以下配置:
feign: hystrix: enabled: true
在應(yīng)用啟動類里面,加入開Feign的開關(guān),本小節(jié)的“服務(wù)調(diào)用者”應(yīng)用啟動類,所使用的注解如下:
@SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker @ServletComponentScan @EnableFeignClients
新建Feign接口,調(diào)用“服務(wù)提供者(spring-hystrix-provider)”的“/hello”服務(wù),請見代碼清單6-24。
代碼清單6-24:
codes\06\6.4\spring-hystrix-invoker\src\main\java\org\crazyit\cloud\feign\HelloClient.java
@FeignClient(name = "spring-hystrix-provider", fallback = HelloClientFallback.class) public interface HelloClient { @RequestMapping(method = RequestMethod.GET, value = "/hello") public String hello(); @Component static class HelloClientFallback implements HelloClient { public String hello() { System.out.println("hello 方法的回退"); return "error hello"; } } }
與普通的Feign客戶端無異,僅僅設(shè)置了處理回退的類,回退類實現(xiàn)了客戶端接口。為了能測試效果,修改服務(wù)器端的“/hello”服務(wù),讓其有800毫秒的延時。根據(jù)前面章節(jié)可知,默認(rèn)情況下,Hystrix的超時時間為1秒,因此,還需要修改配置超時配置。代碼清單6-25,在application.yml中修改命令配置。
代碼清單6-25:codes\06\6.4\spring-hystrix-invoker\src\main\resources\application.yml
hystrix: command: HelloClient#hello(): execution: isolation: thread: timeoutInMilliseconds: 500 circuitBreaker: requestVolumeThreshold: 3
注意,如果是針對全局配置,則使用與下面類似的配置片斷:
hystrix.command.default.circuitBreaker.requestVolumeThreshold // 默認(rèn)時間段內(nèi)發(fā)生的請求數(shù) hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds // 超時時間
如果針對某個客戶端,如使用下面的配置片斷:
hystrix.command.CommandKey.circuitBreaker.requestVolumeThreshold
Feign與Hystrix整合使用時,會自動幫我們生成CommandKey,格式為:“Feign客戶端接口名#方法名()”。例如本例中的客戶端為HelloClient,方法為hello,生成的CommandKey為“HelloClient#hello()”。而默認(rèn)情況下,生成的GroupKey為@FeignClient注解的name屬性。
以上的配置中,我們針對了hello方法,設(shè)置了超時時間為500毫秒,而“/hello”服務(wù)超時時間為800毫秒,換言之,hello方法總會超時。另外,如果請求超過3次并且失敗率超過50%,斷路器將被打開。編寫控制器,調(diào)用hello服務(wù),并查看斷路器的情況,請見代碼清單6-26。
代碼清單6-26:HelloController.java
@RestController public class HelloController { @Autowired HelloClient helloClient; @RequestMapping(value = "/feign/hello", method = RequestMethod.GET) public String feignHello() { // hello方法會超時 String helloResult = helloClient.hello(); // 獲取斷路器 HystrixCircuitBreaker breaker = HystrixCircuitBreaker.Factory .getInstance(HystrixCommandKey.Factory .asKey("HelloClient#hello()")); System.out.println("斷路器狀態(tài):" + breaker.isOpen()); return helloResult; } }
控制器的方法中,獲取了hello方法的斷路器,并輸出其狀態(tài)。接下來,編寫一個測試客戶端,多線程訪問:http://localhost:9000/feign/hello/{index},也就是控制器的feignHello方法,客戶端請見代碼清單6-27。
代碼清單6-27:
06\6.4\spring-hystrix-invoker\src\main\java\org\crazyit\cloud\feign\TestFeignClient.java
public class TestFeignClient { public static void main(String[] args) throws Exception { // 創(chuàng)建默認(rèn)的HttpClient final CloseableHttpClient httpclient = HttpClients.createDefault(); // 調(diào)用多次服務(wù)并輸出結(jié)果 for(int i = 0; i < 6; i++) { // 建立線程訪問接口 Thread t = new Thread() { public void run() { try { String url = "http://localhost:9000/feign/hello"; // 調(diào)用 GET 方法請求服務(wù) HttpGet httpget = new HttpGet(url); // 獲取響應(yīng) HttpResponse response = httpclient.execute(httpget); // 根據(jù) 響應(yīng)解析出字符串 System.out.println(EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace(); } } }; t.start(); } // 等待完成 Thread.sleep(15000); } }
完成后,依次啟動Eureka服務(wù)器、服務(wù)提供者、服務(wù)調(diào)用者,運行代碼清單6-27,可看到“服務(wù)計用者”的控制臺輸出如下:
斷路器狀態(tài):false 斷路器狀態(tài):false 斷路器狀態(tài):false 斷路器狀態(tài):false 斷路器狀態(tài):true 斷路器狀態(tài):true
根據(jù)輸出可知,斷路器已經(jīng)被打開。
感謝各位的閱讀!關(guān)于“Spring Cloud中Feign與Hystrix整合的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!