Spring Cloud系列(四):断路器Hystrix
上一篇介绍了负载均衡的配置方法,做负载均衡是为了保证高可用性,但是有时候服务提供者挂掉了,比如服务A调用了服务B,服务B又调用了服务C,然后有一天服务C的所有节点都挂掉了,这时服务B就会因为C异常而在不停地等待,服务A又会因为服务B没响应在不断地等待,结果请求来得越来越多,使得整个系统雪崩式地出现异常。
为了防止这种情况的出现,我们需要给服务做一些保护的措施,当服务B调用服务C在一定时间内出现同样的异常,比如在5秒内出现了20次,那么后面服务B就不要再去调用服务C了,它已经出现问题了,你自己另找办法吧(比如执行另一个方法或者直接返回错误)。
Hystrix就是用来做熔断的,它类似于我们家庭电路的保险丝,当服务提供者出现异常导致无法调用,就会把消费者到提供者这条链路给断掉,不让客户端一直等待,保护整个系统。
断路器功能是在服务消费者上实现的,上一篇介绍了ribbon和feign两种消费服务方式,本篇也会在分别在这两种方式上实现。我们仍然在之前的项目添加断路器的功能。
一、在Ribbon中使用断路器
1.1、添加ribbon依赖
在service-consumer-ribbon的pom文件添加Hystrix的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
1.2、开启断路器
在启动类添加@EnableHystrix注解
1.3、提供断路方法
修改RibbonConsumerService类如下
@Service
public class RibbonConsumerService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "indexError")
public String index(String uid) {
return restTemplate.getForObject("http://SERVICE-PROVIDER/callServiceProvider?uid=" + uid, String.class);
}
public String indexError(String uid) {
return uid + ",你好,服务提供者出错了,直接返回错误信息";
}
}
就是添加了一个当断路后调用的方法,然后在原来的index方法加上@HystrixCommand注解,意思就是先调用远程的http方法,如果失败就会去调用indexError方法,起到了断路的作用
1.4、测试
分别启动单节点注册中心、单节点服务消费者和ribbon消费者三个项目,访问http://localhost:8080/index?uid=ribbon,可以看到返回了
服务8770的消息:用户ribbon调用了此服务
然后把服务提供者停止,再次访问http://localhost:8080/index?uid=ribbon,可以看到返回的是
ribbon,你好,服务提供者出错了,直接返回错误信息
说明断路器起作用了
二、在Feign中使用断路器
2.1、启动断路器功能
Feign自带断路器的,但是在Greenwich版本中默认是关闭的,先在service-consumer-feign的application.properties中添加以下配置
feign.hystrix.enabled=true
2.2、提供断路方法
创建一个类FeignConsumerServiceImpl实现FeignConsumerService接口
@Component
public class FeignConsumerServiceImpl implements FeignConsumerService {
@Override
public String index(String uid) {
return uid + ",你好,服务提供者出错了,直接返回错误信息";
}
}
然后在原来的接口的注解加上fallBack属性,值就是断路器类
@FeignClient(value = "service-provider", fallback = FeignConsumerServiceImpl.class)
public interface FeignConsumerService {
@RequestMapping("/callServiceProvider")
String index(@RequestParam("uid") String uid);
}
2.3、测试
测试方法和ribbon的一样,就不再赘述了
三、Hystrix Dashboard
Hystrix断路器还提供了实时监控后台给我们使用——Hystrix Dashboard。
3.1、创建看板module
新建一个module,名称为hystrix-dashboard,添加Spring Web和Hystrix DashBoard依赖,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
启动类添加@EnableHystrixDashboard注解
3.2、修改服务消费者
我们先在ribbon消费者中添加Spring Boot Actuator依赖,如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
接着在application.properties中添加一下配置
management.endpoints.web.exposure.include=*
因为在Spring Boot 2.X Actuator暴露的端口只有info和health两个端点,我们先把所有的端点都开放
3.3、启动&测试
依次启动注册中心、服务提供者、服务消费者和Hystrix Dashboard,然后访问http://localhost:8888/hystrix,就可以看到Hystrix的界面了
在界面上我们可以看到断路器支持默认集群、指定集群和单应用,我们这里只演示单应用的用法。
在中间输入http://localhost:8080/actuator/hystrix.stream,然后点击Monitor Stream按钮,可以看到当前的调用情况
因为我们还没有调用任何的服务提供者,所以这里没有数据显示。连续访问http://localhost:8080/index?uid=ribbon后可以看到监控页面出现调用的数据
比如这里的数据是8次成功,0次超时、错误率0.0%,这里的数字说明对应着右上角不同颜色的提示说明,Circult的状态为Closed。我们把服务提供者停止,然后连续访问http://localhost:8080/index?uid=ribbon,当服务提供者出错率达到一定程度(默认是5秒出错20次),断路器就会熔断,Circult的状态变为Open
feign中的用法也是一样的,就不再重复。
四、总结
断路器相关的内容介绍到这里,下一篇介绍网关。
源码已经上传到github:https://github.com/spareyaya/spring-cloud-demo/tree/master/chapter4
Spring Cloud系列(四):断路器Hystrix的更多相关文章
- 【Spring Cloud笔记】 断路器-hystrix
在微服务架构中,一个微服务的超时失败可能导致瀑布式连锁反映,Spring Cloud Netflix 的断路器Hystrix通过自主反馈,防止了这种情况发生.下面介绍简单的断路器使用方法. [step ...
- spring cloud学习(五)断路器 Hystrix
断路器 Hystrix 断路器模式 (云计算设计模式) 断路器模式源于Martin Fowler的Circuit Breaker一文. 在分布式环境中,其中的应用程序执行访问远程资源和服务的操作,有可 ...
- Spring Cloud 系列之 Netflix Hystrix 服务监控
Actuator Hystrix 除了可以实现服务容错之外,还提供了近乎实时的监控功能,将服务执行结果和运行指标,请求数量成功数量等等这些状态通过 Actuator 进行收集,然后访问 /actuat ...
- Spring Cloud 系列之 Netflix Hystrix 服务容错
什么是 Hystrix Hystrix 源自 Netflix 团队于 2011 年开始研发.2012年 Hystrix 不断发展和成熟,Netflix 内部的许多团队都采用了它.如今,每天在 Netf ...
- Spring Cloud项目之断路器集群监控Hystrix Dashboard
微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完 ...
- Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】
Spring Cloud(四):服务容错保护 Hystrix[Finchley 版] 发表于 2018-04-15 | 更新于 2018-05-07 | 分布式系统中经常会出现某个基础服务不可用 ...
- spring cloud 2.x版本 Hystrix Dashboard断路器教程
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...
- spring cloud系列教程第四篇-Eureka基础知识
通过前三篇文章学习,我们搭建好了两个微服务工程.即:order80和payment8001这两个服务.有了这两个基础的框架之后,我们将要开始往里面添加东西了.还记得分布式架构的几个维度吗?我们要通过一 ...
- Spring Cloud 系列之 Gateway 服务网关(四)
本篇文章为系列文章,未读第一集的同学请猛戳这里: Spring Cloud 系列之 Gateway 服务网关(一) Spring Cloud 系列之 Gateway 服务网关(二) Spring Cl ...
- Spring Cloud 系列之 Apollo 配置中心(四)
本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Apollo 配置中心(一) Spring Cloud 系列之 Apollo 配置中心(二) Spring Clou ...
随机推荐
- android安全学习、工具库、框架
在介绍android工具之前,先理清android中出现的文件格式: java:android源码 class:java编译后生成: dex: 由dx工具编译class而成,由dalvik执行: sm ...
- Win64 驱动内核编程-6.内核里操作注册表
内核里操作注册表 RING0 操作注册表和 RING3 的区别也不大,同样是"获得句柄->执行操作->关闭句柄"的模式,同样也只能使用内核 API 不能使用 WIN32 ...
- CVE-2018-0802:Microsoft office 公式编辑器 font name 字段二次溢出漏洞调试分析
\x01 前言 CVE-2018-0802 是继 CVE-2017-11882 发现的又一个关于 font name 字段的溢出漏洞,又称之为 "第二代噩梦公式",巧合的是两个漏洞 ...
- <JVM中篇:字节码与类的加载篇>02-字节码指令集
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- Day002 编译型和解释型语言
编译型和解释型语言 原文链接 编译型(Compile) 用编译型语言写的程序执行之前,需要一个专门的编译过程,针对特定的平台,使用专门的编译器,把高级语言翻译成机器语言,以后直接运行而不需要再编译了, ...
- 一文带你全面了解java对象的序列化和反序列化
摘要:这篇文章主要给大家介绍了关于java中对象的序列化与反序列化的相关内容,文中通过详细示例代码介绍,希望能对大家有所帮助. 本文分享自华为云社区<java中什么是序列化和反序列化?>, ...
- 基于 registry 搭建 Docker 私有镜像仓库
今天主要介绍使用 registry 来搭建 Docker私有镜像仓库,方便在公司内部项目中使用,registry 也是 Docker 官方提供的一个镜像,操作也很简单. dockerhub: http ...
- 2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛总结
1003 Express Mail Taking 题意:有n个柜子(编号1-n),m封信,k号位置有钥匙,现在需要取信封,并且每取一次信封都要从k号位置进行领取一次钥匙,再去有信封的位置领取信封,问最 ...
- [敏杰开发]Beta阶段测试报告
[敏杰开发]Beta阶段测试报告 这是一篇软工课程博客 项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 作业要求 Beta阶段测试报告 我们在这个课程的目标是 测试项目 这个作业在哪个 ...
- Spark大数据处理框架入门(单机版)
导读 引言 环境准备 安装步骤 1.下载地址 2.开始下载 3.解压spark 4.配置环境变量 5.配置 spark-env.sh 6.启动spark服务 7.测试spark stay hungry ...