Hystrix源码解析--从原生的lib开始使用hystrix(一)

一、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

猜你喜欢

转载自blog.csdn.net/pfnie/article/details/82528259