我正在评估Netflix Hystrix作为对我当前正在从事的项目的改进,该项目是基于Java OSGi的项目(我将Apache felix作为OSGi运行时使用)。 到目前为止,我能够:
将hystrix内核注入一个现有的捆绑软件中,该捆绑软件充当与外部系统的连接器,并使用HystrixCommand包装其服务之一。一切都按预期工作,我可以看到hystrix逻辑工作。同样在DEBUG日志的帮助下,我检查了所有文件是否都已正确注册(com.netflix.hystrix = DEBUG)。
创建一个新捆绑包,该捆绑包负责注册hystrix.stream servlet。基本上,我检索了来自OSGi运行时的HttpService(org.osgi.service.http.HttpService),并在其上注册了servlet。一切似乎都很好,servlet已正确注册,并在$ {myEndpoint} /hystrix.stream中可见。这样:
httpService.registerServlet(“ / hystrix.stream/*”,新的HystrixMetricsStreamServlet(),null,myHttpCtx);
问题是我看不到流中推送的 data 对象。即使 ping 更新是可见的,即使同时我通过Jmeter / Postman测试强调HistryxCommand扭曲服务也是如此。 鉴于我没有注意到错误,因此我正在考虑发布者和读者逻辑使用不同的流。有人可以帮助我了解Hystrix的更多内部知识并解决我的情况吗?我尝试查看Hystrix的来源,但老实说这暂时没有帮助。
我正在使用的依赖项以下
<dependencies>
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.12</version>
</dependency>
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-metrics-event-stream</artifactId>
<version>1.5.12</version>
</dependency>
</dependencies>
谢谢
答案 0 :(得分:0)
我发现从相同 OSGi捆绑包实例化 HystrixCommand 类和 HystrixMetricsStreamServlet 可以解决我的问题。
所以我想这个问题是由以下原因引起的:
看看Hystrix源代码,这是我对内部过程的理解:
HystrixCommandMetrics单例被AsbtractCommand类用于推送事件指标。 HystrixMetricsStreamServlet也引用HystrixCommandMetrics单例(通过HystrixDashboardStream类)以读取相同的事件指标。 因此,如果HystrixMetricsStreamServlet和AbstractCommand不共享相同的类加载器,则它们将从不同的对象读取和推送。
由于我计划使用Hystrix来包装不同的系统,因此要在不同的OSGi捆绑包中,到目前为止,我发现一个干净的解决方案是将所有必需的Hystrix库打包在一个com.mycompany.osgi.hystrix中,并在OSGi运行时作为独立插件。