java断路器原理_spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护...
在微服务中,我们将系统拆分为很多个服务单元,各单元之间通过服务注册和订阅消费的方式进行相互依赖。但是如果有一些服务出现问题了会怎么样?
比如说有三个服务(ABC),A调用B,B调用C。由于网络延迟或C本身代码有问题导致B迟迟得不到回应,这样B调用C的请求就会被挂起,等待。
在高并发的访问的情况下,这些挂起的线程得不到释放,使后续的请求阻塞,最终导致B也挂掉了。依次类推,A可能也会挂掉,进而使整个系统全部崩溃。
为了解决整个问题,Spring Cloud 使用Hystrix进行服务容错保护,包括断路器、线程隔离等一系列的保护功能,今天我们就来看下如何通过Hystrix实现断路器。
一、什么是Spring Cloud Hystrix?什么是断路器?
Spring Cloud Hystrix是基于Netflix的开源框架Hystrix实现的,其目的是为了通过控制那些访问远程系统、服务和第三方的节点,从而对延迟和故障提供强大的容错能力。
断路器类似于我们家里面强电箱里面用到的漏电断路保护器,当服务单元出现故障(类似于电器发生短路),通过断路器的故障监控功能(类似于保险丝),向调用方返回一个错误响应,避免长时间等待,从而避免故障蔓延到整个系统。
二、没有断路器的情况下,页面展示
还记得我们前面写的spring cloud 入门系列二:使用Eureka 进行服务治理里面的三个服务(eureka/hello-service/hello-consumer)吗?我们基于这个进行实验。
启动eureka服务注册中心,端口号1111
启动hello-service服务提供者,这里我们启动两个服务,端口号分别为9090,9091
启动hello-consumer服务消费者,端口号为9999;这个时候我们多次访问http://localhost:9999/hello-consumer是没有问题的
将hello-service端口号为9091的服务关掉,再去多次访问http://localhost:9999/hello-consumer,报错了
PS:这里说明下,为什么要多次访问,是因为我们通过ribbon实现了负载均衡,访问http://localhost:9999/hello-consumer的时候,会轮询访问hello-service的两个服务,当访问到端口号是9091的服务时才报错,访问9090的服务就不会有问题。
三、断路器代码实现
接下来我们看下如何进行代码实现,我们不去修改服务注册中心和服务提供者,只需要修改服务消费者hello-consumer。
修改POM文件,引入Hystrix依赖
4.0.0
com.sam
hello-consumer
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
1.5.1.RELEASE
1.8
org.springframework.cloud
spring-cloud-dependencies
Camden.SR6
pom
import
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-ribbon
org.springframework.cloud
spring-cloud-starter-hystrix
修改启动类,追加注解@EnableCircuitBreaker,开启断路器
@EnableDiscoveryClient
@SpringBootApplication
@EnableCircuitBreakerpublic classConsumerApp {//@Bean 应用在方法上,用来将方法返回值设为为bean
@Bean
@LoadBalanced//@LoadBalanced实现负载均衡
publicRestTemplate restTemplate() {return newRestTemplate();
}public static voidmain(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
这个时候你会发现,这个启动类加了三个注解,这个是不是很麻烦?没关系,我们可以使用注解@SpringCloudApplication
@SpringCloudApplicationpublic classConsumerApp {//@Bean 应用在方法上,用来将方法返回值设为为bean
@Bean
@LoadBalanced//@LoadBalanced实现负载均衡
publicRestTemplate restTemplate() {return newRestTemplate();
}public static voidmain(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
@SpringCloudApplication = @EnableDiscoveryClient +@SpringBootApplication+@EnableCircuitBreaker,从源码就能看出来:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreakerpublic @interfaceSpringCloudApplication {
}
追加service
@Servicepublic classConsumerService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod= "errorMsg")publicString consumer() {//调用hello-service服务,注意这里用的是服务名,而不是具体的ip+port
restTemplate.getForObject("http://hello-service/hello", String.class);return "hello consumer finish !!!";
}publicString errorMsg() {return "error!!!";
}
}
我们把原来controller里面的调用RestTemplate的实现放到service里面,并且通过@HystrixCommand来指定回调方法,当出现错误时调用该方法。
修改controller
/***这里不再直接调用restTemplate,
*而是通过调用service进行实现
**/@RestControllerpublic classConsumerController {
@Autowired//RestTemplate restTemplate;
ConsumerService service;
@RequestMapping("/hello-consumer")publicString helloConsumer() {// //调用hello-service服务,注意这里用的是服务名,而不是具体的ip+port//restTemplate.getForObject("http://hello-service/hello", String.class);
return service.consumer();
}
}
测试,多次访问,当报错的时候,会显示如下内容
大功告成!
java断路器原理_spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护...相关推荐
- Spring Cloud Alibaba系列四:集成 seata 实现分布式事务
文章目录 Spring Cloud Alibaba系列四:集成 seata 实现分布式事务 前言 Seata 是什么? Seata 术语 安装 seata 1.创建 seata 数据库,并添加对应的表 ...
- java版电子商务spring cloud分布式微服务b2b2c社交电商:服务容错保护(Hystrix断路器)...
断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...
- 机器学习入门系列四(关键词:BP神经网络)
机器学习入门系列四(关键词:BP神经网络) 标签: 机器学习神经网络 2016-01-12 15:28 80人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: 机器学习(3) 作者同类文章X 版 ...
- springboot 拦截器_Spring Boot入门系列(十)如何使用拦截器,一学就会!
前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务,不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhon ...
- java https请求_Spring Cloud Sleuth:分布式请求链路跟踪
Spring Cloud Sleuth 是分布式系统中跟踪服务间调用的工具,它可以直观地展示出一次请求的调用过程,本文将对其用法进行详细介绍. Spring Cloud Sleuth 简介 随着我们的 ...
- Reflex WMS入门系列四十:对某个托盘执行上架,系统不能自动建议货架?
Reflex WMS入门系列四十:对某个托盘执行上架,系统不能自动建议货架? 如下图示,在Reflex WMS系统里,使用RF枪功能,对于某个托盘685110000000041602执行上架操作.Re ...
- spring cloud 入门系列六:使用Zuul 实现API网关服务
通过前面几次的分享,我们了解了微服务架构的几个核心设施,通过这些组件我们可以搭建简单的微服务架构系统.比如通过Spring Cloud Eureka搭建高可用的服务注册中心并实现服务的注册和发现: 通 ...
- Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)
断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时," ...
- Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)【Dalston版】
前言 在前两篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>和<Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)&g ...
最新文章
- LeetCode 426. 将二叉搜索树转化为排序的双向链表
- openstack运维实战系列(十七)之glance与ceph结合
- workaround for COM_ATTRFRG_GEN 066
- centos 7 安装golang遇到问题: No package golang available.
- gc java root_C#技术漫谈之垃圾回收机制(GC)
- 分布式文件系统MFS(moosefs)实现存储共享(一)
- MSP430学习笔记2---两个LED同时亮灭和顺闪
- VB6 mysql二进制读取,vb6关于VB以二进制(binary)方式读取文本内容
- asp.net控件全部清空、全部启用、全部禁用方法
- 华为2014 第三题地铁换乘 java实现
- 阿里云播放器的官方文档
- C语言算三角形外心坐标,三角形外心坐标公式(含C语言代码)
- 5道经典基础编程题让你入门C语言
- 综合船桥系统电子海图数据库设计研究
- HTML5 基础入门教程
- 支付宝扫码枪收银的实现原理你了解吗?
- RSA加密算法流程图
- STM32F103C8T6最小系统板原理图+PCB文件
- 线行代数的本质-通俗易懂的讲解
- 社交产品盈利方式产品模式设计案例
热门文章
- IP/tzgm.php,龙之异界手游私服双端APP+本地更新+Gm授权+附视频教程
- Python 计算思维训练——字典与字符串练习(二)
- 笔记 | 绝对值不等式
- 新的vue项目-qq音乐网页版
- 【测试】Charles抓包
- 数据全量、增量、比较更新
- 租户隔离怎么做MYSQL_基于JPA实现SaaS多租户模式的数据存储——共享数据库,隔离数据架构...
- 第十五章:国际化和本地化-gettext:消息编目-转换工作流概述
- ios播放视频demo
- VUE 前端PDF分页预览、下载