1. 程式人生 > >Spring Cloud Hystrix--熔斷器

Spring Cloud Hystrix--熔斷器

一、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。並近實時監控服務當前情況。