原理
在微服务架构中,不同的业务被划分成不同的 微服务,这些微服务通过相互调用进行通信,每个微服务运行在不同的进程中,这样就可能出现一种情况,消费者调用提供者,提供者服务出现网络延迟或者错误,消费者服务也会因提供服务无法相应出现延迟;当消费服务被更多的被调用,而服务消费者因为延迟的问题,tomcat中占用的线程资源不会释放,这样会导致更多的线程被消耗,直至tomcat资源耗尽,这会导致严重的问题——其他的服务不能正常提供服务(雪崩效应)
为了解决这类问题,Hystrix横空出世,他封装了每个依赖,使依赖相互隔离,当延迟情况发生时,他便会被限制在资源中,并包含回退逻辑,该逻辑决定在依赖发生任何类型故障时做出相应响应。
简单实践
拓扑图:
实验目的:当服务提供者不可用时,配置了Hystrix的客户端将会进行熔断保护,回调失败处理类
步骤:
前提:有fegin实现restful的声明式服务调用的项目基础
可参考:声明式服务调用客户端fegin_杜小白也想的美的博客-CSDN博客
以下都是对服务消费者的配置
1、在服务消费者中添加hystrix-client依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
2、将服务消费者中yml文件添加熔断配置——开启熔断配置
server:
port: 8764 #配置端口号
spring:
application:
name: hystrix-client #指定用户名
feign: #开启熔断配置
circuitbreaker:
enabled: true
eureka:
client:
service-url:
defaultZone: http://localhost:7000/eureka
3、在启动类中中添加@EnableHystrix
4、在service包中新建失败处理逻辑类TestSerivceImpl,并实现@FeginClient注解接口
@Component
public class TestServiceImpl implements TestService{
@Override
@RequestMapping("/hi")
public String hi() {
return "bad request";
}
@Override
public String hi(String id) {
return String.format("bad request is :%s",id);
}
}
5、将service包的TestService类中@FeginClient注解中增加fallback属性配置
参数说明:
value:调用的微服务名称——与此微服务中的spring-application-name一致
fallback:失败处理类
@Service
@FeignClient(value = "hystrix-provider",fallback = TestServiceImpl.class)
public interface TestService {
@RequestMapping("/hi")
public String hi();
@RequestMapping(value = "/hiTest",method = RequestMethod.GET)
public String hi(@RequestParam(value = "id" ,required = false) String id);
}
实验效果:
关闭服务提供者如下,熔断保护启动成功
注意事项:
配置熔断保护时,注意hystrix依赖的版本,低版本可能出现fallback调用不成功,将hystrix换成更高的版本即可。