利用Spring Cloud实现微服务- 熔断机制
1. 熔断机制介绍
在介绍熔断机制之前,我们需要了解微服务的雪崩效应。在微服务架构中,微服务是完成一个单一的业务功能,这样做的好处是可以做到解耦,每个微服务可以独立演进。但是,一个应用可能会有多个微服务组成,微服务之间的数据交互通过远程过程调用完成。这就带来一个问题,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。
熔断机制是应对雪崩效应的一种微服务链路保护机制。我们在各种场景下都会接触到熔断这两个字。高压电路中,如果某个地方的电压过高,熔断器就会熔断,对电路进行保护。股票交易中,如果股票指数过高,也会采用熔断机制,暂停股票的交易。同样,在微服务架构中,熔断机制也是起着类似的作用。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand,Hystrix会找有这个注解的方法,并将这类方法关联到和熔断器连在一起的代理上。当前,@HystrixCommand仅当类的注解为@Service或@Component时才会发挥作用。
上一节中,我们提到,微服务之间的调用可以通过两种方式,一个是RestTemplate,另一个是Feign。相对应,在这两种调用方式下,都有Hystrix调用方法。
2. 代码实现及验证
本次代码实现对RestTemplate和Feign两种微服务调用场景下,使用Hystrix验证Spring Cloud的熔断机制。
2.1 RestTemplate的微服务调用场景
在第五节负载均衡,我们使用了RestTemplate实现了服务之间的调用。我们基于这一部分的代码,增加Hystrix,实现熔断机制。
1) 启动Eureka-Server及LOADBALANCE-SERVICE,不要启动Bookingcar-Service

点击"LOADBALANCE-SERVICE"后面链接,进入负载均衡验证页面,输入请求参数/v1/lb/testport?name=bookingcar-service,我们会在页面上得到以下的错误提示:

2) 在pom.xml里,添加对Hystrix的依赖

3)在ribbon-service入口程序RibbonServiceApplication.java处添加注解@EnableCircuitBreaker,开启熔断器功能,如下所示:

4) 在LoadBalanceService.java里,使用了@Service注解声明了LoadBalanceService类。我们在LoadBalanceService类里通过@HystrixCommand注解引入对TestPort调用的熔断机制,@HystrixCommand注解里可以添加回调函数,如@HystrixCommand(callbackCommand = "XXX“),当无法调用TestPort服务时,熔断机制的回调函数就会发生作用,对错误进行快速处理。

5) 重新启动LOADBALANCE-SERVICE, 再次进入负载均衡验证页面,输入请求参数/v1/lb/testport?name=bookingcar-service,我们发现熔断机制已经发挥作用:

2.2 Feign的微服务调用场景
在上一节,我们利用Feign实现了微服务间的内部调用,Feign中也内置了对Hystrix的支持。
1) 运行Report,同样不要启动BOOKINGCAR-SERVICE

点击REPORTING-SERVICE后面链接,进入Feign验证页面,输入参数v1/order/1,我们可以看到如下的错误提醒页面:

2) 在application.properties里,添加feign.hystrix.enabled=true,使能Feign对hystrix的支持,如下所示:

3)在pom.xml里,添加对Hystrix的依赖

4) 在Report的入口程序ReportsApplication里,添加注解@EnableCircuitBreaker,开启熔断器功能,如下所示:

5) 在OrderClient.java里Feign的注解里,添加回调函数的参数

6) 添加一个新的类OrderClientHystrix,当调用微服务发生错误时,进行处理,本示例中,会返回“Hystrix works in Feign”的信息。

7)重新运行Report,点击REPORTING-SERVICE后面链接,输入请求参数v1/order/1,我们发现熔断机制已经发挥作用,显示如下:

3. 总结:
微服务本身是一种分布式架构,当调用链路过长时,系统的可用性是很大的挑战。Spring Cloud框架的Hystrix提供了熔断机制,在RestTemplate和Feign两种对微服务调用的场景下都可以使用,当调用链路出现问题时可以快速进行服务降级处理,为我们提高微服务架构的可用性提供了很大的帮助。
代码:https://github.com/shuxingliu/microservices
利用Spring Cloud实现微服务(四)- 微服务实现与注册
利用Spring Cloud实现微服务(三)- 业务领域驱动微服务设计
作者:书兴
链接:http://www.jianshu.com/p/0d53a9101ec6
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
利用Spring Cloud实现微服务- 熔断机制的更多相关文章
- Spring Cloud与微服务构建:Spring Cloud简介
Spring Cloud简介 微服务因该具备的功能 微服务可以拆分为"微"和"服务"二字."微"即小的意思,那到底多小才算"微&q ...
- 基于 Spring Cloud 的微服务架构实践指南(下)
show me the code and talk to me,做的出来更要说的明白 本文源码,请点击learnSpringCloud 我是布尔bl,你的支持是我分享的动力! 一.引入 上回 基于 S ...
- spring Boot+spring Cloud实现微服务详细教程第二篇
上一篇文章已经说明了一下,关于spring boot创建maven项目的简单步骤,相信很多熟悉Maven+Eclipse作为开发常用工具的朋友们都一目了然,这篇文章主要讲解一下,构建spring bo ...
- Spring Cloud构建微服务架构(五)服务网关
通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 我们使用Spring Cloud Netflix中的Eureka实现了服务 ...
- Spring Cloud构建微服务架构 - 服务网关
通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...
- 【微服务】使用spring cloud搭建微服务框架,整理学习资料
写在前面 使用spring cloud搭建微服务框架,是我最近最主要的工作之一,一开始我使用bubbo加zookeeper制作了一个基于dubbo的微服务框架,然后被架构师否了,架构师曰:此物过时.随 ...
- Spring Cloud与微服务构建:微服务简介
Spring Cloud与微服务构建:微服务简介 单体架构及其不足 1.单体架构简介 在软件设计中,经常提及和使用经典的3曾模型,即表示层.业务逻辑层和数据访问层. 表示层:用于直接和用户交互,也成为 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习
转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习--转
原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...
随机推荐
- 利用arcgis发布综合又详细的地理定位服务
数据: sheng:省,city:城市,xian:区县,street2:街道,life:生活服务(house:住宅小区)需求: 根据经纬度信息,得到详细地址信息,比如:甘肃省兰州市**县**街道**小 ...
- Hadoop学习笔记之三:DataNode
DataNode对ClientDatanodeProtocol.InterDatanodeProtocol两个协议接口进行了实现,通过ipc::Server向Client.其它DN提供RPC服务(参见 ...
- show processlist命令与kill 线程
show [full] processlist show processlist显示正在运行的线程.如果有process权限,则可以查看所有正在运行的线程.否则,只能看到自己的线程.如果不使用full ...
- 电影编码JPEG2000与H.264
电影的第三次革命是数字电影的诞生,数字电影取代了胶片,那么数字电影就一定有其独特的封装(压缩)格式.在网络上,我们经常见到许多视频格式,诸如mp4.mkv.flv.rmvb等,这些都是在通用计算机上播 ...
- python之字符编码(二)
一.字符编码的发展史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以 ...
- 【ASP.Net MVC3 】使用Unity 实现依赖注入
转载于:http://www.cnblogs.com/techborther/archive/2012/01/06/2313498.html 家人身体不太好,好几天没在园子里发帖了. 新项目还是要用M ...
- dubbo-启动时检查
dubbo缺醒会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认 check=true 可以通过 check=false 关闭检查,比如 ...
- Android 4.4 根据uri获取路径的方法
当我们选择图片以后,返回的是Uri,此时我们要把路径存储到数据库,必须将其转换成String类型. URI: //content://com.android.providers.media.docu ...
- mvc 遇到的问题
VS2010无法加载项目,此安装不支持该项目类型. 错误产生的原因是以前是用2010建的,后来用2012打开,可能是经过转换后,2010又打不开了. 用VS2010无法加载项目,提示:无法打开项目文件 ...
- bzoj 4044 Virus synthesis - 回文自动机 - 动态规划
题目传送门 需要高级权限的传送门 题目大意 要求用两种操作拼出一个长度为$n$的只包含'A','T','G','C'的字符串 在当前字符串头或字符串结尾添加一个字符 将当前字符串复制,将复制的串翻转, ...