Spring Cloud 断路器 Hystrix
断路器
断路器就像电路中的断路器一样,当短路发生时,它第一时刻熔断,切断了故障电路,保护其他用电单元。
在分布式架构中,断路器的作用类似,当某个服务单元发生了故障,通过断路器的故障监控,直接切断原来的主逻辑调用,强迫以后的多个服务调用不再访问远程服务器,防止应用程序继续执行或等待超时。熔断器也可以监控服务单元的错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。
在微服务架构中,系统被拆分成了一个个小的服务单元,各自运行在自己的线程中,各单元之间通过注册与订阅的方式互相远程调用,此时若网络故障或是某一服务挂掉则会出现调用延迟,进一步导致调用方的对外服务也出现延迟,如果调用方的请求不断增加,服务单元线程资源无法释放,队列装满,最终导致故障的蔓延,故断路器就是解决这种问题的。
Hystrix是Spring Cloud中实现此功能的单元,他有如下保护机制:
1.服务降级
对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值. fallback方法的返回值一般是设置的默认值或者来自缓存.
2.断路器
当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN). 这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). 即有自我检测并恢复的能力.
3.资源隔离
在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池. 例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池. 这样做的主要优点是运行环境被隔离开了. 这样就算调用服务的代码存在bug或者由于其他原因导致自己所在线程池被耗尽时, 不会对系统的其他服务造成影响. 但是带来的代价就是维护多个线程池会对系统带来额外的性能开销. 如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源.
下面做一个简单的演示
1.增加一个服务调用方,先引入Ribbon,不引入Feign。
2.增加依赖spring-cloud-starter-hystrix , 如果已经引入了Feign,则不需要了,因为Feign依赖了spring-cloud-starter-hystrix
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
---
3.在主类主增加注解@EnableCircuitBreaker或@EnableHystrix
复制代码
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients //开启feign
@EnableHystrix
public class App
{
@Bean
@LoadBalanced //开启ribbon
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
复制代码
---
4.增加服务类
复制代码
@Service
public class HystrixService {
@Autowired
RestTemplate restTemplate;
/**
* 拼接方式: http://服务名/接口名 (未指定ip和端口)
*/
@HystrixCommand(fallbackMethod = "fallback")
public String consumer() {
return restTemplate.getForObject("http://client/info", String.class);
}
public String fallback() {
return "fallback method return , invoke failed";
}
}
复制代码
---通过@HystrixCommand指定fallback方法
5.增加controller类
复制代码
@RestController
public class RibbonController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/ribbon")
public String nohy() {
return restTemplate.getForObject("http://client/info", String.class);
}
@Autowired
HystrixService ser;
@GetMapping("/ribbonhy")
public String hy() {
return ser.consumer();
}
}
复制代码
---nohy方法直接调用服务,无断路保护,hy方法有断路保护
6.依次启动 Eureka > client > consumer
首先分别访问 http://localhost:8081/ribbon 和 http://localhost:8081/ribbonhy 都可以正确调用,说明断路器不影响正常的服务。
其次在client中打断点模拟延迟和故障,再访问 http://localhost:8081/ribbon 和 http://localhost:8081/ribbonhy 对比效果:
没有断路保护的/ribbon页面一直在加载,而又断路保护的/ribbonhy则立即返回我们指定的错误信息,说明断路器已正常工作。
启用Feign的项目如何配置断路器:
1.修改接口如下:
复制代码
@FeignClient(name="client", fallback = FeignService.class)
public interface FeignInterface {
@GetMapping("/info")
String consumer();
}
复制代码
--- FeignClient注解中name指定调用服务的名称,fallback指定回调函数所在的类
2.增加类FeignService
复制代码
@Component
public class FeignService implements FeignInterface{
@Override
public String consumer() {
return "fallback method return , invoke failed";
}
}
复制代码
---
3.增加控制类
复制代码
@RestController
public class FeignController {
@Autowired
FeignInterface feign;
@GetMapping("/feign")
public String in() {
return feign.consumer();
}
}
复制代码
---
4. 访问 http://localhost:8081/feign,效果同上
参考http://projects.spring.io/spring-cloud/spring-cloud.html
end
注:本文为个人学习笔记,代码仅为记录学习过程
分享到:
相关推荐
总的来说,将图片批量转换成PDF是一项实用的技能,尤其适用于需要整理大量图片资料的场合。通过使用合适的批处理工具,我们可以轻松地完成这项工作,提高效率,同时也为文件管理和分享提供了便利。在进行转换时,...
在文件管理方面,PDFReader允许用户组织和整理PDF文件。它可以创建、管理和重命名文件夹,将相关的PDF文档归类存放,提高工作效率。同时,它还支持搜索功能,帮助用户快速找到存储在电脑中的特定PDF文件。 总而言之...
1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担 2. 部分字体及插图等来自网络,若是侵权请联系删除,本人不对所涉及的版权问题或内容负法律责任。收取的费用仅用于整理和收集资料耗费时间的...
总体来看,前端开源库的整理可以极大地提高前端开发的效率和质量,让开发者能够站在巨人的肩膀上进行开发,同时也促进了前端技术的交流和创新。对于想要了解和使用这些开源库的开发者而言,了解它们的用途、特点、...
根据提供的标题“中文版SketchUp 8.0技术大全 pdf”和描述“中文版SketchUp 8.0技术大全 pdf”,我们可以推断出这是一本关于SketchUp 8.0软件的技术指南书籍。SketchUp是一款非常受欢迎的3D建模软件,被广泛应用于...
在技术应用方面,鸡精复合调味料的鲜味研究包括味精和肉鲜味的结合、蔬菜鲜味和肉鲜味的结合,以及不同肉类粉末之间的复配等。 在口味的创新上,鸡精不仅仅是味精和鸡肉粉的简单组合,通过合理搭配各种肉类和蔬菜...
在此感谢各位嘉宾以及支持和关注我们的puber,现将PPT整理上传,欢迎欢迎有兴趣的puber前来下载: 2013 Oracle技术嘉年:MySQL压力测试经验_叶金荣.pdf 2013 Oracle技术嘉年:Oracle Database 12c 数据库云的最大高...
4. **页面管理**:可以轻松插入、删除、旋转或重新排序PDF页面,以满足文档整理的需求。 5. **安全性设置**:用户可以设置密码保护PDF,防止未经授权的访问或修改,确保文档安全。 6. **导出与打印**:完成编辑后...
"电子商务复习整理" 电子商务是指利用 Internet 和 WWW 进行商务交易,在机构以及个人间进行数字化的商务交易。在电子商务中,WWW 是 Internet 上最受欢迎的服务。电子商务不可缺少的技术包括客户/服务计算。 电子...
在现行的组织系统中,电子书作为一种环保的信息传递媒介,因其便携性、可重复使用和多样化的特点而受到广泛欢迎。然而,系统存在的主要问题是缺乏有效的图书分类和检索机制,导致用户难以找到之前阅读过的书籍。为...
以下是对"修改的图书管理系统整理.pdf"中涉及的知识点的详细说明: **第一章 绪论** 1.1 **背景和意义**:图书管理系统对于现代图书馆来说至关重要,随着信息技术的发展,传统的人工管理方式已无法满足大量图书信息...
Midjourney 的关键词整理涵盖了广泛的艺术、设计和视觉表达领域,包括传统与现代的各种风格和技术。以下是这些关键词的详细说明: 1. **中国传统水墨画**(Tradition Chinese Ink Painting):这种东方山水画以墨色...
- **PDF表单**:PDF文档因其跨平台兼容性和高度定制化的表单功能而受到广泛欢迎。通过使用Adobe Acrobat等工具可以轻松创建包含多种输入字段的表单。 - **JSP(Java Server Pages)**:这是一种基于Java的技术,用于...
Kubernetes是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg的开源版本,也是CNCF最重要的项目之一,主要功能包括: 基于容器的应用部署、维护和滚动升级 负载均衡和服务发现 跨机器和跨地区的...
PDF打印机是一种特殊的虚拟打印机,它并不像传统的物理打印机那样将文档打印在纸上,而是通过“打印”过程将各种类型的文档转换成PDF(Portable Document Format)格式。PDF格式因其跨平台兼容性、文件尺寸优化和...
ARM7TDMI体系架构是ARM公司推出的一种32位微处理器架构,主要应用于嵌入式系统,以其高效能和低功耗的特点广受欢迎。本文将详细介绍该架构的关键特性。 1. **指令流水线** ARM7TDMI-S处理器采用3级流水线技术,...
书中内容是由***的会员7liesofmlm整理翻译,翻译工作得到了扑克王博客和dzpkvip论坛资深会员的协助。翻译者自述翻译水平有限,对于原著中的翻译差异,欢迎读者进行讨论和指正。此外,翻译者特别感谢生命中对他影响...
在Android平台上开发一款中国象棋应用,涉及到的关键技术主要包括用户界面(UI)的设计、多媒体处理、消息传递以及视图的切换等。以下是对`ChessActivity`类中主要代码段的详细解读: 1. **Activity与生命周期**: ...
收集 整理 打包 一本讲交换的好书!如果你对交换不是很清楚,那么这就是你的宝典。本人在资源库里没有找到,所以在其他网站找了之后打包与各位分享。希望对你有所帮助,同时也欢迎各位与我交流cisco技术包含ccnp ,...