我们已经在我们的Spring Boot应用程序中将Hazelcast实现为嵌入式缓存,并且需要一种方法来使用群集组中的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);
*
问题: 我们可以在同一台机器上启动我们的春季启动应用程序的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库之间存在不兼容性?
答案 0 :(得分:0)
好像您的Eureka服务返回了错误的端口。 Hazelcast尝试连接到相同范围内的8080和其他端口,而Hazelcast使用5701.不完全确定为什么会发生这种情况但感觉就像是从Eureka请求错误的服务名称而最终返回HTTP(Tomcat ?!)端口而不是应该注册的单独的Hazelcast服务。