代码仓库:https:///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 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 { Future 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 Observable //订阅一个观察者来观察执行结果 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 Iterator while(iterator.hasNext()) { ads.add(iterator.next()); } System.out.println('最终的结果集:'+ads); } } |
|