相關
相關
前言
在微服務框架 Spring Cloud
中,可以用 RestTemplate
配合 Ribbon
或 Feign
實現 服務與服務 之間的 相互呼叫。
為了保證服務的 高可用,單個服務 通常會採用 叢集部署。由於 網路原因,服務並不能保證 100%
的 可用性,如果 單個服務 出現問題,呼叫這個服務就會出現 執行緒阻塞,此時若有 大量的請求 湧入,Servlet
容器的 執行緒資源 會被耗盡,導致 服務癱瘓。
服務與服務之間具有 依賴性,故障會傳播,導致整個微服務系統發生 雪崩。
正文
Netflix
開源了 Hystrix
元件,實現了 熔斷器模式, Spring Cloud
對這個元件進行了整合。在微服務架構中,一個請求需要呼叫 多個服務 是非常常見的,如下圖所示:
下層 的服務如果出現故障,會導致 故障級聯效應。當對特定的服務的呼叫的 失敗次數 達到一個 閥值(Hystrix
是 5
秒 20
次),斷路器 將會被開啟。
斷路器 開啟後 底層服務 將會隔斷,可用避免 故障級聯 問題,上層服務 呼叫 fallback
方法直接返回一個 固定值。
1. 在Ribbon上使用熔斷器
在 pom.xml
檔案中引入 hystrix
的 起步依賴 spring-cloud-starter-hystrix
:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
複製程式碼
在應用的啟動類上使用 @EnableHystrix
開啟 hystrix
的功能。
@EnableHystrix
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRibbonApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
複製程式碼
使用註解 @HystrixCommand
標記呼叫失敗時需要熔斷的方法,fallbackMethod
屬性指定 降級方法 的 方法名 為 fallback
。
@Service
public class HelloService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback")
public String requestForHiService(String name){
return restTemplate.getForObject("http://SERVICE-HI/hi?name=" + name, String.class);
}
public String fallback(String name){
return "Fallback method invoked, name is " + name;
}
}
複製程式碼
2. 在Feign上使用熔斷器
Feign
是自帶 斷路器 的,不過需要在 配置檔案 中開啟 hystrix
的配置。
feign:
hystrix:
enabled: true
複製程式碼
Hystrix
支援 降級回退 操作,當 發生熔斷 或 出現錯誤 時,呼叫會執行 預設程式碼路徑。
@FeignClient(value = "service-hi", fallback = HelloServiceFallback.class)
public interface HelloService {
@RequestMapping(value = "/hi", method = RequestMethod.GET)
String sayHi(@RequestParam(value = "name") String name);
}
複製程式碼
通過設定 fallback
屬性為實現 降級回退 的 類,來啟用 @FeignClient
的 失敗降級。
@Service
public class HelloServiceFallback implements HelloService {
@Override
public String sayHi(String name) {
return "Fallback method invoked, name is " + name;
}
}
複製程式碼
如果需要獲取導致 回退觸發 的原因,可以指定 @FeignClient
註解內部的 fallbackFactory
屬性,fallbackFactory
屬性和 fallback
屬性不能一起使用。
@FeignClient(value = "service-hi", fallbackFactory = HelloServiceFallbackFactory.class)
public interface HelloService {
@RequestMapping(value = "/hi",method = RequestMethod.GET)
String sayHi(@RequestParam(value = "name") String name);
}
複製程式碼
然後提供一個 FallbackFactory
的 實現類,實現類指定 泛型引數 為 HelloService
。
@Component
public class HelloServiceFallbackFactory implements FallbackFactory<HelloService> {
@Override
public HelloService create(Throwable throwable) {
return new HelloService() {
@Override
public String sayHi(String name) {
return "Fallback method invoked, name is "
+ name + ", message is " + throwable.getMessage();
}
};
}
}
複製程式碼
3. Hystrix Dashboard監控熔斷器的狀態
Hystrix Dashboard
是一個 監控熔斷器 狀況的元件,提供了 資料監控 和 圖形介面。
3.1. 在Ribbon中使用Hystrix Dashboard
在加入 spring-cloud-starter-hystrix
依賴的基礎上,加入下面的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
複製程式碼
在應用程式 啟動類 已經加上 @EnableHystrix
的基礎上,加入 @EnableHystrixDashboard
註解,程式碼如下:
@EnableHystrix
@EnableHystrixDashboard
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceRibbonApplication {
}
複製程式碼
啟動應用程式,訪問 http://localhost:8765/hystrix.stream
,可以檢視 熔斷器 的 資料指標。訪問 http://localhost:8765/hystrix
,檢視 Hystrix Dashboard
的介面。在介面上填寫 資料指標 的 URL
地址,點選 Monitor Stream
進入頁面,如圖所示:
3.2. 在Feign中使用Hystrix Dashboard
在加入 spring-cloud-starter-hystrix
依賴的基礎上,加入下面的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
複製程式碼
在啟動程式上加上 @EnableHystrixDashboard
註解 開啟 Hystrix Dashboard
,完整程式碼如下:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrixDashboard
@EnableHystrix
public class ServiceFeignApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceFeignApplication.class, args);
}
}
複製程式碼
完成上面兩步配置,即可開啟 Feign
的 Hystrix Dashboard
功能。
參考
- 方誌朋《深入理解Spring Cloud與微服務構建》
歡迎關注技術公眾號: 零壹技術棧
本帳號將持續分享後端技術乾貨,包括虛擬機器基礎,多執行緒程式設計,高效能框架,非同步、快取和訊息中介軟體,分散式和微服務,架構學習和進階等學習資料和文章。