小白使用Hystrix
Hystrix是什么东西?百度一下:

没错,hystrix是豪猪的意思,作为SpringCloud微服务系统中保持服务稳定的重要组件,正如它的名字一样,它对整个系统起到了保护的作用。
在许多文章当中把hystrix描述为熔断器,便于我们结合生活来理解。想象一下,你在家使用了很多的大功率的电器,导致电路的压力很大,当达到
一个临界值的时候,就会跳闸。而在一个庞大的微服务系统中,有几十上百个服务同时运行,如果因为一个服务故障导致整个系统崩溃,这是不可想象的,
所以有了hystrix,用于出现故障的时候提供服务降级,服务熔断,服务监控等手段来保护系统。
下面我们就来简单的介绍一下hystrix如何使用。
依赖引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
基本在SpringCloud中使用任何一个功能都需要引入依赖,比如服务发现,统一配置,网关,服务追踪等等。
基本使用
启动类加注解
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
加上注解后我们就可以使用hystrix,这里我提供一个场景:
现有订单服务和商品服务两个服务,订单服务调用商品服务的商品列表接口,我们通过这个服务之间的调用来看两种hystrix的应用:服务降级和服务熔断。
先说服务降级,服务降级是什么呢?
我们去菜市买肉,一开始呢,我想吃牛肉,于是问老板有没有牛肉,老板说没有;然后我降低档次,选择猪肉,还是没有;最后买了鸡肉。这就是一个
降级的过程,老板对我提供服务,当不能满足我的请求的时候,他会告诉我没有。如果没有做服务降级,那么当我问老板的时候,老板直接不鸟我,这种就是
服务态度恶劣,很垃圾的服务。
对应到微服务体系中,就是说当服务不可用或者出现故障的时候需要有应急措施来响应客户的请求。下面是具体应用,比较简单,先看未使用服务降级的场景:

当两个服务都正常运行的时候,不用说,一点儿问题都没有。然后我们将product服务关闭掉:

直接报500了,这样对普通用户很不友好,又不是每一个人都知道httpcode的含义,那怎么办呢?有人可能会想到根据httpcode定义不同错误提示页面,这也是
一个是思路,但是根据httpcode只能做到把错误抽出来形成几个公共的提示页面,而不能每一个接口都返回不同的提示,针对这个问题,我们就可以使用到hystrix的服务
降级功能了。具体步骤是在要做服务降级的接口上加@HystrixCommand注解,并定义服务降级的方法:
1 private String fallback(int id){
2 return "当前网络繁忙,请稍后再试哦!" + id;
3 }
在@HystrixCommand注解中指定方法:

这时候再来看order服务调用product服务:

出现了我们想要的提示,这样对用户来说,至少比直接返回个错误码或者啥都不返回要强的多吧。。。
接下来再看看服务熔断,服务熔断就如我们开篇所说的,就是一个开关,可以预防雪崩问题的出现,不会出现一个服务挂掉拖死N个服务的问题。
我们现在假设订单服务需要频繁的调用商品服务,而商品服务由于某种原因出现了单点故障不能访问mysql,此时订单服务的请求还在不断的过来,
这些请求来到商品服务之后执行了商品这边一大堆的逻辑之后却发现不能入库,what fuck?这就很尴尬了对不对,于是乎,熔断器应运而生。
我们可以在@HystrixCommand中定义请求商品服务是否开启熔断器、请求数量阈值,错误占比,超时时间等,具体的可以直接看源码里面有那些属性:

circuitBreaker.enabled:开启熔断器
circuitBreaker.requestVolumeThreshold:当请求达到这个数量之后,才进行错误占比的计算。
circuitBreaker.errorThresholdPercentage:错误占比,当错误次数超过这个百分比,就会熔断。
circuitBreaker.sleepWindowInMilliseconds:半打开休眠时间,熔断之后过了这段休眠时间,就会半打开,尝试接口是否恢复,如果恢复就完全打开熔断器。
由于参数比较多,可以放到类上面或者配置文件里面全局配置:
1 @DefaultProperties(defaultFallback = "fallbackForGlobal", commandProperties = {
2 @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
3 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
4 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
5 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")})
配置好了尝试调用接口,当请求10次,如果其中五次都失败了,那么该接口就会被熔断,直接返回服务降级方法锁返回的。
最后,说下服务监控,就是hystrix提供的web仪表盘(hystrix dashboard),还是老套路,加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
加注解

把SpringBoot的endpoints开启:

启动之后访问http://localhost:8100/hystrix

根据提示输入地址和title,title就是服务名,我这里是order

就可以进入这个页面了

然后我们来几次错误请求:

就会在仪表盘上看到错误率这些,具体使用还请各位看官自行根据实践。
好啦,本文就到此结束了,感谢阅读本文。
小白使用Hystrix的更多相关文章
- spring cloud 2.x版本 Ribbon服务发现教程(内含集成Hystrix熔断机制)
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 前言 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...
- spring cloud 2.x版本 Feign服务发现教程(内含集成Hystrix熔断机制)
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...
- spring cloud 2.x版本 Hystrix Dashboard断路器教程
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...
- 小白也能看懂的Redis教学基础篇——做一个时间窗限流就是这么简单
不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这 ...
- 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)
今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...
- 搭建个人wordpress博客(小白教程)
新浪sae平台现在是有个免费个人空间使用,现在,教您如何使用该平台搭建属于自己的个人网站,本教程以wordpress程序安装包搭建个人网站. 申请新浪云账号 如果我们使用SAE新浪云计算平台作为服务器 ...
- 使用Hystrix提高系统可用性
今天稍微复杂点的互联网应用,服务端基本都是分布式的,大量的服务支撑起整个系统,服务之间也难免有大量的依赖关系,依赖都是通过网络连接起来. (图片来源:https://github.com/Netfli ...
- Python 小白的新手教程(一)
本文是 python 入门级别的基础知识,包括数据类型和变量.输入输出.字符串和编码.list tuple dict set .条件判断.循环.函数.切片 迭代 列表生成器 生成器 迭代器等. 参考课 ...
- Python爬虫小白入门(一)写在前面
一.前言 你是不是在为想收集数据而不知道如何收集而着急? 你是不是在为想学习爬虫而找不到一个专门为小白写的教程而烦恼? Bingo! 你没有看错,这就是专门面向小白学习爬虫而写的!我会采用实例的方式, ...
随机推荐
- Linux 操作系统 基础
root: 管理员 /: 根目录[windows : 计算机] ~: 家目录: 管理员:/root/.. 非管理员:/home/... 命令提示符: [root@localhost abc]#: ro ...
- 解放生产力:Spring Boot的注解校验
关于对象入参的校验,我们可能第一个想到的就是在Controller层或者Service层增加很多if else的判断,如: if (user.getPassword() == "" ...
- 高可用集群corosync+pacemaker之pcs安装使用
前文我们介绍了高可用集群corosync+pacemaker的集群管理工具crmsh的常用命令的使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/tag/crms ...
- 剑指 Offer 43. 1~n整数中1出现的次数
题目描述 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次. 示例 1: 输入:n = 12 ...
- Leetcode 全排列专题(更新ing)
总览 涉及到的题目有 题号 名字 难度 Leetcode 60 第k个排列 中等 Leetcode 46 全排列 中等 待更新...... Leetcode 46 全排列 题目 基础题 给定一个 没有 ...
- 《Java从入门到失业》第四章:类和对象(4.2):String类
4.2String类 这一节,我们学习第一个类:String类.String翻译成汉语就是“字符串”,是字符的序列.我们知道,在Java中,默认采用Unicode字符集,因此字符串就是Unicode字 ...
- Linux实战(13):Centos8 同步时间
前言 以下操作是通过ntpdate命令实现同步 timedatectl set-timezone Asia/Shanghai # 设置时区 rpm -ivh http://mirrors.wlnmp. ...
- Windows提示80被占用
情景:使用cmd启动某一服务的时候报错[emerg] 7220#6900: bind() to 0.0.0.0:80 failed (10013: An attempt was made to acc ...
- 使用Mysql分区表对数据库进行优化
早期工作中没有做好足够的设计,目前记录表单表数据2000w且无有效索引,表现是分页缓慢,模糊查询拉闸. 当前业务中,写操作会多于读操作,时不时会遇到慢SQL占用过多的数据连接,导致写操作无法正常进行. ...
- Java基础一篇过(八)常见异常速查
一.引言 开发过程中可能会遇到各种各样的异常,这里还是汇总一些比较典型的异常,有些比较直观的异常如空指针这种就不写了,此文可作为异常速查用. 二.异常大军正在来袭~ IllegalArgumentEx ...