由于网络问题或者依赖服务自身的问题出现的调用故障或者延迟,如果此时调用方请求不断增加,就会形成任务积压,最终导致自身服务的瘫痪。
比如在一个电商网站中,可能会讲系统拆分成为用户、订单、库存、积分、评论等一系列服务单元,如果其中一个单元出现故障,就很容易发生故障的蔓延,导致整个系统瘫痪。
为了解决这个问题,产生了断路器模式。
Hystrix实现了断路器、线程隔离等一系列服务保护功能。具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并、服务监控的强大功能。
引入Hystrix
根据之前的内容,我们启动如下的工程:
- eureka-server:服务注册中心,端口为1111。
- hello-service工程:启动两个实例,端口分别为8081和8082。
- ribbon-consume工程:使用Ribbon实现的服务消费者,端口为9000。
在未实现断路器之前,关闭8081实例,发送GET请求到http://localhost:9000/ribbon-consumer(即调用eureka-provider的服务),会出现error。
我们发现,仅仅关闭了一个服务,就导致服务不可用,这显然是无法容忍的。所以,引入Hystrix。
在eureka-client工程中,引入hystrix依赖:
<!--hystrix依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
在Application应用主类中使用注解@EnableCircuitBreaker
开启断路器功能。
@EnableCircuitBreaker
@SpringBootApplication
public class Demo2Application {
public static void main(String[] args) {
SpringApplication.run(Demo2Application.class, args);
}
}
注意:这里可以直接用@SpringCloudApplication
来注解应用主类。
该注解的具体定义如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
Hystrix暂时先介绍到这里,以后再做补充。