微服务 Spring Boot 2.0 + Spring cloud + consul + Hystrix + zuul + config + feign (四)

 系列文章:

  1. config:配置中心
  2. zuul :网关总线
  3. hystrix:断路保护机制(本篇)
  4. sleuth+zipkin:链路追踪系统(sleuth 不了解的可以看看这篇简介:sleuth 简介

你知道雪崩效应吗?

在微服务架构中,最可怕的就是这样的情况:

  1. 当一个基础的服务(A )出现了问题,比如数据库
  2. 提供数据的服务(B)就不可用,
  3. 随着时间的推移,
  4. 取票服务(C) 服务调用提供数据的服务(B)接口时,请求超时,C服务不可用
  5. 整个微服务系统奔溃

一张图应该就可以明白:

那么我们如何避免雪崩效应的产生?

spring cloud 给我们提供了作用在客户端的 Hystrix 断路保护机制。

Hystrix是一个有关延迟和失败容错的开源库包,用来设计隔离访问远程系统端点或微服务等,防止级联爆炸式的失败,也就是由一个小问题引起接二连三扩大的疯狂的错误爆炸直至整个系统瘫痪,能够让复杂的分布式系统更加灵活具有弹性。

先来张原理图理解下吧:

  1. 是否缓存
  2. 断路器是否打开
  3. 线程池是否充足

扫描二维码关注公众号,回复: 10847553 查看本文章

Hystrix是一个Java类库, 它提供下面这些功能来帮助我们构建健壮的微服务系统:

  • 1.断路器机制:
        断路器很好理解, 当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN). 这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力.
  • 2.Fallback:
        Fallback相当于是降级操作. 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值. fallback方法的返回值一般是设置的默认值或者来自缓存.
  • 3.资源隔离:
        在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池. 例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池. 这样做的主要优点是运行环境被隔离开了. 这样就算调用服务的代码存在bug或者由于其他原因导致自己所在线程池被耗尽时, 不会对系统的其他服务造成影响. 但是带来的代价就是维护多个线程池会对系统带来额外的性能开销. 如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源

Hystrix 的设计原则:

  • 防止单个服务的故障,耗尽整个系统服务的容器(比如tomcat)的线程资源。
  • 减少负载并快速失败,而不是排队。
  • 在可行的情况下提供回退以保护用户免受故障。
  • 使用隔离技术(如隔板,泳道和断路器模式)来限制任何一个依赖的影响。
  • 通过近乎实时的指标,监控和警报来优化发现故障的时间。
  • 通过配置更改的低延迟传播优化恢复时间,并支持Hystrix大多数方面的动态属性更改,从而允许您使用低延迟反馈循环进行实时操作修改。
  • 保护整个依赖客户端执行中的故障,而不仅仅是在网络流量上进行保护降级、限流

体现设计原则:

  • 通过HystrixCommand 或者HystrixObservableCommand 将所有的外部系统(或者称为依赖)包装起来,整个包装对象是单独运行在一个线程之中(这是典型的命令模式)。
  • 超时请求应该超过你定义的阈值
  • 为每个依赖关系维护一个小的线程池(或信号量); 如果它变满了,那么依赖关系的请求将立即被拒绝,而不是排队等待。
  • 统计成功,失败(由客户端抛出的异常),超时和线程拒绝。
  • 打开断路器可以在一段时间内停止对特定服务的所有请求,如果服务的错误百分比通过阈值,手动或自动的关闭断路器。
  • 当请求被拒绝、连接超时或者断路器打开,直接执行fallback逻辑。
  • 近乎实时监控指标和配置变化。

Spring Cloud Client 端加入 Hystrix 端支持:

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

        

application 加上  @EnableHystrix 

将需要hystrix 监控的方法加上注解 @HystrixCommand

    @GetMapping(value = "/call")
    @HystrixCommand
    public String call(){
        String msg = template.getForObject("http://consul-provider/provider",String.class);
        return msg;
    }
发布了55 篇原创文章 · 获赞 20 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/u012256142/article/details/82843868
今日推荐