无法为 Spring 引导应用程序覆盖 Hazelcast.yaml 中的属性

Cannot override properties in Hazelcast.yaml for Spring Boot Application

我有 Spring 带有 Hazelcast 的启动应用程序(使用 4.2 并尝试使用 4.0.3 的 hazelcast-all 依赖项)。 Hazelcast 是为嵌入式拓扑配置的。我使用 TCP-IP 网络连接方式。 Hazelcast 的属性使用文件 Hazelcast.yaml 和 Spring 设置 Boot 属性: spring.hazelcast.config (Spring 默认使用这个Hazelcast 配置的名称,它是多余的)。

在属性 member-list中我指出了一个子网中两台机器的IP地址(例如192.0.0.1和192.0.0.2)。

我在 Docker 中使用基于 OpenJdk 上的 Alpine 的图像构建应用程序。图像包括启动 java -jar 命令作为 ENTRYPOINT

问题前提:

我运行两个docker容器在前面描述的两台机器上。我只在两个容器上转发端口 5701(使用 -p)。容器之间看不到对方。 Spring 启动日志显示正在使用容器网络。

PS:

  1. 如果 运行 docker 和 --net host.
  2. 所有工作
  3. 如果我将 Spring 引导应用程序与 属性 public-address 打包到两个容器的 Hazelcast.yaml 中,也所有工作 - 一次打包值为 192.0.0.1,另一个打包值 192.0.0.2。 Spring 启动 Hazelcast 实例使用机器网络(192.0.0.1 和 192.0.0.2)相互查看。

问题:

我尝试在 Hazelcast.yaml 中覆盖 属性 public-address 使用:

没有任何效果。有谁知道为什么无法在启动时覆盖 Hazelcast.yaml 中的 属性 public-address

或者也许有人知道我如何 运行 两个 Spring 在不同机器上的单独 Docker 容器中启动带有嵌入式 Hazelcast 的应用程序。

您设置 Hazelcast public 地址的方式是正确的,至少从添加了 Config Override 功能的 Hazelcast 4.1 开始是这样。

要查看工作版本,您可以查看Hazelcast Guide: Embedded Hazelcast on Kubernetes。您可以使用 TCP-IP 代替 Hazelcast Kubernetes 配置。以下 Hazelcast 配置对我有用(我的主机 IP 是 172.22.41.210)。

hazelcast:
  cluster-name: hazelcast-cluster
  network:
    join:
      tcp-ip:
        enabled: true
        member-list:
          - 172.22.41.210:5701
          - 172.22.41.210:5702

然后,构建和启动两个应用程序应该形成一个集群。

$ mvn package && docker build -t hazelcast-embedded .
$ docker run --rm -e HZ_NETWORK_PUBLICADDRESS=172.22.41.210 -p 5701:5701 hazelcast-embedded
$ docker run --rm -e HZ_NETWORK_PUBLICADDRESS=172.22.41.210:5702 -p 5702:5701 hazelcast-embedded

您应该会在应用程序日志中看到集群已形成。

Members {size:2, ver:2} [
        Member [172.22.41.210]:5701 - 21af9e1a-7e98-4305-905c-451ee23486c3 this        
        Member [172.22.41.210]:5702 - 0507d970-1f31-4df3-9ea5-8c3981eb7c98     
]