代码仓库: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);
}
}