服务容错保护

在微服务的架构中,存在着那么多单元服务,若一个单元出现故障,就很容易因依赖关系二引发故障的蔓延,最终导致整个系统的瘫痪。这样的架构相比较传统的架构更加不稳定。为了解决这个问题,产生了断路器等一系列的服务保护机制。
spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能。它也是基于Netflix的开源框架Hystrix实现的。,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延时和故障提供更加强大的容错能力。

快速入门

我们以之前的内容作为基础,针对"service-user-ribbon"进行配置。
在"service-user-ribbon"的pom.xml配置文件添加Hystrix依赖

<!--添加Hystrix依赖 断路器容错保护--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>

完整的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>eureka-bussniss-service-user-client-ribbon</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>eureka-bussniss-service-user-client-ribbon</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.RELEASE</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><!--添加Hystrix依赖 断路器容错保护--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

然后在主类EurekaBussnissServiceUserClientRibbonApplication中使用@EnableHystrix 注解以开启 Hystrix 特性

@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class EurekaBussnissServiceUserClientRibbonApplication {public static void main(String[] args) {SpringApplication.run(EurekaBussnissServiceUserClientRibbonApplication.class, args);}@Bean@LoadBalanced //开启客户端负载均衡RestTemplate restTemplate() {return new RestTemplate();}
}

接下来修改服务消费方式,在UserManagementRibbonClient类的接口方法:ListUsersByRibbon增加@HystrixCommand并且指定fallbackMethod名,再实现该方法。具体的代码如下:

/*** 使用 @HystrixCommand 注解的 fallbackMethod 指定失败方法,并实现该方法** @return*/@GetMapping("/listUsersByRibbon")@HystrixCommand(fallbackMethod = "listUsersByRibbonFallback")public String ListUsersByRibbon() {/*** hystrix 断路器的默认的超时时间为2000毫秒* 这里测试的在3000毫秒的随机出现的超时概率出发断路器 对应的代码逻辑见service-user项目的listUsers接口*/long start = System.currentTimeMillis();String result = this.restTemplate.getForObject("http://service-user/listUsers", String.class);long end = System.currentTimeMillis();log.info("Spend Time :"+(end-start));return result;}public String listUsersByRibbonFallback() {return "listUsersByRibbon异常,端口:" + port;}

配置完成重启项目,在8802和8803服务正常的情况下服务调用正常。
当我们把其中一个service-user服务停掉。例如:把8802停掉,只剩下8803服务,我们重新访问http://localhost:8901/listUsersByRibbon地址,当我们一开始访问到8802服务时,因为此时服务已经挂了,所以我们会看到下面的响应:

1532500404150.png

过了几秒后,继续访问我们会发现请求总是负载到了8803的端口了,不会再去请求8802

1532500486184.png

接下来我们重新把8802的服务启动后,继续访问http://localhost:8901/listUsersByRibbon这时我们会发现请求接口又被一轮询的方式负载到8802和8803了

1532500622445.png

1532500630124.png

这样我们就实现了基础的分布式微服务的容错保护了。
github 项目源码

接下来我们会再研究一下,Hystrix框架针对单个应用实例和集群提供的监控功能。

springCloud Finchley 实战入门(基于springBoot 2.0.3)【五 Hystrix 服务容错保护】相关推荐

  1. springCloud Finchley 实战入门(基于springBoot 2.0.3)【六 Hystrix 仪表盘】

    Hystrix仪表盘 通过上一篇我们已经成功的实现了spring cloud对Hystrix的整合了.除此之外,spring cloud还完美的整合了Hystrix的仪表盘组件Hystrix Dash ...

  2. springCloud Finchley 实战入门(基于springBoot 2.0.3)【三 Eureka-高可用服务注册中心】...

    Eureka高可用注册中心 Eureka Server的设计一开始就考虑到了高可用的问题,在eureka服务治理设计中,所有的节点即是是服务提供方,也是服务消费方. 在部署高可用注册中心前我们先需要准 ...

  3. 项目实战4: 基于 SpringBoot 的超市账单管理系统

    文章目录 一.项目介绍 二.数据库设计 三.概要设计 确立对象,划分模块 四.详细设计 4.1 Shiro 授权与鉴权流程梳理 4.1.1 了解 Shiro 4.1.2 Shiro 数据库设计 4.1 ...

  4. (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133

    springboot厨到家服务系统 摘  要 在社会快速发展的影响下,餐饮迅速发展,大大增加了餐饮服务信息管理的数量.多样性.质量等等的要求,使餐饮的管理和运营比过去十年更加困难.依照这一现实为基础, ...

  5. 白话SpringCloud | 第五章:服务容错保护(Hystrix)

    前言 前一章节,我们知道了如何利用RestTemplate+Ribbon和Feign的方式进行服务的调用.在微服务架构中,一个服务可能会调用很多的其他微服务应用,虽然做了多集群部署,但可能还会存在诸如 ...

  6. java断路器原理_spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护...

    在微服务中,我们将系统拆分为很多个服务单元,各单元之间通过服务注册和订阅消费的方式进行相互依赖.但是如果有一些服务出现问题了会怎么样? 比如说有三个服务(ABC),A调用B,B调用C.由于网络延迟或C ...

  7. 基于springboot 2.0的项目种子

    做这个种子的心路历程 最近在做一个大型的J2EE项目,后端语言选择了Java,理所当然的选择了SpringBoot,使用SpringBoot来做restful风格的api开发很是方便,Spring下面 ...

  8. 不错!基于Springboot 2.0 + LayUI开发的物流管理系统(已开源)

    缺物流管理系统项目经验的,推荐看看这个项目. 项目需求说明 首先,发货客户与快递公司签订货运合同(货运单),把货物交给快递公司来托运,并按照货运合同的付款方式付款.快递公司根据货物运输线路,为货物配车 ...

  9. 基于Springboot + Vue2.0开发的 IM 在线聊天

    1. 项目介绍 多聊Chat是一个网页版在线即时聊天项目,前端使用 Element-ui,后端采用了基于 Springboot开发的,并使用 WebSocket 服务进行消息实时推送. 目前后端 We ...

  10. 基于SpringBoot 2.0正式版的SpringCloud的微服务实战项目搭建

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...

最新文章

  1. Windows7/10上配置OpenCV3.3.0-Python3.6.2操作步骤
  2. Linux yum 命令详解 源配置
  3. 无电路板的微型电路制作
  4. 【Android 逆向】Frida 框架 ( Frida 框架使用环境 | Frida 框架作用 | Frida 框架模块 )
  5. muduo之Thread
  6. MAVEN版本依赖的原则及scope
  7. Python基础概念_2_基础概念
  8. day38 css的4种引入方式
  9. linux 信号没有被处理方法,[计算机]Linux 信号signal处理机制.doc
  10. 少年开始学习c#编程,过路的大神请担待!
  11. 艾伟:C# Design Patterns (1) - Factory Method
  12. php域名墙检测,php 网站域名被墙判断请求方法
  13. lisp用entmake生产圆柱体_铝型材挤压生产金属流动与模具分析
  14. [转]JavaScript继承详解
  15. 【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)
  16. JS—触摸事件、手势事件
  17. 下载并安装IDA Pro 7.0
  18. win7计算机桌面文件位置更改,Win7系统怎么更改桌面文件路径_win7修改桌面文件保存路径的方法...
  19. 数据库分页LIMIT
  20. Python打印二叉树的左视图、右视图

热门文章

  1. cnn初学者—从这入门_使用Tensorflow为初学者使用CNN进行简单图像分类
  2. interpretable_Interpretable-AI:监督学习可能失败的地方
  3. 文献管理:文献管理软件Mendeley的基本使用和导出参考文献方法
  4. 《oracle大型数据库系统在AIX/unix上的实战详解》讨论45 显示某个登录用户的信息...
  5. 六度空间的应用——找出两个陌生人之间的关系(二)
  6. Hadoop AWS Word Count 样例
  7. 2017-5-26 正则表达式,js实战(加减数量,全选)
  8. 使用Water-Scrum-Fall交付软件
  9. Install R language on Linux RHEL5 or RHEL6
  10. 利用oracle long类型字段,插入大文本