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

Posted

技术标签:

【中文标题】无法覆盖 Spring Boot 应用程序的 Hazelcast.yaml 中的属性【英文标题】:Cannot override properties in Hazelcast.yaml for Spring Boot Application 【发布时间】:2021-08-06 12:41:20 【问题描述】:

我有带有 Hazelcast 的 Spring Boot 应用程序(使用 4.2 并尝试使用 hazelcast-all 依赖项的 4.0.3)。 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 Boot 日志显示正在使用容器网络。

PS:

    如果使用 --net host 运行 docker,一切正常。 如果我在 Hazelcast.yaml 中为两个容器打包带有属性 public-address 的 Spring Boot 应用程序 - 一个包的值为 192.0.0.1,另一个包的值为 192.0.0.2,则一切正常。 Spring Boot Hazelcast 实例使用机器网络(192.0.0.1 和 192.0.0.2)相互看到。

问题:

我尝试使用以下方法覆盖 Hazelcast.yaml 中的属性 public-address

docker run -e HZ_NETWORK_PUBLICADDRESS=192.0.0.1 export HZ_NETWORK_PUBLICADDRESS=192.0.0.1 && docker run JAVA_OPTS="-Dhz.network.public-address=192.0.0.1" JAVA_OPTS="-Dhazelcast.local.publicAddress=192.0.0.1" JAVA_OPTS="-Dhazelcast.config=/mnt/overrided_hazelcast.yaml" ENV HZ_NETWORK_PUBLICADDRESS=192.0.0.1 - 在 Dockerfile 中 ENTRYPOINT java -jar -Dhz.network.public-address=192.0.0.1 my-app.jar

没有任何作用。有谁知道为什么不能在启动时覆盖 Hazelcast.yaml 中的属性public-address

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

【问题讨论】:

【参考方案1】:

您设置 Hazelcast 公共地址的方式是正确的,至少从添加了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     
]

【讨论】:

谢谢!我的错误是我没有尝试用 Hazelcast 4.1 以上版本覆盖属性

以上是关于无法覆盖 Spring Boot 应用程序的 Hazelcast.yaml 中的属性的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 覆盖默认的 REST 异常处理程序

Spring Boot 2.1 中的 DataSource bean 覆盖

Spring Boot 测试:无法实例化内部配置类

Spring Boot 自动配置覆盖自定义(elasticsearchTemplate)配置

我啥时候应该在 Spring Boot 应用程序中覆盖 Spring Security 的 configure(AuthenticationManagerBuilder auth)?

Spring Boot 2.1 bean 覆盖与 Primary