個人博客:蘭陵笑笑生,歡迎瀏覽博客!java
上一章 SpringCloud基礎教程(七)-聲明式服務調用Fegign當中,咱們介紹了使用Fegin更加簡化的實現服務間的調用.本章節我將繼續探索Hystrix組件的使用。git
在分佈式的環境中,服務之間得依賴不可避免的會失敗,Hystrix是Netfilx的庫,主要是經過添加延遲和容錯的邏輯幫助控制分佈式服務之間的交互,Hystrix經過隔離服務之間的訪問點,中止他們之間的級聯故障以及提供備選的選項來實現這一點。程序員
假設在分佈式的環境中,全部的一切都正常,請求流以下圖所示:github
當許多後端服務變的一個故障時,會致使某一個、多個調用不可用,而且佔用系統的線程,I/O等資源:spring
隨着請求數的變大,就能致使全部服務器上的資源幾秒鐘內飽和,又稱爲雪崩狀態:後端
經過客戶端執行網絡訪問時,這些問題會更加的嚴重,第三方依賴就至關於一個"黑夾子",封裝操做的細節,並且還能夠隨時的修改,每一個客戶端的網絡和資源配置都不一樣,一般也難以監控可修改。全部的問題都表明了須要對故障和延遲作隔離,單個依賴的故障不能關閉整個系統:瀏覽器
在以前的章節當中,咱們都搭建瞭如下的模塊:服務器
咱們在服務調用者server-consumer引入hystrix依賴,而且改造原來的服務調用接口:網絡
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
Fegin的調用接口HelloApiapp
@FeignClient(name = "server-provider",configuration = MyFeignConfig.class) public interface HelloApi { @RequestMapping("/sayHello") public String sayHello(@RequestParam("name") String name); }
新建控制器HystrixController,注入Feign接口,調用服務提供者,添加 @HystrixCommand註解,當服務調用失敗時,咱們經過fallbackMethod指定失敗後調用的本地的方法名稱,注意參數必須帶上:
@RestController @RequestMapping("/hystrix") public class HystrixController { @Autowired HelloApi helloApi; @RequestMapping("/sayHello") @HystrixCommand(fallbackMethod = "sayError") public String sayHello(String name) { return helloApi.sayHello(name); } public String sayError(String name){ return "sayError!"; }
服務提供端server-provider改造,讓接口有通常的概率調用失敗:
@RestController public class RibbonController { @Value("${server.port}") private String port; @RequestMapping("/sayHello") public String sayHello(String name) { Random random = new Random(); if (random.nextInt(10) < 5) { throw new RuntimeException("erroe"); } return "from:" + port + ",hello!," + name; }
接下來咱們啓動Eureka註冊中心,兩個服務提供者,一個服務調用者:
使用瀏覽器調用接口:http://localhost:5168/hystrix/sayHello?name=name,有一半 概率是 返回"sayError!".
這樣就簡單的實現了熔斷、降級的功能。
注意:上一章咱們整合了Feign和Hystrix,Feign在配置的時候咱們能夠指定@FeignClient註解中的fallback,從這裏咱們能夠看出來,Feign默認是集成了Hystrix的。若是咱們同時配置了Feign的fallback,同時也配置了 @HystrixCommand(fallbackMethod = "sayError"),那麼Feign的配置優先。
咱們能夠在@HystrixCommand註解中添加屬性,自定義配置,經過查看@HystrixCommand註解的源代碼,
咱們能夠配置
等等,例如:
@RestController @RequestMapping("/hystrix") public class HystrixController { @Autowired HelloApi helloApi; @RequestMapping("/sayHello") @HystrixCommand( commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "500"), @HystrixProperty(name = "execution.timeout.enabled", value = "false") }, threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "30"), @HystrixProperty(name = "maxQueueSize", value = "101"), @HystrixProperty(name = "keepAliveTimeMinutes", value = "2"), @HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"), @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "1440") }, fallbackMethod = "sayError") public String sayHello(String name) { return helloApi.sayHello(name); } public String sayError(String name) { return "sayError!"; } }
execution.isolation.thread.timeoutInMilliseconds :設置thread和semaphore兩種策略的超時時間,默認是1000毫秒,這也是咱們寫程序常常忽略的一點,命名接口沒錯,可是調用就是失敗,這裏咱們能夠設置超時時長。
execution.timeout.enabled:是否開啓超時,默認是true
execution.isolation.thread.interruptOnTimeout:發生超時時,是否中斷線程,默認true
circuitBreaker.sleepWindowInMilliseconds:熔斷後多久開始嘗試恢復
circuitBreaker.errorThresholdPercentage:出錯百分比閾值,默認是50%
固然咱們也能夠配置在yml配置文件中:經過hystrix.command.[commandKey],commandKey默認是default,對於Zull而言就是 service ID:
hystrix: command: default: execution: timeout: enabled : false
關於更多的配置能夠參考:https://github.com/Netflix/Hystrix/wiki/Configuration
咱們瞭解了Hystrix利用線程池實現了對服務的隔離,熔斷器是位於線程池以前的組件,Hystrix的功能對於微服務是一個不可缺乏的組件,同時提供了二次的開發能力,下一章咱們將繼續瞭解如何使用Hystrix實現監控功能。
以就是本期的分享,你還能夠關注公衆號:** 程序員笑笑生**,關注更多精彩內容!
SpringCloud基礎教程(一)-微服務與SpringCloud
SpringCloud基礎教程(二)-服務發現 Eureka
SpringCloud基礎教程(五)-配置中心熱生效和高可用
SpringCloud 基礎教程(六)-負載均衡Ribbon
SpringCloud 基礎教程(七)-Feign聲明式服務調用
更多精彩內容,請期待...
本文由博客一文多發平臺 OpenWrite 發佈!
個人博客地址蘭陵笑笑生,歡迎瀏覽!