大概解释下什么是spring cloud的熔错(自我保护机制),如果我们的项目有许多个微服务集群组成的话,那么久少不了服务之间的相互调用,但是如果一个服务(称为B)挂了的话,那么调用他的那个服务(称为A)便没法正常访问B,那么当访问量非常大的时候,所有的请求都会阻塞在服务A,服务A不断的去尝试连接B,那么此时就很有可能导致服务A也宕机,既而产生连锁反应使整个集群挂掉,所以为了防止这种情况的产生,那么我们需要集成spring cloud的熔错框架hystrix,这个框架会在你服务A调用服务B时,如果在一定时间内失败率达到一定阈值,那么他就会打开断路器,执行其他操作,并且后续的请求在判断得知断路器被打开的情况下也会直接执行其他操作,不会再去访问服务B,直到断路器被关闭,既而达到了保护服务A的作用。了解了应用场景后那么我们就直接上代码。
以上一篇所讲的服务调用者为基础(不知道的朋友可以翻看前一篇服务提供者与调用者的搭建,https://blog.youkuaiyun.com/wy_1994007/article/details/88759862)在其上面集成hystrix
首先先加入以下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.3.RELEASE</version>
</dependency>
<!-- 熔断依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
在启动类上新增注解@EnableCircuitBreaker
在服务调用者的TestService类中添加如下代码:在方法上添加注解@HystrixCommand(fallbackMethod="getPersonFallback")
fallbackMethod值为调用失败后执行的方法名,即为下面所添加的回退方法
package org.server.invoker.service;
import org.server.invoker.service.feginService.TestFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
@Component
public class TestService {
@Autowired
private TestFeignService feignService;
@HystrixCommand(fallbackMethod="getPersonFallback")
public String getPersion(Integer id){
return feignService.getPersion(id);
}
/**
* 回退方法,返回一个默认的
*/
public String getPersonFallback(Integer id) {
System.out.println(id);
return "-1------error";
}
}
至此熔断集成完毕,是不是超简单,接下来测试
启动注册中心。为了看到回退方法被执行的效果,我们不启动服务提供者的服务,直接启动服务调用者,然后访问localhost:9000/router
可以看到页面返回了-1--------error
可以看到控制台中打印的日志,则说明所有的请求都进了回退方法
然后在运行服务提供者的启动类,输入8081端口号
待其完全启动后再次访问localhost:9000/router
可以看到浏览器返回了1------success
再去看服务提供者的控制台输出,可以看到已经正常被访问了
再查看服务调用者的控制台已经看不到相关输出,至此说明我们的熔断机制已经起了作用
当然断路器的用法不局限于此,他还可配置熔错率,隔离机制,命令,合并请求,缓存等等功能,这里就不做具体说明了,有兴趣的朋友可以查看官方文档。
下一篇将介绍网关zuul的集成,敬请期待。。。。。。