概述
一、HystrixCommand的探讨
我们都知道hystrixCommand是用来隔离调用者和依赖服务的,但是hystrixCommand的使用有很多种,我们按照历史的发展轨迹,从原生的lib开始,教你如何使用hystrixCommand。hystrixCommand究竟是以一种怎么的形式存在呢?singleton或者是prototype?换句话说,也就是问hystrixCommand是有状态的bean还是无状态的bean?我也看过一些网上讲解hystrix的文章,我非常的失望,那些文章都是抄来抄去,不痛不痒,看那些文章简直是浪费时间。
1、简单的入门小例子程序--正常调用
第一步:明确我们的依赖服务UserService
第二步:针对依赖服务UserService的getUserNameByUserId写Command
第三步:调用逻辑
第四步:启动服务调用,会进入到command的run方法,页面显示调用成功
2、测试进入fallback
第一步:修改上面的UserService的getUserNameByUserId的实现,故意抛出异常
第二步:启动服务,访问程序
二、HystrixCommand这样使用的思考
1、为什么我们需要手动的new出command实例呢?可以将它交给Spring托管么?现在我们进行尝试。
第一步:将UserServiceGetUserNameByUserIdCommand托管到Spring。
第二步:调用逻辑
第三步:启动服务,第一次访问程序
正常的进入到command的run方法中,并且程序正常的返回。
第四步:第二次访问程序
我们发现controller对象和command对象都是刚才的对象,没有变,在整个应用程序中保持的是单例状态。
然后本次调用却进入了如下的异常:
java.lang.IllegalStateException: This instance can only be executed once. Please instantiate a new instance.
意思就是说,这个command的state是TERMINAL,中止状态,也就是说这个command曾经执行过了,不能再次执行了。从这里我们可以看出,hystrix中的command是有状态的,每次的调用应该是一个新的command实例。可见,hystrix的command是一个有状态的bean,交给spring托管的时候,应该设置将scope成prototype。其实在我们的这次尝试中,早就有一个问题了,因为在我们的这次尝试中,command是单例的,而这个command却持有一个有状态的属性userId,会造成线程安全问题的。
2、将command的scope设置成prototype,再次进行尝试。
第一步:将UserServiceGetUserNameByUserIdCommand托管到Spring,并将scope设置成prototype。
第二步:调用逻辑
第三步:启动服务,第一次访问程序
正常的进入到command的run方法中,并且程序正常的返回。
第四步:第二次访问程序
我们发现command的对象都没有变,还是之前的对象。我们不是设置了command的scope为prototype么?为什么还是没有变呢?因为我们的controller是singleton的,所以controller持有的属性是不会变的,即使这个属性托管给spring的时候scope设置的是prototype的。
所以我们的程序这次又抛出了如下的异常:
3、将command的scope设置成prototype,不要在controller中依赖注入command,通过程序applicationContext主动去获取。
第一步:修改调用逻辑。
第二步:启动服务,第一次访问程序。
正常的进入到command的run方法中,并且程序正常的返回。
第三步:第二次访问程序。
很明显,我们发现了command的hashcode变成6807,也就是说现在我们每次获取command都是一个新的对象。
正常的进入到command的run方法中,并且程序正常的返回。
到此,我们已经分析完了,要说明的一个事实就是,command是一个有状态的bean。
三、给UserService再增加一个方法
1、我们需要新增一个command。
通过以上,我们知道,如果UserSerivce增加一个方法,我们就要写一个command类。这种使用方式造成了我们程序员会大量的去写模板式的command。至于如何解决,请看我之后的博文。
源码已托管到: https://github.com/hystrix-in-action/hystrix-core-test
最后
以上就是呆萌雨为你收集整理的Hystrix源码解析--从原生的lib开始使用hystrix(一)一、HystrixCommand的探讨二、HystrixCommand这样使用的思考三、给UserService再增加一个方法的全部内容,希望文章能够帮你解决Hystrix源码解析--从原生的lib开始使用hystrix(一)一、HystrixCommand的探讨二、HystrixCommand这样使用的思考三、给UserService再增加一个方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复