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实现微服务(六)- 服务网关

利用Spring Cloud实现微服务(五)- 负载均衡

利用Spring Cloud实现微服务(四)- 微服务实现与注册

利用Spring Cloud实现微服务(三)- 业务领域驱动微服务设计

利用Spring Cloud实现微服务(二)--领域驱动设计

利用Spring Cloud实现微服务(一):Eureka服务器


作者:书兴
链接:http://www.jianshu.com/p/0d53a9101ec6
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
												

利用Spring Cloud实现微服务- 熔断机制的更多相关文章

  1. Spring Cloud与微服务构建:Spring Cloud简介

    Spring Cloud简介 微服务因该具备的功能 微服务可以拆分为"微"和"服务"二字."微"即小的意思,那到底多小才算"微&q ...

  2. 基于 Spring Cloud 的微服务架构实践指南(下)

    show me the code and talk to me,做的出来更要说的明白 本文源码,请点击learnSpringCloud 我是布尔bl,你的支持是我分享的动力! 一.引入 上回 基于 S ...

  3. spring Boot+spring Cloud实现微服务详细教程第二篇

    上一篇文章已经说明了一下,关于spring boot创建maven项目的简单步骤,相信很多熟悉Maven+Eclipse作为开发常用工具的朋友们都一目了然,这篇文章主要讲解一下,构建spring bo ...

  4. Spring Cloud构建微服务架构(五)服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 我们使用Spring Cloud Netflix中的Eureka实现了服务 ...

  5. Spring Cloud构建微服务架构 - 服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...

  6. 【微服务】使用spring cloud搭建微服务框架,整理学习资料

    写在前面 使用spring cloud搭建微服务框架,是我最近最主要的工作之一,一开始我使用bubbo加zookeeper制作了一个基于dubbo的微服务框架,然后被架构师否了,架构师曰:此物过时.随 ...

  7. Spring Cloud与微服务构建:微服务简介

    Spring Cloud与微服务构建:微服务简介 单体架构及其不足 1.单体架构简介 在软件设计中,经常提及和使用经典的3曾模型,即表示层.业务逻辑层和数据访问层. 表示层:用于直接和用户交互,也成为 ...

  8. 基于Spring Boot和Spring Cloud实现微服务架构学习

    转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...

  9. 基于Spring Boot和Spring Cloud实现微服务架构学习--转

    原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...

随机推荐

  1. 设计模式之Command(命令)(转)

    Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...

  2. SpringMVC七种参数绑定简单介绍

    a. 默认支持的类型:        httpServletRequest, httpservletresponse, httpsession, model        看自己需要, 如果需要用就加 ...

  3. 将jar包制作成docker镜像

    将jar包制作成docker镜像1.准备可运行jar包2.建立Dockerfile文件 文件内容: FROM java:8VOLUME /tmpADD xxx-sendemail-0.0.1-SNAP ...

  4. python GIL 全局锁,多核cpu下的多线程性能究竟如何?

    python GIL 全局锁,多核cpu下的多线程性能究竟如何?GIL全称Global Interpreter Lock GIL是什么? 首先需要明确的一点是GIL并不是Python的特性,它是在实现 ...

  5. Anaconda下载及安装及查看安装的Python库用法

    Anaconda下载及安装及查看安装的Python库用法 Anaconda 是一个用于科学计算的 Python 发行版,提供了包管理与环境管理的功能.Anaconda 利用 conda 来进行 pac ...

  6. myeclipse项目导入IDEA

    1.import project from external model     (不需要删除myeclipse多余文件) https://blog.csdn.net/d276031034/artic ...

  7. [trick] 玩弄svn的目录结构

    今天在使用svn进行版本管理时出现了一个小问题: 原本在s目录下有一个c目录,不知为何被删除了,而svn st命令并没有认为它消失,svn up命令也无法下载回来: 从另一个地方拷贝过来一个c,svn ...

  8. nginx实现MySQL负载均衡

    默认Nginx只支持http的反向代理,要想nginx支持tcp的反向代理,还需要在编译时增加tcp代理模块支持,即nginx_tcp_proxy_module 下面操作步骤只让nginx支持tcp_ ...

  9. 今日总结(linux和plsql)

    #case ...when语句(根据字段不同值显示不同结果) ##1)case ...when语句的使用方法一: 语法格式: case column_name when value1 then res ...

  10. Servlet向JSP过渡

    表格中添加删除链接删除相关数据,在servlet这里用的是纯java代码,在纯java代码里面的输出里面添加类似前端拼接的东西.(删除链接,并根据id来删除相应数据)这里使用的纯servlet. 在o ...