春云使用Hystrix实现断路器进行服务容错保护的方法

  

在微服务中,我们将系统拆分为很多个服务单元,各单元之间通过服务注册和订阅消费的方式进行相互依赖。但是如果有一些服务出现问题了会怎么样?
  

  

比如说有三个服务(ABC),一个调用B, B调用C,由于网络延迟或C本身代码有问题导致B迟迟得不到回应,这样B调用C的请求就会被挂起,等待。

  

在高并发的访问的情况下,这些挂起的线程得不到释放,使后续的请求阻塞,最终导致B也挂掉了。依次类推,一个可能也会挂掉,进而使整个系统全部崩溃。

  

为了解决整个问题,春云使用Hystrix进行服务容错保护,包括断路器,线程隔离等一系列的保护功能,今天我们就来看下如何通过Hystrix实现断路器。

  

  

春云Hystrix是基于Netflix的开源框架Hystrix实现的,其目的是为了通过控制那些访问远程系统,服务和第三方的节点,从而对延迟和故障提供强大的容错能力。

  

断路器类似于我们家里面强电箱里面用到的漏电断路保护器,当服务单元出现故障(类似于电器发生短路),通过断路器的故障监控功能(类似于保险丝),向调用方返回一个错误响应,避免长时间等待,从而避免故障蔓延到整个系统。

  

  

还记得我们前面写春天的云入门系列二:使用尤里卡进行服务治理里面的三个服务(尤里卡/hello-service/hello-consumer)吗?我们基于这个进行实验。
  

  

1。启动尤里卡服务注册中心,端口1111号
  

  

2。启动hello-service服务提供者,这里我们启动两个服务,端口号分别为9090,9091年
  

  

3。启动hello-consumer服务消费者,端口号为9999;这个时候我们多次访问http://localhost: 9999/hello-consumer是没有问题的
  

  

4。将hello-service端口号为9091的服务关掉,再去多次访问http://localhost: 9999/hello-consumer报错了
  

  

按涸剖褂肏ystrix实现断路器进行服务容错保护的方法"

  

PS:这里说明下,为什么要多次访问,是因为我们通过带实现了负载均衡,访问http://localhost: 9999/hello-consumer的时候,会轮询访问hello-service的两个服务,当访问到端口号是9091的服务时才报的错,访问9090的服务就不会有问题。

  

  

接下来我们看下如何进行代码实现,我们不去修改服务注册中心和服务提供者,只需要修改服务消费者hello-consumer。
  

  

1。修改POM文件,引入Hystrix依赖

        & lt;项目xmlns=" http://maven.apache.org/POM/4.0.0 "   xmlns: xsi=" http://www.w3.org/2001/XMLSchema-instance "   xsi: schemaLocation=" http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”比;   & lt; modelVersion> 4.0.0   & lt; groupId> com.sam   & lt; artifactId> hello-consumer   & lt; version> 0.0.1-SNAPSHOT   & lt; parent>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-parent   & lt; version> 1.5.1.RELEASE   & lt;/parent>      & lt; properties>   & lt; javaVersion> 1.8 & lt;/javaVersion>   & lt;/properties>      & lt; dependencyManagement>   & lt; dependencies>   & lt; dependency>   & lt; groupId> org.springframework.cloud   & lt; artifactId> spring-cloud-dependencies   & lt; version> Camden.SR6   & lt; type> pom   & lt; scope> import   & lt;/dependency>   & lt;/dependencies>      & lt;/dependencyManagement>      & lt; dependencies>   & lt; !——引入尤里卡客户端依赖——比;   & lt; dependency>   & lt; groupId> org.springframework.cloud   & lt; artifactId> spring-cloud-starter-eureka   & lt;/dependency>   & lt; !——引入带依赖,用来实现负载均衡,我们这里只是使用先不作其他介绍——比;   & lt; dependency>   & lt; groupId> org.springframework.cloud   & lt; artifactId> spring-cloud-starter-ribbon   & lt;/dependency>   & lt; !——引入hystrix依赖,用来实现服务容错保护——比;   & lt; dependency>   & lt; groupId> org.springframework.cloud   & lt; artifactId> spring-cloud-starter-hystrix   & lt;/dependency>      & lt;/dependencies>   & lt;/project>      之前      

2。修改启动类,追加注解@EnableCircuitBreaker,开启断路器

春云使用Hystrix实现断路器进行服务容错保护的方法