springCloud Finchley 实战入门(基于springBoot 2.0.3)【五 Hystrix 服务容错保护】
服务容错保护
在微服务的架构中,存在着那么多单元服务,若一个单元出现故障,就很容易因依赖关系二引发故障的蔓延,最终导致整个系统的瘫痪。这样的架构相比较传统的架构更加不稳定。为了解决这个问题,产生了断路器等一系列的服务保护机制。
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服务时,因为此时服务已经挂了,所以我们会看到下面的响应:
过了几秒后,继续访问我们会发现请求总是负载到了8803的端口了,不会再去请求8802
接下来我们重新把8802的服务启动后,继续访问http://localhost:8901/listUsersByRibbon这时我们会发现请求接口又被一轮询的方式负载到8802和8803了
这样我们就实现了基础的分布式微服务的容错保护了。
github 项目源码
接下来我们会再研究一下,Hystrix框架针对单个应用实例和集群提供的监控功能。
springCloud Finchley 实战入门(基于springBoot 2.0.3)【五 Hystrix 服务容错保护】相关推荐
- springCloud Finchley 实战入门(基于springBoot 2.0.3)【六 Hystrix 仪表盘】
Hystrix仪表盘 通过上一篇我们已经成功的实现了spring cloud对Hystrix的整合了.除此之外,spring cloud还完美的整合了Hystrix的仪表盘组件Hystrix Dash ...
- springCloud Finchley 实战入门(基于springBoot 2.0.3)【三 Eureka-高可用服务注册中心】...
Eureka高可用注册中心 Eureka Server的设计一开始就考虑到了高可用的问题,在eureka服务治理设计中,所有的节点即是是服务提供方,也是服务消费方. 在部署高可用注册中心前我们先需要准 ...
- 项目实战4: 基于 SpringBoot 的超市账单管理系统
文章目录 一.项目介绍 二.数据库设计 三.概要设计 确立对象,划分模块 四.详细设计 4.1 Shiro 授权与鉴权流程梳理 4.1.1 了解 Shiro 4.1.2 Shiro 数据库设计 4.1 ...
- (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
springboot厨到家服务系统 摘 要 在社会快速发展的影响下,餐饮迅速发展,大大增加了餐饮服务信息管理的数量.多样性.质量等等的要求,使餐饮的管理和运营比过去十年更加困难.依照这一现实为基础, ...
- 白话SpringCloud | 第五章:服务容错保护(Hystrix)
前言 前一章节,我们知道了如何利用RestTemplate+Ribbon和Feign的方式进行服务的调用.在微服务架构中,一个服务可能会调用很多的其他微服务应用,虽然做了多集群部署,但可能还会存在诸如 ...
- java断路器原理_spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护...
在微服务中,我们将系统拆分为很多个服务单元,各单元之间通过服务注册和订阅消费的方式进行相互依赖.但是如果有一些服务出现问题了会怎么样? 比如说有三个服务(ABC),A调用B,B调用C.由于网络延迟或C ...
- 基于springboot 2.0的项目种子
做这个种子的心路历程 最近在做一个大型的J2EE项目,后端语言选择了Java,理所当然的选择了SpringBoot,使用SpringBoot来做restful风格的api开发很是方便,Spring下面 ...
- 不错!基于Springboot 2.0 + LayUI开发的物流管理系统(已开源)
缺物流管理系统项目经验的,推荐看看这个项目. 项目需求说明 首先,发货客户与快递公司签订货运合同(货运单),把货物交给快递公司来托运,并按照货运合同的付款方式付款.快递公司根据货物运输线路,为货物配车 ...
- 基于Springboot + Vue2.0开发的 IM 在线聊天
1. 项目介绍 多聊Chat是一个网页版在线即时聊天项目,前端使用 Element-ui,后端采用了基于 Springboot开发的,并使用 WebSocket 服务进行消息实时推送. 目前后端 We ...
- 基于SpringBoot 2.0正式版的SpringCloud的微服务实战项目搭建
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...
最新文章
- Windows7/10上配置OpenCV3.3.0-Python3.6.2操作步骤
- Linux yum 命令详解 源配置
- 无电路板的微型电路制作
- 【Android 逆向】Frida 框架 ( Frida 框架使用环境 | Frida 框架作用 | Frida 框架模块 )
- muduo之Thread
- MAVEN版本依赖的原则及scope
- Python基础概念_2_基础概念
- day38 css的4种引入方式
- linux 信号没有被处理方法,[计算机]Linux 信号signal处理机制.doc
- 少年开始学习c#编程,过路的大神请担待!
- 艾伟:C# Design Patterns (1) - Factory Method
- php域名墙检测,php 网站域名被墙判断请求方法
- lisp用entmake生产圆柱体_铝型材挤压生产金属流动与模具分析
- [转]JavaScript继承详解
- 【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)
- JS—触摸事件、手势事件
- 下载并安装IDA Pro 7.0
- win7计算机桌面文件位置更改,Win7系统怎么更改桌面文件路径_win7修改桌面文件保存路径的方法...
- 数据库分页LIMIT
- Python打印二叉树的左视图、右视图
热门文章
- cnn初学者—从这入门_使用Tensorflow为初学者使用CNN进行简单图像分类
- interpretable_Interpretable-AI:监督学习可能失败的地方
- 文献管理:文献管理软件Mendeley的基本使用和导出参考文献方法
- 《oracle大型数据库系统在AIX/unix上的实战详解》讨论45 显示某个登录用户的信息...
- 六度空间的应用——找出两个陌生人之间的关系(二)
- Hadoop AWS Word Count 样例
- 2017-5-26 正则表达式,js实战(加减数量,全选)
- 使用Water-Scrum-Fall交付软件
- Install R language on Linux RHEL5 or RHEL6
- 利用oracle long类型字段,插入大文本