我们已经在Spring应用程序中将Hazelcast作为一个嵌入式缓存来实现,并且需要一种方式让“集群组”中的Hazelcast成员能够动态地发现彼此,这样我们就不必提供可能运行Hazelcast的IP地址/端口。
我们在github:https://github.com/hazelcast/hazelcast-eureka上看到了这个hazelcast插件,它似乎提供了与发现/注册工具相同的Eureka特性。
正如本github文档中所提到的,在引导应用类路径中包含了hazelcast-eureka-one库,我们还禁用了TCP和多播发现,并在hazelcast.xml中添加了以下发现策略:
<discovery-strategies>
<discovery-strategy class="com.hazelcast.eureka.one.EurekaOneDiscoveryStrategy" enabled="true">
<properties>
<property name="self-registration">true</property>
<property name="namespace">hazelcast</property>
</properties>
</discovery-strategy>
</discovery-strategies>
我们的应用程序还提供了配置好的EurekaClient,这就是我们要自动组装并注入到这个插件实现中的东西:
*
Config hazelcastConfig = new FileSystemXmlConfig(hazelcastConfigFilePath);
**EurekaOneDiscoveryStrategyFactory.setEurekaClient(eurekaClient);**
hazelcastInstance = Hazelcast.newHazelcastInstance(hazelcastConfig);
*
问题:我们能够在同一台机器上启动我们的spring引导应用程序的两个实例,我们注意到每个应用程序都启动了嵌入在单独端口上的hazelcast实例(5701,5702)。但是,在集群中运行的程序似乎并不相互识别,这就是我们在第二个实例启动时在应用程序日志中看到的情况:
Members [1] {
Member [10.41.70.143]:5702 - 7c42eb24-3fa0-45cb-9394-17175cc92b9c this
}
17-12-13 12:22:44.480警告主c.h.i.Node.log(LoggingServiceImpl.java:168) - 10.41.70.143:5702域-服务Config种子端口为5701,集群大小为1。
这似乎表明两个hazelcast实例都是独立运行的,并且不识别集群/组中其他正在运行的实例。
而且,在重新启动之后,我们立即看到这个异常频繁地抛出在两个节点上:
*
java.lang.ClassCastException: com.hazelcast.nio.tcp.MemberWriteHandler cannot be cast to com.hazelcast.nio.ascii.TextWriteHandler
at com.hazelcast.nio.ascii.TextReadHandler.<init>(TextReadHandler.java:109) ~[hazelcast-3.8.2.jar:3.8.2]
at com.hazelcast.nio.tcp.SocketReaderInitializerImpl.init(SocketReaderInitializerImpl.java:89) ~[hazelcast-3.8.2.jar:3.8.2]
*
哪一个似乎表明在类路径中的hazelcast库之间存在不兼容性?
发布于 2017-12-14 07:35:15
您的Eureka服务似乎返回了错误的端口。Hazelcast尝试连接到8080和其他在同一范围内的端口,而Hazelcast使用5701。不太清楚为什么会发生这种情况,但感觉好像您从Eureka请求错误的服务名称,最终返回了HTTP (Tomcat?!)端口,而不是应该注册的单独的Hazelcast服务。
https://stackoverflow.com/questions/47799846
复制相似问题