小白使用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! 你没有看错,这就是专门面向小白学习爬虫而写的!我会采用实例的方式, ...
随机推荐
- Android studio Debug 源码
原来有的地方打不了断点 会提示no executable code at line xxx 源码sdk里有,sdkManager下好对应版本,然后使用对应版本的模拟器debug就行了 如果要debug ...
- 分布式事务和分布式hash
分布式事务是什么? 分布式事务就是保证各个微服务之间数据一致,本质上就是保证不同数据库的数据一致性.一致性状态包含 强一致性,任何时刻,所有节点中数据都是一样的 弱一致性,数据更新后,只能访问到部分节 ...
- 每日一道 LeetCode (41):阶乘后的零
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- C013:颠倒显示三位数
代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int original; do{ printf(&q ...
- C:算术表达式求值
代码: // fgets2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #includ ...
- 【python练习册】1.3 将1.2题生成的n个激活码保存到mysql关系型数据库中
该题涉及到mysql中一些指令,先熟悉一下 MySQL指令 参考:https://www.cnblogs.com/zhuyongzhe/p/7686105.html mysql -u root -p ...
- oracle数据库备份、还原命令及常见问题(待补充)
1.oracle数据库的备份:先查空表——将结果全选复制为insert语句——将语句执行后导出 先select 'alter table '||table_name||' allocate exten ...
- python2与python3同时安装
安装步骤: 下载 1.第一步先下载python2和python3的安装包,下载地址:https://www.python.org/downloads/windows/ 下载之后,分别给python2和 ...
- 使用PXE+VNC方式安装CentOS 7
U盘坏了,用个下面的方法安装 安装配置dhcp yum -y install dhcp tftp-server 修改如下,网段改为你自己的网段 vim /etc/dhcp/dhcpd.conf sub ...
- 第2课 - Hello, DTOS!
第2课 - Hello, DTOS! 1. 主引导程序 主引导程序是软件还是固件?如果是软件,那么由谁开发?如何开发? (1)上一节说到了固件和软件的区别.由于主引导程序没有在出厂前固化到硬件中,因此 ...