摘自官网http://springcloud.cc的定义:“熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。”
在微服务框架内一个接口可能就是一个微服务, 各个服务之间相互依赖, 假设某个微服务运行缓慢甚至宕掉了, 会阻塞调用者线程,出现类似Android里常见的ANR错误; 即调用者进程无法释放资源,导致进程占用内存越来越大直到调用者进程挂掉。
熔断器的作用就是即时发现运行异常的服务, 告知调用者不再调用该服务接口, 从而避免调用者服务资源消耗殆尽。 原理如官网插图:
被调用者服务运行异常时, 调用者服务会执行回调函数。
SpringCloud框架内微服务间交互使用Rest或Feign, 下面分别介绍集成方法。
1、 RestTemplate + Hystrix:
在工程pom.xml文件里添加spring-cloud-starter-hytrix依赖。
org.springframework.cloud
spring-cloud-starter-hystrix
@EnableEurekaClient
@SpringBootApplication
@EnableHystrix
public class SpringCloudConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumerApplication.class, args);
}
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
改造接口服务类
运行当前工程, 并在浏览器内输入http://localhost:11000/consumer?param="hytrix" , 浏览器显示:
你调用了hello-service1的API,结果是sorry,"hytrix",service-hello1 not responde
因为没启动呢service-hello1服务, 所以执行了回调函数, 从而避免阻塞调用者线程。
2、Feign + Hystrix
OpenFeign是自带断路器的, 不用在pom.xml和入口类添加新增引用, 但hytrix默认是关闭的, 需要设置feign.hystrix.enabled=true。打开SrpingCloudFeignDemo工程, 修改application.yml。
eureka:
client:
serviceUrl:
defaultZone: http://localhost:10001/eureka/
server:
port: 12000
spring:
application:
name: service-feign-consumer
feign:
hystrix:
enabled: true
实现接口类ServiceHello1, 注意ServiceHello1Impl函数参数跟接口类的区别!!!
启动当前工程, 这是还没运行service-hello1服务。
在浏览器输入http://localhost:12000/hello?param="this is feigndemo“后, 浏览器显示:
sorry, "this is feigndemo" service-hello1 not responde
参考代码: http://download.csdn.net/download/brycegao321/10138936