微服务-5 服务节点熔断器Hystrix
微服务架构之节点熔断器Hystrix
为什么需要熔断器?
问题是这样得,如果我们在微服务架构中,服务与服务之间得相互调用,突然某个服务出现故障,或者说是因为某种原因导致服务内部执行缓慢,单个线程阻塞随后又有大量得请求来访问,最终可能导致整个服务资源被耗尽,无法对外提供服务,并且这种不可用可能沿着请求链向上传递,这种现象被成为服务雪崩现象,为了解决这种问题得出现我们引入熔断器 Hystrix
hystrix能做什么?
hystrix可以帮助我们来管理每个服务得请求,并且监控请求,如果当前服务已经有大量得资源被占用,就会采用拒绝外部请求得策略自我修复,而不是导致整个项目得灾难到来,自身一但修复资源被释放出来就会恢复重新 接收用户请求
hystrix设计目标:
阻止故障得连锁反应
快速失败并迅速恢复
回退并优雅降级
提供近实时得监控与告警
hystrix的角色
(1)接口化请求调用当调用被@FeignClient注解修饰的接口时,在框架内部,将请求转换成Feign的请求实例feign.Request,交由Feign框架处理(在消费者指定调用的生产者的服务名称和接口地址,即在edu指定要调用的vod的服务名称和接口地址)。
(2)Feign :转化请求Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,封装了Http调用流程(Feign找到调用的服务名称,根据服务名称找到接口地址)。
(3)Hystrix:熔断处理机制 Feign的调用关系,会被Hystrix代理拦截,对每一个Feign调用请求,Hystrix都会将其包装成HystrixCommand,参与Hystrix的流控和熔断规则。如果请求判断需要熔断,则Hystrix直接熔断,抛出异常或者使用FallbackFactory返回熔断Fallback结果;如果通过,则将调用请求传递给Ribbon组件(edu服务调用vod服务,假如vod服务突然不好用了,Hystrix就不让他继续调用,断开调用的连接)。
(4)Ribbon:服务地址选择 当请求传递到Ribbon之后,Ribbon会根据自身维护的服务列表,根据服务的服务质量,如平均响应时间,Load等,结合特定的规则,从列表中挑选合适的服务实例,选择好机器之后,然后将机器实例的信息请求传递给Http Client客户端,HttpClient客户端来执行真正的Http接口调用;
(5)HttpClient :Http客户端,真正执行Http调用根据上层Ribbon传递过来的请求,已经指定了服务地址,则HttpClient开始执行真正的Http请求
hystrix如何做得 服务隔离 , 降级, 熔断:
内部采用线程池隔离,和信号量来隔离,默认使用线程池
话不多数直接开始操作,这里我们用得项目是在上一节基础之上的项目 注册中心 与配置中心用的是nacos,服为之间得调用是使用得feign,服务得负载是ribbon 本次集成得是熔断器Hystrix,
因为Feign里面默认就已经集成了 Ribbon和Hystrix熔断器默认是关闭状态 所以我们不需要配置maven 只需要打开配置即可
第一步 在上一节项目得基础上修改,父级pom

子项目的pom都一样 nacos-xxxx-1.2 ,nacos-yyyy-1.2, nacos-yyyy-1.3 的pom

我们测试 在nacos-xxxx1.2项目中使用Feign调用 nacos-yyyy1.2 项目 并且在nacos-xxxx1.2项目中开启Hystrix熔断器,打开Hystrix很简单做一下配置就好:

第二步 我们附上服务提供者的代码

第三步 然后我们在Feign调用类上指定熔断之后回滚的回滚类

第四步 编写熔断回滚类,需要实现Feign掉用服务的接口 并且该类交给Spring来管理

第五步我们来测试一下
我们打开hystrix熔断器 修改nacos-xxxx1.2项目配置文件
#打开Hystrix熔断器
feign.hystrix.enabled=true
#超时时间默认1000ms
分别启动 nacos-xxxx1.2 和nacos-yyyy1.2项目 然后在nacos-xxxx1.2项目中编写Controller来调用 如下:

第六步 测试看结果:
启动成功后两个项目都注册到nacos里面了

开始测试
nacos-xxxx1.2 的 controller 地址是 http://127.0.0.1:8080/feignTest/show

我们停掉nacos-yyyy1.2项目 在访问 结果熔断器已经开启 http://127.0.0.1:8080/feignTest/show


浙公网安备 33010602011771号