Netflix Hystrix指标在/hystrix.stream

时间:2018-12-20 09:48:12

标签: java osgi apache-felix hystrix

我正在评估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>

谢谢

1 个答案:

答案 0 :(得分:0)

我发现从相同 OSGi捆绑包实例化 HystrixCommand 类和 HystrixMetricsStreamServlet 可以解决我的问题。

所以我想这个问题是由以下原因引起的:

  • Hystrix内部类中单例的使用;
  • 在OSGi中,每个捆绑软件都有自己的类加载器with its pro and cons

看看Hystrix源代码,这是我对内部过程的理解:

HystrixCommandMetrics单例被AsbtractCommand类用于推送事件指标。 HystrixMetricsStreamServlet也引用HystrixCommandMetrics单例(通过HystrixDashboardStream类)以读取相同的事件指标。 因此,如果HystrixMetricsStreamServlet和AbstractCommand不共享相同的类加载器,则它们将从不同的对象读取和推送。

由于我计划使用Hystrix来包装不同的系统,因此要在不同的OSGi捆绑包中,到目前为止,我发现一个干净的解决方案是将所有必需的Hystrix库打包在一个com.mycompany.osgi.hystrix中,并在OSGi运行时作为独立插件。