Spring Cloud Hystrix--熔斷器
阿新 • • 發佈:2018-12-24
一、Hystrix 熔斷器
1、引入pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<!--熔斷器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、編寫業務類
service
@Service
public class ComputeService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "addServiceFallback")
public String addService() {
return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();
}
public String addServiceFallback() {
return "error";
}
}
controller
@RestController
public class ConsumerController {
@Autowired
private ComputeService computeService;
@RequestMapping(value = "/add", method = RequestMethod.GET)
public String add() {
return computeService.addService();
}
}
啟動類
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class RibbonHystrixApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonHystrixApplication.class, args);
}
}
3、新增配置
spring.application.name=ribbon-Hystrix
server.port=3333
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
重新整理http://localhost:1111/ 可見啟動了兩個service服務,當未加hystrix斷路器前,關閉compute-service服務,訪問http://localhost:3333/add,頁面直接error page,當如上,加上hystrix斷路器後,雖然compute-service服務仍處於關閉狀態,呼叫時直接返回程式指定的error資訊。
二、Hystrix流程分析
1、在啟動類上新增@EnableCircuitBreaker 註解,表示本類開啟熔斷器功能。
2、在原來controller的基礎上,新增一層ComputeService類,在服務呼叫方法上,新增@HystrixCommand(fallbackMethod = "addServiceFallback")並指定回撥方法addServiceFallback。
三、How does Hystrix work?
服務均可用下,使用者請求狀態 某個服務延遲或不可用時使用者請求狀態 服務延遲且多使用者同時訪問
所以當某個服務不可用時,所有使用者請求均block阻塞到當前一個service處。後果可想
Hystrix的出現如同保險絲一樣,在危機時刻及時解決阻塞-且不停傳送服務訪問請求問題。
1、Hystrix可配置依賴呼叫超時時間,當呼叫超時時,直接返回或執行fallbackMethod邏輯
2、為每一個依賴提供一個執行緒池,呼叫次數大於執行緒數量時,立即拒絕連線。
3、提供近實時依賴呼叫情況統計和監控。
所以如圖每個服務都已thread pool形式給出,分發到某單個thread例項,當某個服務(thread)不可用時,立即fail fast、fail silent、fallback。並近實時監控服務當前情況。