三.SpringCloud入门-熔断器Hystrix

1.Hystrix理解

1.1Hystrix介绍

Hystrix是国外知名的视频网站Netflix所开源的非常流行的高可用架构框架。Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题,如雪崩。

Hystrix是处理依赖隔离的框架,将出现故障的服务通过熔断、降级等手段隔离开来,这样不影响整个系统的主业务(比如你得了传染病是不是要把你关起来隔离呢),同时也是可以帮我们做服务的治理和监控。

Hystrix的英文是豪猪,中文翻译为 熔断器,其思想来源于我们家里的保险开关,当家里出现短路,保险开关及时切掉电路,保证家里人员的安全,其目的就是起保护作用。

其设计原则如下:

1.防止单个服务异常导致整个微服务故障。
2.快速失败,如果服务出现故障,服务的请求快速失败,线程不会等待。
3.服务降级,请求故障可以返回设定好的二手方案数据(兜底数据)。
4.熔断机制,防止故障的扩散,导致整个服务瘫痪。
5.服务监控,提供了Hystrix Bashboard仪表盘,实时监控熔断器状态

1.2雪崩效应

真实的雪崩,声音的振动会导致雪球掉落,然后越滚越大导致雪崩。在微服务中也是一样,服务之间的调用是非常复杂的,在服务的调用中,一个服务发生故障,可能会导致调用它的服务也发生异常,最后导致整个服务链都发生异常,甚至导致整个服务崩溃,这就是雪崩。

1.3Hystrix功能

1.资源隔离

资源隔离包括线程池隔离和信号量隔离,作用是限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用 ,这里可以简单的理解为资源隔离就是限制请求的数量。

线程池隔离:hystix提供了一个线程池,让请求在新的线程中去执行(异步),限流上限就是线程池中的线程数量+队列长度,如果超出该限制-拒接请求,触发降级

信号量隔离:设置一个信号量(数字) ,请求来了会给一个计数器+1,请求走了会-1,某一个时刻,计数器达到信号量上限-拒接请求,触发降级

线程池和信号量对比:

对比线程池信号量
线程与调用线程非相同线程与调用线程相同(jetty线程)
开销排队、调度、上下文开销等无线程切换,开销低
异步支持不支持
并发量支持支持(最大线程池大小)支持(最大信号量)

2.服务熔断

熔断:服务多次访问失败,就会被标记为‘熔断状态,如果某个请求去访问一个熔断状态的服务,会快速失败,触发服务降级:目的-防止请求阻塞

3.降级机制

当一个业务(请求)失败/超时,就会走预先设置好的第二种方案(也就是降级逻辑)。                        超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。

4.缓存

提供了请求缓存、请求合并实现 , 在高并发的场景之下,Hystrix请求缓存可以方便地开启和使用请求缓存来优化系统,达到减轻高并发时请求线程的消耗、降低请求响应时间的效果。

2.Hystrix编码实战

2.1导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>


<!--或者openfeign中包含了hystrix-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.2配置类开启Hystrix

/**
 * 订单的启动类
 */
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker       //开启Hystrix熔断
public class OrderServerApplication1030
{
    //省略...

2.3托底类,熔断后走

/**
 * 工厂方式的托底类
 */
@Component
public class UserFeignClientFallbackFactory implements FallbackFactory<UserFeignClient> {
    @Override
    public UserFeignClient create(Throwable throwable) {
		//返回UserFeignClient 接口的实例
        return new UserFeignClient() {

            //真正的托底方法 : throwable,异常
            @Override
            public User getById(Long id) {
                //把异常信息打印到控制台
                throwable.printStackTrace();
                //托底数据
                return new User(-1L,"无此用户","用户服务不可用");
            }
        };
    }
}

2.4测试熔断

依次启动:springcloud-eureka-server-1010 , springcloud-user-server-1020 , springcloud-order-server-1030

浏览器访问 http://localhost:1030/order/1 ,当用户服务 springcloud-user-server-1020 正常启动的时候,订单服务是可以访问,浏览器也可以收到结果 , 当关闭掉用户服务 ,订单服务会触发熔断,返回托底数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值