简介
接上一篇Spring Cloud 学习笔记04----服务消费者(RestTemplate+Ribbon(客户端负载均衡)),接下来我们来学习另外一个组件 断路器(Hystrix)。
在微服务架构中,我们将系统拆分成很多个独立服务单元,服务与服务之间通过RPC的方式调用,在Spring Cloud 中可以通过RestTemplate+Ribbon 或者Feign 的方式调用。为了保证高可用性,单个服务通常会集群部署。这样就有可能因为网络原因或者是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后等待出现故障的依赖方响应形成任务积压,最终导致自身服务的瘫痪。
断路器(Hystrix)简介
Netflix的创造了一个调用的库Hystrix实现了断路器图案。在微服务架构中,通常有多层服务调用。
如图所示,微服务图
较低级别的服务中的服务故障可能导致用户级联故障。当对特定服务的调用的不可用达到一个阀值时(Hystrix中的默认值为5秒内的20次故障),断路器打开,向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
如下图. Hystrix回退防止级联故障
快速入门
在使用Spring Cloud Hystrix 实现断路器之前。首先,我们先构建一个服务调用关系。
我们以上一篇的项目为基础,首先启动如下项目:
eureka-server 工程:服务注册中心,端口1111
order-provider 工程: order-service的服务,两个实例启动端口分别是8081 和8082
service-ribbon 工程:使用Ribbon实现的服务消费者,端口为8764。
在未加入断路器之前,关闭8081的实例,发送GET请求到http://localhost:8764/getOrderService,可以看到如下输出
引入Hystrix。
- 在service-ribbon 工程的pom.xml 引入 spring-cloud-starter-hystrix 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 在service-ribbon 工程的主类ServiceRibbonApplication中使用
@EnableCircuitBreaker
注解开启断路器功能:
@SpringBootApplication
@EnableEurekaClient //ribbon
@EnableCircuitBreaker //断路器
@SpringCloudApplication
public class ServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRibbonApplication.class, args);
}
@Bean
@LoadBalanced //开启负载均衡
RestTemplate restTemplate() {
return new RestTemplate();
}
}
PS: 这里可以使用Spring Cloud应用中的@SpringCloudApplication注解来修饰应用主类,该注解的具体定义如下所示。可以看到,该注解中包含了上述我们所引用的三个注解, 这也意味着一个Spring Cloud 标准应用包含服务发现以及断路器。
。。。。。。。。。。。。。。。。。
版权原因,完整文章,请参考如下:Spring Cloud 学习笔记06----断路器(Hystrix)(Finchley版本)