服务的隔离、降级和熔断
【尚学堂】Java300集零基础适合初学者视频教程_Java300集零基础教程_Java初学入门视频基础巩固教程_Java语言入门到精通_哔哩哔哩_bilibili
1.服务隔离、降级和熔断的产生背景
tomcat底层都会共享一个线程池(自己创建的例外),当某个方法(服务)访问非常慢造成响应延迟,会造成大多数线程阻塞,导致整个线程池被占用甚至拖垮。
线程名定义:线程池名称+线程ID
2.服务隔离解决思路
2.1 线程池隔离
不同的http服务使用不同的线程池,当自己的资源用完,直接返回失败而不是占用别人的资源
优点:可提高并发性
缺点:增加CPU调度开销
使用场景:第三方应用或接口;并发量大
2.2 信号量隔离
原子计数器方式记录当前运行的线程数,超过则拒绝,不超过则+1,返回则-1
使用场景:内部应用或中间件;并发需求不大
区别:信号量可动态调整,但线程池不可以调整
3.服务降级
当服务不可用(服务正在等待、链接超时、网络延迟、服务器响应慢等),客户端一直等待时,调用fallback方法给客户端返回一个错误提示,不让客户端继续等待。
目的:提高用户体验,防止雪崩效应。
4.服务熔断
熔断和保险丝一样,当访问请求过多的时候,达到一个阈值(自己设置)就直接拒绝访问,可以保护当前服务,让服务不会被挂掉,需要和服务降级一起使用。
<dependencies><dependency><groupId>com.netflix.hystrix</groupId><artifactId>hystrix-metrics-event-stream</artifactId><version>1.5.12</version></dependency><dependency><groupId>com.netflix.hystrix</groupId><artifactId>hystrix-javanica</artifactId><version>1.5.12</version></dependency>
</dependencies>public class OrderHystrixCommand extends HystrixCommand<JSONObject> {@Autowiredprivate MemberService memberService;public OrderHystrixCommand(MemberService memberService) {super(setter());this.memberService = memberService;}@Overrideprotected JSONObject run() throws Exception {JSONObject member = memberService.getMember();System.out.println("当前线程名称:" + Thread.currentThread().getName() + ",订单服务调用会员服务:member:" + member);return member;}/*** 使用线程池方式解决隔离* @return*/private static Setter setter() {// 服务分组HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("members");// 服务标识HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey("member");// 线程池名称HystrixThreadPoolKey threadPoolKey = HystrixThreadPoolKey.Factory.asKey("member-pool");// #####################################################// 线程池配置 线程池大小为10,线程存活时间15秒 队列等待的阈值为100,超过100执行拒绝策略HystrixThreadPoolProperties.Setter threadPoolProperties = HystrixThreadPoolProperties.Setter().withCoreSize(10).withKeepAliveTimeMinutes(15).withQueueSizeRejectionThreshold(100);// ########################################################// 命令属性配置Hystrix 开启超时HystrixCommandProperties.Setter commandProperties = HystrixCommandProperties.Setter()// 采用线程池方式实现服务隔离.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)// 禁止.withExecutionTimeoutEnabled(false);return HystrixCommand.Setter.withGroupKey(groupKey).andCommandKey(commandKey).andThreadPoolKey(threadPoolKey).andThreadPoolPropertiesDefaults(threadPoolProperties).andCommandPropertiesDefaults(commandProperties);}/*** 服务降级* @return*/@Overrideprotected JSONObject getFallback() {// 如果Hystrix发生熔断,当前服务不可用,直接执行Fallback方法System.out.println("系统错误!");JSONObject jsonObject = new JSONObject();jsonObject.put("code", 500);jsonObject.put("msg", "系统错误!");return jsonObject;}
}使用:
/*** 线程池方式解决* @return* @throws InterruptedException*/
@RequestMapping("/orderIndexHystrix")
public Object orderIndexHystrix() throws InterruptedException {return new OrderHystrixCommand(memberService).execute();
}
信号量方式 和线程池方式也就setter方法不一致,其他的均一致
/*** 使用信号量解决隔离* @return*/
private static Setter setter() {// 服务分组HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("members");// 命令属性配置 采用信号量模式HystrixCommandProperties.Setter commandProperties = HystrixCommandProperties.Setter().withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)// 使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,当请求进来时先判断计数// 器的数值,若超过设置的最大线程个数则拒绝该请求,若不超过则通行,这时候计数器+1,请求返 回成功后计数器-1。.withExecutionIsolationSemaphoreMaxConcurrentRequests(50);return HystrixCommand.Setter.withGroupKey(groupKey).andCommandPropertiesDefaults(commandProperties);
}
服务的隔离、降级和熔断相关推荐
- 谈谈服务雪崩、降级与熔断
点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 引言 首先,之所以谈这个话题呢,是发现现在很多人对微服务的设计缺乏认识,所以写一篇扫盲文.当然, ...
- 已尝试对扩展程序降级怎么解决_谈谈服务雪崩、降级、熔断
引言 首先,之所以谈这个话题呢,是发现现在很多人对微服务的设计缺乏认识,所以写一篇扫盲文.当然,考虑到目前大多微服务的文章都是口水文,烟哥争取将实现方式讲透,点清楚,让大家有所收获! OK,我要先说明 ...
- java服务降级与服务熔断区别_【原创】谈谈服务雪崩、降级与熔断
引言 首先,之所以谈这个话题呢,是发现现在很多人对微服务的设计缺乏认识,所以写一篇扫盲文.当然,考虑到目前大多微服务的文章都是口水文,烟哥争取将实现方式讲透,点清楚,让大家有所收获! OK,我要先说明 ...
- 【原创】谈谈服务雪崩、降级与熔断
引言 首先,之所以谈这个话题呢,是发现现在很多人对微服务的设计缺乏认识,所以写一篇扫盲文.当然,考虑到目前大多微服务的文章都是口水文,烟哥争取将实现方式讲透,点清楚,让大家有所收获! OK,我要先说明 ...
- 「微服务系列 13」熔断限流隔离降级
我们知道微服务分布式依赖关系错综复杂,比方说前端的请求转化为后端调用的服务请求,一个前端请求会转为成很多个后端调用的服务请求,那么这个时候后台的服务出现不稳定或者延迟,如果没有好的限流熔断措施,可能会 ...
- 白话:服务降级与熔断的区别
虽然之前在<Spring Cloud构建微服务架构>系列文章中介绍了Hystrix服务降级与Hystrix断路器的概念.但是,还是一直收到这样的提问:降级与熔断区别是什么?并且在很多交流过 ...
- 高并发之服务降级和服务熔断____服务降级、熔断、限流的区别
高并发之服务降级和服务熔断 服务降级: 服务压力剧增的时候根据当前的业务情况及流量对一些服务和页面有策略的降级,以此环节服务器的压力,以保证核心任务的进行. 同时保证部分甚至大部分任务客户能得到正确的 ...
- Hystrix服务降级、熔断-微服务(十)
服务降级 降级配置 @HystrixCommand 8001先从自身找问题 设置自身调用超时时间的峰值,峰值内可以正常运行, 超过了需要有兜底的方法处理,作服务降级fallback 8001fallb ...
- Hystrix断路器原理及实现(服务降级、熔断、限流)
Hystrix断路器原理及实现(服务降级.熔断.限流) 分布式系统面临的问题 Hystrix重要概念(面试常考) Hystrix案例 Hystrix 服务提供者 Hystrix 服务消费者 原因与解决 ...
最新文章
- Python assert断言函数及用法
- Android用观察者模式代替广播通知刷新界面
- SAP Customer Data Cloud(Gigya)的用户搜索实现
- 数据结构——双向链表的实现
- PureMVC在Unity游戏开发中的应用
- hdu2089不要62(数位dp)
- 【日常学习——论文写作】毕业论文的查重
- 机器学习--digits手写字体
- 【读书笔记】面试为什么总考算法_如何避开算法面试
- Windows开机自动运行.py文件
- 如何快速让网站发布的文章被百度收录
- linux网卡配置没生效,linux上网络配置不生效的解决办法
- 课程能力建设:提高五年制高职教学有效性的重要途径
- # 2021-01-13 #「FVWM」- 配置命令章节列表
- 目前住院病人主要由护士护理,这样做不仅需要大量护士,而且由于不能随时观察危重病人的病情变化,还会延误抢救时机。某医院打算开发一个以计算机为中心的患者监护系统,请用数据流图描述下面系统的业务流程。
- SAP ABAP SD 常用BAPI
- 高斯判别分析(GDA)Python代码
- uni-app微信公众号(5)——新增、修改地址
- knockout学习笔记
- 概要数据结构(Sketch)
热门文章
- 简述数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型
- BeautifulSoup里“find_all“和“findAll“的区别
- ftp远程登陆常用命令
- 公职人员财产公开_知道您的财产:Web设计人员/开发人员的薪资指南[比较]
- MinGW中的头文件路径
- 简单理解Hadoop(Hadoop是什么、如何工作)
- textarea文本框的placeholder文字换行
- WeChat Reader
- [体感游戏]关于体感游戏的一些思考(六)--- 飞行
- WPF编程--地图控件GMap使用