SpringCloud Hystrix

SpringCloud Hystrix

针对之前的章节描述过服务注册、负载策略,那是否会存在一些特殊场景需要处理? 针对系统微服务高负载如何快速处理呢?

思考如下问题

  1. 如果服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直到处理处理完返回,高负载情况下会造成所有处理用户请求的线程都会被耗竭
  2. 如果服务消费者可以是其它服务的提供者,这样会造成其它服务消费者接着耗竭,造成雪崩效应

解决方案思路如下

  • 设置超时机制
  • 断路器模式

超时详细分析:
优势:如服务A调用B默认是20S超时,那我们根据场景设定一个合理值,如4S,可能尽力避免资源耗竭。
缺点:当依赖服务有大量超时,再让新的请求去访问从本质上来看没有多少意义,只会无畏消耗现有资源,我们应该使用断路器避免浪费资源

断路器模式
优势:可以实现快速失败,如果它在一段时间内侦测到错误(如:超时),就会强迫其以后的多个调用快速失败,不再请求所依赖的服务,防止资源消耗;
同样路由器也可以使应用程序能够诊断错误是否已修正,如果正常;会再次尝试调用

断路器模式需要做哪些事情呢?

  1. 首先肯定要监控,比如调用哪些服务,共计多少次?多少次失败? 如超过20%,断路器打开状态
  2. 断路器状态(打开、关闭、半开)
  3. 分流,半开状态,一小部分流量尝试请求
  4. 断路器状态切换

下面讲解 Hystrix 实现断路器模式

熔断

如图,浏览器发送一个请求到API,请求微服务B,此处微服务B出现异常,开发人员可以在微服务B基础上提供一个Fallback机制,API直接请求Fallback,此时不再请求服务B

Hystrix Demo

@SpringBootAppliction
@EnableCircuitBreaker
public class CircuitBreakerApplication{
	public static void main(String[] args){
		SpringApplication.run(CircuitBreakerApplication.class,args);
	}
}



@RestController
public class CircuitBreakerDemoController {


    @Autowired
    private FeginClient feginClient;

    @RequestMapping(value = "/getUser",method = RequestMethod.GET)
    @HystrixCommand(fallbackMethod="getUserFallback")
    public String showInfo(@RequestParam String name){
        return feginClient.userInfo(name);
     }
	public getUserFallback(String name){
	    return "";
		}
    }

针对以上代码,什么时候进入getUserFallback()方法呢?
配置 hystrix.command.default.execution.isolation.trhead.timeoutInMilliseconds:5000
调用服务方法showInfo(),5秒钟未响应,此时认为服务存在异常,会调用getUserFallback()方法

总结:
Hystrix 实现断路器模式,可以控制服务的统计、限流;保证资源合理化利用

作者简介:张程 技术研究

更多文章请关注微信公众号:zachary分解狮 (frankly0423)
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值