上一篇,咱們講了服務之間的相互通訊,利用 Feign 的聲明式 HTTP 客戶端,經過註解的形式很容易作到不一樣服務之間的相互調用。前端
咱們的服務最終是部署在服務器上,由於各類緣由,服務不免會發生故障,那麼其餘服務去調用這個服務就會調不到,甚至會一直卡在那裏,致使用戶體驗很差。針對這個問題,咱們就須要對服務接口作錯誤處理,一旦發現沒法訪問服務,則當即返回並報錯,咱們捕捉到這個異常就能夠以可讀化的字符串返回到前端。java
爲了解決這個問題,業界提出了熔斷器模型。spring
Hystrix 組件api
SpringCloud 集成了 Netflix 開源的 Hystrix 組件,該組件實現了熔斷器模型,它使得咱們很方便地實現熔斷器。服務器
在實際項目中,一個請求調用多個服務是比較常見的,若是較底層的服務發生故障將會發生連鎖反應。這對於一個大型項目是災難性的。所以,咱們須要利用 Hystrix 組件,當特定的服務不可用達到一個閾值(Hystrix 默認5秒20次),將打開熔斷器,便可避免發生連鎖反應。app
代碼實現ide
緊接上一篇的代碼,Feign 是默認自帶熔斷器的,在 D 版本 SpringCloud 中是默認關閉的,咱們能夠在 application.yml 中開啓它:spring-boot
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8081 spring: application: name: feign #開啓熔斷器 feign: hystrix: enabled: true
新建一個類 ApiServiceError.java 並實現 ApiService:測試
@Component public class ApiServiceError implements ApiService { @Override public String index() { return "服務發生故障!"; } }
而後在 ApiService 的註解中指定 fallback:ui
@FeignClient(value = "eurekaclient",fallback = ApiServiceError.class) public interface ApiService { @RequestMapping(value = "/index",method = RequestMethod.GET) String index(); }
再建立 Controller 類:ApiController,加入以下代碼:
@RestController public class ApiController { @Autowired private ApiService apiService; @RequestMapping("index") public String index(){ return apiService.index(); } }
測試熔斷器
分別啓動註冊中心 EurekaServer、服務提供者 EurekaClient 和服務消費者 Feign,而後訪問:http://localhost:8081/index,能夠看到順利請求到接口:
而後中止 EurekaClient,再次請求,能夠看到熔斷器生效了:
熔斷器監控
Hystrix 給咱們提供了一個強大的功能,那就是 Dashboard。Dashboard 是一個 Web 界面,它可讓咱們監控 Hystrix Command 的響應時間、請求成功率等數據。
下面咱們開始改造 Feign 工程,在 Feign 工程的 pom.xml 下加入依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
這三個依賴缺一不可,不然會有意想不到的事情發生。
而後在啓動類 Application.java 中加入 @EnableHystrixDashboard、@EnableCircuitBreaker 註解:
@SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableHystrixDashboard @EnableCircuitBreaker public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
而後分別啓動 EurekaServer、EurekaClient 和 Feign 並訪問:http://localhost:8081/hystrix,能夠看到以下畫面:
按照上圖箭頭所示,輸入相關信息後,點擊 Monitor Stream 按鈕進入下一界面,打開新窗口訪問:http://localhost:8081/index,在 Dashboard 界面便可看到 Hystrix 監控界面:
Hystrix 熔斷器的基本用法就介紹到這裏。前面咱們建立了註冊中心、服務提供者、服務消費者、服務網關和熔斷器,每一個工程都有配置文件,並且有些配置是想通的,按照這個方式進行應用程序的配置,維護性較差,擴展性也較差,好比不少個服務都會配置數據源,而數據源只有一個,那麼若是咱們的數據源地址發生變化,全部地方都須要改,如何改進這個問題呢?下一篇所講解的配置中心就是爲解決這個問題而生的,敬請期待。