【发布时间】:2018-05-27 17:53:42
【问题描述】:
我们已经将 Hazelcast 实现为我们的 Spring Boot 应用程序中的嵌入式缓存,并且需要一种方法使“集群组”中的 Hazelcast 成员可以动态发现彼此,这样我们就不必提供 Hazelcast 所在的可能 IP 地址/端口可能正在运行。
我们在 github 上遇到了这个 hazelcast 插件: https://github.com/hazelcast/hazelcast-eureka 似乎使用 Eureka 作为发现/注册工具提供了相同的功能。
正如这个 github 文档中提到的,hazelcast-eureka-one 库包含在我们的启动应用程序类路径中,我们还禁用了 TCP-IP 和多播发现,并在 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 boot 应用程序的 2 个实例,我们注意到每个应用程序都在启动嵌入在单独端口(5701、5702)上的 hazelcast 实例。但它似乎无法识别在集群中运行的彼此,这是我们在第二个实例启动时在应用程序日志中看到的:
Members [1] {
Member [10.41.70.143]:5702 - 7c42eb24-3fa0-45cb-9394-17175cc92b9c this
}
17-12-13 12:22:44.480 WARN [main] chiNode.log(LoggingServiceImpl.java:168) - [10.41.70.143]:5702 [domain-services] [3.8.2] 配置种子端口是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 库之间存在不兼容?
【问题讨论】:
-
请提供完整的会员日志。
-
这里是 hc member1 日志:1drv.ms/t/s!As1HHAnvqdAqaZ7UZEzAMX2OTfA 和 hc member2 日志:1drv.ms/t/s!As1HHAnvqdAqaje-HxkFBEw57n8
-
更新:似乎默认自动配置的“tomcat-embed-core”依赖项(w/8.0.36 版本)导致了这个异常。更改该依赖项版本后,我不再看到该异常。但是 hazelcast 仍然无法识别集群中运行的另一个实例。