目录
?什么是hystrix?
在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。
?hystrix可以干什么?
- 对通过第三方客户端库访问的依赖项(通常是通过网络)的延迟和故障进行保护和控制。
- 在复杂的分布式系统中阻止级联故障。
- 快速失败,快速恢复。
- 回退,尽可能优雅地降级。
- 启用近实时监控、警报和操作控制。
?hystrix解决了什么问题?
在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
hystrix作为一个熔断中间件,可以在灾难发生之初就制止它,就像家里的保险丝,发现电路过载就会自动断掉,阻止灾难发生。
就是安全保护服务高可用稳定运行。
分布式系统雪崩效果图:
?hystrix如何实现对系统延迟和故障保护和控制的?
?Hystrix特性
1.断路器机制
断路器很好理解, 当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open,也就是断路器启用了)。
这时所有请求会直接失败而不会发送到后端服务,避免继续发送大量无效请求影响系统吞吐量。断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN,就是保持观望状态,看看下次请求会不会成功).。
这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED,就是关闭断路器,请求正常进行), 否则重新切换到开路状态(OPEN)。
Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 并且断路器有自我检测并恢复的能力。
2.Fallback
Fallback相当于是降级操作。对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值,也不至于直接返回500啥的不人性化嘛。 fallback方法的返回值一般是设置的默认值或者来自缓存。
3.资源隔离
在Hystrix中, 主要通过线程池来实现资源隔离。通常在使用的时候我们会根据调用的远程服务划分出多个线程池。例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池。这样做的主要优点是运行环境被隔离开了。这样就算调用服务的代码存在bug或者由于其他原因导致自己所在线程池被耗尽时, 不会对系统的其他服务造成影响。但是带来的代价就是维护多个线程池会对系统带来额外的性能开销。 如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源。
?服务之间调用熔断 feign hystrix
Feign中已经依赖了Hystrix,pom不用做啥改变,配置里启动即可。
?示例:
1.创建一个springboot项目:(和上文服务调用spring-cloud-consumer项目类似)
使用官方快速创建➡:https://start.spring.io/
取名:spring-cloud-consumer-hystrix
2.配置文件:
spring.application.name=spring-cloud-producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
#启用hystrix
feign.hystrix.enabled=true
3.创建熔断回调类
创建HelloRemoteHystrix类继承与HelloRemote实现回调的方法
HelloRemoteHystrix具体内容:
//继承远程调用接口
@Component
public class HelloRemoteHystrix implements HelloRemote{
@Override
public String hello(@RequestParam(value = "name") String name) {
return "hello" +name+", this messge send failed ";
}
}
4.改动远程调用接口HelloRemote
在@FeignClient注解里添加fallback属性:
@FeignClient(name= "spring-cloud-producer",fallback = HelloRemoteHystrix.class)
public interface HelloRemote {
@RequestMapping(value = "/hello")
public String hello(@RequestParam(value = "name") String name);
}
服务熔断的时候返回fallback类的内容。
?测试熔断
➡依次启动eureka,spring-cloud-producer,spring-cloud-consumer-hystrix项目。
➡查看eureka,可以看到注册正常:
➡测试服务提供者
浏览器输入:http://localhost:9000/hello?name=hahaha
可以看到正常提供服务。
➡测试服务调用者
浏览器输入:http://localhost:9001/hello/hahaha
可以看到服务正常调用。
➡测试触发熔断
手动停止spring-cloud-producer,模拟停止提供服务
再次浏览器输入:http://localhost:9001/hello/hahaha
可以看到触发了熔断机制,返回的是fallback属性的熔断类里的内容:
以上就是hystrix的介绍以及最简单的熔断demo辽~