hystrix 源码 线程池隔离_基于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 Observableconstruct() {

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

public void call(Subscriber super="" string=""?> 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 {

FuturefWorld = 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';

//异步获取执行:

HystrixObservableCommandgetAdInfosCommand = new ObservableCommandHelloWorld(adIds.split(','));

Observableobservable = 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));

}

});

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

Listads = new ArrayList<>();

Iteratoriterator = observable.toBlocking().getIterator();

while(iterator.hasNext()) {

ads.add(iterator.next());

}

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值