高可用服务架构设计(8) - 基于hystrix的线程池隔离技术进行商品服务接口的资源隔离
发布日期:2021-06-30 12:35:48
浏览次数:2
分类:技术文章
本文共 3175 字,大约阅读时间需要 10 分钟。
1 pom.xml
com.netflix.hystrix hystrix-core 1.5.12
2 将商品服务接口调用的逻辑进行封装
hystrix进行资源隔离,其实是提供了一个抽象,叫做command
即你如果要把对某一个依赖服务的所有调用请求,全部隔离在同一份资源池内- 资源隔离 对这个依赖服务的所有调用请求,全部走这个资源池内的资源,不会去用其他的资源
hystrix最基本的资源隔离的技术 — 线程池隔离技术
对某一个依赖服务,商品服务,所有的调用请求,全部隔离到一个线程池内,对商品服务的每次调用请求都封装在一个command里面
每个command(服务调用请求)都是使用线程池内的一个线程去执行的 所以哪怕是对这个依赖服务,商品服务,现在同时发起的调用量已经到了1000了,但线程池内就10个线程,最多就只会用这10个线程去执行,不会说,对商品服务的请求,因为接口调用延迟,将tomcat内部所有的线程资源全部耗尽public class CommandHelloWorld extends HystrixCommand{ private final String name; public CommandHelloWorld(String name) { super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup")); this.name = name; } @Override protected String run() { return "Hello " + name + "!"; }}
不让超出这个量的请求去执行了,保护说,不要因为某一个依赖服务的故障,导致耗尽了缓存服务中的所有的线程资源去执行
3 开发一个支持批量商品变更的接口
- HystrixCommand 获取一条数据
- HystrixObservableCommand:是设计用来获取多条数据的
public class ObservableCommandHelloWorld extends HystrixObservableCommand{ private final String name; public ObservableCommandHelloWorld(String name) { super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup")); this.name = name; } @Override protected Observable construct() { return Observable.create(new Observable.OnSubscribe () { @Override public void call(Subscriber observer) { try { if (!observer.isUnsubscribed()) { observer.onNext("Hello " + name + "!"); observer.onNext("Hi " + name + "!"); observer.onCompleted(); } } catch (Exception e) { observer.onError(e); } } } ).subscribeOn(Schedulers.io()); }}
4 command的调用方式
4.1 同步
new CommandHelloWorld("World").execute(),new ObservableCommandHelloWorld("World").toBlocking().toFuture().get()
如果你认为observable command只会返回一条数据,那么可以调用上面的模式,去同步执行,返回一条数据
4.2 异步
new CommandHelloWorld("World").queue(),new ObservableCommandHelloWorld("World").toBlocking().toFuture()
对command调用queue(),仅仅将command放入线程池的一个等待队列,就立即返回,拿到一个Future对象,后面可以做一些其他的事情,然后过一段时间对future调用get()方法获取数据
// observe():hot,已经执行过了// toObservable(): cold,还没执行过ObservablefWorld = new CommandHelloWorld("World").observe();assertEquals("Hello World!", fWorld.toBlocking().single());fWorld.subscribe(new Observer () { @Override public void onCompleted() { } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onNext(String v) { System.out.println("onNext: " + v); }});Observable fWorld = new ObservableCommandHelloWorld("World").toObservable();assertEquals("Hello World!", fWorld.toBlocking().single());fWorld.subscribe(new Observer () { @Override public void onCompleted() { } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onNext(String v) { System.out.println("onNext: " + v); }});
5 如何解决刚才的问题
资源隔离后的效果
- 资源隔离生效的讲解
转载地址:https://javaedge.blog.csdn.net/article/details/95900748 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月06日 04时41分03秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
libuv使用不当导致的内存泄漏
2019-04-30
libuv实现ping包发送和接收
2019-04-30
基础架构系列篇-CENTOS7安装NGINX
2019-04-30
基础架构系列篇-系统centos7安装docker+COMPOSE
2019-04-30
基础架构系列篇-系统centos7中docker安装rabbitmq
2019-04-30
基础架构系列篇-NGINX部署VUE
2019-04-30
个人电商项目,基于uni-app+ springcloud +VUE技术
2019-04-30
基础架构系列篇-系统centos7安装kafka
2019-04-30
基础架构系列篇-系统centos7中docker安装分布式文件存储服务minio
2019-04-30
知识点记录-java判断系统是linux或windows
2019-04-30
知识点记录-springboot静态资源映射路径
2019-04-30
知识点记录-vue-cli+webpack打包运行图标显示异常
2019-04-30
知识点记录-springboot2.1集成rabbitmq
2019-04-30
微服务springcloud2系列篇-配置与注册nacos组件
2019-04-30
数据库系列篇mysql8-分库分表中间件mycat(WINDOWS环境)
2019-04-30
用户权限设计-基于RBAC模型
2019-04-30
微服务springcloud2系列篇-网关GATEWAY跨域问题
2019-04-30