第08課:服務異常處理

上一篇,咱們講了服務之間的相互通訊,利用 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,能夠看到以下畫面:

enter image description here

按照上圖箭頭所示,輸入相關信息後,點擊 Monitor Stream 按鈕進入下一界面,打開新窗口訪問:http://localhost:8081/index,在 Dashboard 界面便可看到 Hystrix 監控界面:

enter image description here

Hystrix 熔斷器的基本用法就介紹到這裏。前面咱們建立了註冊中心、服務提供者、服務消費者、服務網關和熔斷器,每一個工程都有配置文件,並且有些配置是想通的,按照這個方式進行應用程序的配置,維護性較差,擴展性也較差,好比不少個服務都會配置數據源,而數據源只有一個,那麼若是咱們的數據源地址發生變化,全部地方都須要改,如何改進這個問題呢?下一篇所講解的配置中心就是爲解決這個問題而生的,敬請期待。

相關文章
相關標籤/搜索