1、概念
熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。除了熔断的功能还有服务降级、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。
2、集成
a、工程的 pom.xml 的 dependency 节点中引入 spring-cloud-starter-hystrix 依赖:
b、在启动类中通过注解@EnableCircuitBreaker ,启动熔断器
/**
* 使用@EnableCircuitBreaker注解开启断路器功能
* @author eacdy
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class HystrixApplication {
/**
* 实例化RestTemplate,通过@LoadBalanced注解开启均衡负载能力.
* @return restTemplate
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}
c、编写服务类,写个回退方法,通过命令模式,指定发生异常需要回退的方法
@Service
public class HystrixService {
@Autowired
private RestTemplate restTemplate;
private static final Logger LOGGER = LoggerFactory.getLogger(RibbonHystrixService.class);
@HystrixCommand(fallbackMethod = "fallback")
public User findById(Long id) {
return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class);
}
public User fallback(Long id) {
User user = new User();
user.setId(-1L);
user.setUsername("default username");
user.setAge(0);
return user;
}
}
d、编写控制器类,调用服务类
@RestController
public class HystrixController {
@Autowired
private HystrixService hystrixService;
@GetMapping("/ribbon/{id}")
public User findById(@PathVariable Long id){
return this.hystrixService.findById(id);
}
}
e、编写application.yml
server:
port: 9413
spring:
application:
name: microservice-hystrix
eureka:
client:
serviceUrl:
defaultZone: http://discovery:8761/eureka/
instance:
hostname: hystrix
3、启动应用,同时启动两个相同的应用,只是端口不同,访问http://hystrix:9413/hystrix/1,则正常显示内容,当把服务设置超时,则会调用回退方法。
4、总结
熔断器有效的解决了因为服务故障,请求积压,导致服务崩溃,同时提高了用户的体验;上面的集成是使用了熔断器的命令模式,如果项目里面用的是feign,则自带了回退机制,不过个人推荐还是用命令模式,参数设置灵活,可以设置并发数、线程执行超时时间、并发执行最大线程数、线程存活时间、线程执行超时是否中断,api更强大。