您的位置:首页 > 编程语言 > Java开发

Spring Cloud Hystrix--熔断器

2016-12-13 16:39 555 查看
一、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。并近实时监控服务当前情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: