打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于hystrix的高并发&高可用服务架构基础实例(线程池隔离技术)

代码仓库https://gitee.com/jikeh/JiKeHCN-RELEASE.git

1、简介

1)wiki简介

https://github.com/Netflix/Hystrix/wiki

简而言之:

在分布式系统中,存在很多依赖服务,有的时候某些依赖服务出现故障也是很正常的,我们如何保证在某个依赖服务故障的时候,来保证系统能够整体正常运行呢?

使用hystrix,我们可以把其,当作一种类似于springboot,dubbo,mybatis的框架,使用了该框架,可以保证我们的系统服务高可用

Hystrix可以让我们在分布式系统中对服务进行一些控制:资源隔离、限流、熔断、降级、运维监控,通过这些方法帮助我们提升分布式系统的可用性和稳定性

这节,我们主要讲一下使用hystrix的线程池隔离技术来实现资源隔离的基础实例,下一节我们将抽取广告系统的某个功能来应用下该技术!!!

那什么是资源隔离?

资源隔离:让整个业务系统里,不会因某个依赖服务出现故障,而耗尽系统所有的资源,比如线程资源

2)官网介绍的简单使用

https://github.com/Netflix/Hystrix

简单看下,如果看不懂也没事,继续往下看,当然也可以看我上传的视频

2、基础功能

获取广告信息

这里,我们就是获取一个字符串来模拟获取广告信息:

private String getStr(String name){

return 'Hello ' + name + '!';

}

3、使用hystrix的线程池隔离技术改造上面的代码

1)处理单个请求

public class CommandHelloWorld extends HystrixCommand {

private final String name;

public CommandHelloWorld(String name) {

super(HystrixCommandGroupKey.Factory.asKey('GetAdsGroup'));

this.name = name;

}

@Override

protected String run() {

return 'Hello ' + name + '!';

}

}

2)处理批量请求

public class ObservableCommandHelloWorld extends HystrixObservableCommand {

private String[] adIds;

public ObservableCommandHelloWorld(String[] adIds) {

super(HystrixCommandGroupKey.Factory.asKey('GetAdsGroup'));

this.adIds = adIds;

}

@Override

protected Observable construct() {

return Observable.create(new Observable.OnSubscribe() {

public void call(Subscriber observer) {

try {

for(String adId : adIds) {

observer.onNext('Hello ' + adId + '!');

}

observer.onCompleted();

} catch (Exception e) {

observer.onError(e);

}

}

}).subscribeOn(Schedulers.io());

}

}

4、单元测试

1)测试单个请求

/**

* Hystrix基础实例1:单个请求

*/

public class UnitTestCommand {

//同步:

@Test

public void testSynchronous() {

String str = new CommandHelloWorld('World').execute();

System.out.println(str);

}

//异步:

@Test

public void testAsynchronous() throws Exception {

Future fWorld = new CommandHelloWorld('World').queue();

String str = fWorld.get();

System.out.println(str);

}

}

2)测试批量请求

/**

* Hystrix基础实例2:批量请求(基于观察者)

*/

public class UnitTestObservableCommand {

//异步:

@Test

public void testAsynchronous() throws Exception {

String adIds = '1,2,3';

//异步获取执行:

HystrixObservableCommand getAdInfosCommand = new ObservableCommandHelloWorld(adIds.split(','));

Observable observable = getAdInfosCommand.observe();

//订阅一个观察者来观察执行结果

observable.subscribe(new Observer() {

public void onCompleted() {

System.out.println('获取完了所有的广告数据');

}

public void onError(Throwable e) {

e.printStackTrace();

}

public void onNext(String adInfo) {

System.out.println(JSONObject.toJSONString(adInfo));

}

});

//同步获取执行结果:我们一次查询,肯定是返回结果集的组合

List ads = new ArrayList<>();

Iterator iterator = observable.toBlocking().getIterator();

while(iterator.hasNext()) {

ads.add(iterator.next());

}

System.out.println('最终的结果集:'+ads);

}

}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
分布式系统中的限流、降级、熔断技术解决方案
RxJava 和 RxAndroid 二(操作符的使用)
Hystrix 使用与分析
3分钟了解稳定性利器Hystrix——让你的服务更稳一点
Soul网关Hystrix插件相关知识点扫盲
Hystrix高可用系统容错框架,资源隔离,熔断,限流
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服