Hystrix

说到Hystrix就得先说一下产生的背景等等,那就是雪崩效应. 在微服务中肯定存在多个服务层之间的调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应. 简单的来说就是一种因"服务提供者"的不可用导致"服务消费者"的不可用,并将不可用逐渐放大的过程.如下图所示:

A是服务提供者,B是A的消费者,CD是B的消费者(这也就是前面说的服务者和提供者并没有明显的界限,一个服务可以是提供者,也可能是其它服务的提供者). A的不可用引起了B的不可用,并将不可用逐渐放大到CD,服务雪崩就形成了.

那归根结底,造成服务雪崩效应的原因如下:

  • 服务提供者不可用

    • 硬件故障
    • 程序Bug
    • 缓存击穿
    • 用户大量请求
  • 重试加大流量
    • 用户重试
    • 代码逻辑重试
  • 服务调用者不可用
    • 同步等待造成的资源耗尽

对于每一个原因都有对应的应对策略:

  • 流量控制

    • 网关限流
    • 用户交互限流
    • 关闭重试
  • 改进缓存模式
    • 缓存预加载
    • 同步改为异步刷新
  • 服务自动扩容
    • AWS的auto scaling
  • 服务调用者降级服务(Hystrix)
    • 资源隔离
    • 对依赖服务进行分类
    • 不可用服务的调用快速失败

而Hystrix就是为了预防链路雪崩效应产生的,下面说说Hystrix的特性.

Hystrix的特性

服务降级(Fallback)

Fallback相当于降级操作.对于查询操作,实现一个fallback方法,当请求后端服务出现异常的时候,可以使用fallback方法返回值,这个值一般是默认值或者来自缓存.

资源隔离

在 Hystrix 中,主要通过线程池来实现资源隔离。通常在使用的时候我们会根据调用的远程服务划分出多个线程池。例如调用产品服务的 Command 放入 A 线程池,调用账户服务的Command放入B线程池。这样做的主要优点是运行环境被隔离开了。这样就算调用服务的代码存在 bug 或者由于其他原因导致自己所在线程池被耗尽时,不会对系统的其他服务造成影响。

这样,通过对依赖服务实现线程池隔离,可以让应用更健壮,不会因为个别依赖服务出现问题而引起非相关服务的异常.但是这样要维护线程池会带来额外的开销, Netflix Hystrix 官方实例中,99%的情况下,使用线程池隔离的延迟有9ms,这个对于大多数需求来说几乎是没有影响;当然,如果觉得9ms的延迟开销接受不了,并且依赖服务足够可靠的情况下,可以使用信号模式来隔离资源,Hystrix在HystrixCommand 和 HystrixObservableCommand 中 2 处支持信号量的使用:

  • 命令执行:如果隔离策略参数 execution.isolation.strategy 设置为 SEMAPHORE,Hystrix 会使用信号量替代线程池来控制依赖服务的并发控制。
  • 降级逻辑:当 Hystrix 尝试降级逻辑时候,它会在调用线程中使用信号量。

信号量的默认值为 10,也可以通过动态刷新配置的方式来控制并发线程的数量。

断路器机制

当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN). 这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力.

使用Feign Hystrix

熔断一般是用在服务调用者层面,所以在上一个eureka项目中,修改调用者.在配置文件中添加

feign.hystrix.enabled=true

创建回调类:

@Component
public class HelloRemoteHystrix implements HelloRemote { @Override
public String hello(@RequestParam(value = "name") String name) {
return "Hello World!!!";
}
}

添加fallback,修改远程调用的接口

@FeignClient(name = "eureka-service-producter",fallback = HelloRemoteHystrix.class)
public interface HelloRemote { /**
* 远程调用提供者的hello
* @param name
* @return
*/
@GetMapping("/hello")
public String hello(@RequestParam("name") String name); }

这个时候三个都启动的话,访问http://localhost:9010/hello/wangzhi会显示提供者的helloController中hello方法返回的内容,这个时候将提供者服务关掉,再次访问就会返回回调类的内容,也就是Hello World!!!

最后说一句,使用Hystrix,可以有效的防止雪崩,同时使系统具有自动降级和自动恢复服务的效果.

Hystrix Dashboard和Turbine

Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数据。但是只使用Hystrix Dashboard的话, 你只能看到单个应用内的服务信息, 这明显不够. 我们需要一个工具能让我们汇总系统内多个服务的数据并显示到Hystrix Dashboard上, 这个工具就是Turbine.

Hystrix Dashboard

创建标准的SpringBoot项目hystrix-dashborad-demo,添加依赖,添加注解,添加配置,代码如下:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency> @EnableHystrixDashboard
@SpringBootApplication
public class HystrixDashboradDemoApplication { public static void main(String[] args) {
SpringApplication.run(HystrixDashboradDemoApplication.class, args);
} } spring.application.name=hystrix-dashboard
server.port=11000

启动就可以访问了: localhost:11000/hystrix就可以看到界面了.

这个时候还没完,因为这个hystrix dashborad是监控,所以必须有服务让他监控,所以需要修改一下服务消费者,添加下面依赖:

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

添加注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrix
public class ServiceConsumerDemoApplication { public static void main(String[] args) {
SpringApplication.run(ServiceConsumerDemoApplication.class, args);
} }

添加配置

server.port=9010
spring.application.name=eureka-service-consumer
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
feign.hystrix.enabled=true
# 用来暴露 endpoints的,如果自身就是监控的话,可以不写(http://www.ityouknow.com/springcloud/2017/05/18/hystrix-dashboard-turbine.html)
management.endpoints.web.exposure.include=hystrix.stream

上面的配置基本就OK了,之后全部启动,访问localhost:11000/hystrix,在第一行输入 http://localhost:9010/actuator/hystrix.stream,点击monitor stream就可以进入监控界面了.

进入监控界面会显示loading,这个是等待你访问,所以这个时候访问localhost:9010/hello/wangzhi,这边监控就会有结果展示了,重点看那6个颜色不同的数字就可以,右边会有说明每个数字表示什么!!!

Turbine

通过 Hystrix Dashboard,我们可以方便的查看服务实例的综合情况,比如:服务调用次数、服务调用延迟等。但是仅通过 Hystrix Dashboard 我们只能实现对服务当个实例的数据展现,在生产环境我们的服务是肯定需要做高可用的,那么对于多实例的情况,我们就需要将这些度量指标数据进行聚合。这个时候就要用到Turbine.

在前面的基础上(也就是前面的系统要启动),重新创建项目turbine-demo,添加依赖等等操作如下

 <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine</artifactId>
</dependency> spring.application.name=turbine
server.port=11001
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
turbine.app-config==eureka-service-consumer
turbine.cluster-name-expression=new String("default")
turbine.combine-host-port=true @EnableTurbine
@SpringBootApplication
public class TrubineDemoApplication { public static void main(String[] args) {
SpringApplication.run(TrubineDemoApplication.class, args);
} }

配置文件参数说明:

  • turbine.app-config参数指定了需要收集监控信息的服务名;
  • turbine.cluster-name-expression 参数指定了集群名称为 default,当我们服务数量非常多的时候,可以启动多个 Turbine 服务来构建不同的聚合集群,而该参数可以用来区分这些不同的聚合集群,同时该参数值可以在 Hystrix 仪表盘中用来定位不同的聚合集群,只需要在 Hystrix Stream 的 URL 中通过 cluster 参数来指定;
  • turbine.combine-host-port参数设置为true,可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以 host 来区分不同的服务,这会使得在本地调试的时候,本机上的不同服务聚合成一个服务来统计。

这样就可以启动了,直接在浏览器访问localhost:11001/turbin.stream就可以看到效果了.

这就是hystrix的使用和监控面板以及turbine的使用了,两个监控哦.

Spring Cloud(三) --- hystrix的更多相关文章

  1. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  2. Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失问题分析

    最近spring boot项目中由于使用了spring cloud 的hystrix 导致了threadLocal中数据丢失,其实具体也没有使用hystrix,但是显示的把他打开了,导致了此问题. 导 ...

  3. 架构师系列文:通过Spring Cloud组件Hystrix合并请求

    在前文里,我们讲述了通过Hystrix进行容错处理的方式,这里我们将讲述通过Hystrix合并请求的方式 哪怕一个URL请求调用的功能再简单,Web应用服务都至少会开启一个线程来提供服务,换句话说,有 ...

  4. Spring Cloud断路器Hystrix

    在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就会因依赖关系形成故障蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构就更加的不稳定.为了解决这样的问题,因此产生了断路器模式. 什么是 ...

  5. Spring Cloud 之 Hystrix.

    一.概述  在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依 ...

  6. Spring Cloud之Hystrix

    在微服务架构中,存在那么多的服务单元,若一个单元出现故障(由于网络原因或者自身原因),就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定.为了解决这样的问题, ...

  7. 详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

    在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离. 在使用线程隔离的时候,有个问题是必须 ...

  8. 笔记:Spring Cloud Feign Hystrix 配置

    在 Spring Cloud Feign 中,除了引入了用户客户端负载均衡的 Spring Cloud Ribbon 之外,还引入了服务保护与容错的工具 Hystrix,默认情况下,Spring Cl ...

  9. 从零开始学spring cloud(十一) -------- hystrix监控

    一.官方文档阅读 服务启动后,可以通过/health和hystrix.stream查看效果,实际上,访问上述两个地址,会出现404,这是因为spring boot版本的问题, 我在这里使用的sprin ...

随机推荐

  1. 【下一代核心技术DevOps】:(六)Rancher集中存储及相关应用

    1. 前言 为什么要使用集中存储? 使用集中存储有个很大的优势是数据安全和统一管理,和集群完美配合. 产品集成存储经历过几个阶段: 1.单机本机存储. 系统使用本地硬盘存储 2.单网络集中存储. 局域 ...

  2. C#_Math函数总结

    Math.abs() 计算绝对值. Math.acos() 计算反余弦值. Math.asin() 计算反正弦值. Math.atan() 计算反正切值. Math.atan2() 计算从x 坐标轴到 ...

  3. 【实践报告】Linux基础实践一

    [chmod 命令] chmod命令是非常重要的,用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限. 该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设 ...

  4. git体会

    刘仙臣个人github链接:http://www.github.com/liuxianchen 这次作业学会了关于git的一些基本操作,学习了到了许多东西,为以后的学习奠定了基础,激发了学习的兴趣.具 ...

  5. 剑指offer:复杂链表的复制

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用, ...

  6. 全新OCR3500数据

    改装: 手变6700,夹器彦豪R741,牙盘5700,前拨5700,后拨5701,飞轮5700,链条YBN S10 S2,弯把DEDA RHM01,前叉山寨BIANCHI K-VID,轮组FULCRU ...

  7. windows 与linux 上面PG的简单验证

    0.0 目的 验证一下 windows 上面 和linux上面的数据文件是否可以 冷备份 恢复. 1 方法关闭 windows机器上面postgresql 的服务 我这边是PG10.4 可以使用命令 ...

  8. Vue 组件化

    根实例└─ TodoList ├─ TodoItem │ ├─ DeleteTodoButton │ └─ EditTodoButton └─ TodoListFooter ├─ ClearTodos ...

  9. CIO知识储备

    1.IT安全和法规知识是CIO的首要 2.IT项目管理专业知识是CIO的必备 3.合作伙伴管理和供应商管理对成功也很关键 4.企业数据管理技能对CIO越来越重要 5.企业财务技能是CIO的一种必备 6 ...

  10. 基于C#.NET的高端智能化网络爬虫(一)(反爬虫哥必看)

    前两天朋友发给我了一篇文章,是携程网反爬虫组的技术经理写的,大概讲的是如何用他的超高智商通过(挑衅.怜悯.嘲讽.猥琐)的方式来完美碾压爬虫开发者.今天我就先带大家开发一个最简单低端的爬虫,突破携程网超 ...