Docker swarm spring boot 和 eureka 服务发现不工作

Docker swarm springboot and eureka service discoverer not working

目前正在使用 eureka 服务发现器对我们的 Springboot 微服务后端进行集群化。第一个问题是确保服务发现者不会选择入口 IP 地址,而是选择来自覆盖网络的 IP 地址。经过一番搜索后,我发现 post 建议以下 Eureka 客户端配置:

@Configuration
@EnableConfigurationProperties
public class EurekaClientConfig {

    private ConfigurableEnvironment env;

    public EurekaClientConfig(final ConfigurableEnvironment env) {
        this.env = env;
    }

    @Bean
    @Primary
    public EurekaInstanceConfigBean eurekaInstanceConfigBean(final InetUtils inetUtils) throws IOException {
        final String hostName = System.getenv("HOSTNAME");
        String hostAddress = null;

        final Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netInt : Collections.list(networkInterfaces)) {
            for (InetAddress inetAddress : Collections.list(netInt.getInetAddresses())) {
                if (hostName.equals(inetAddress.getHostName())) {
                    hostAddress = inetAddress.getHostAddress();
                    System.out.printf("Inet used: %s", netInt.getName());
                }

                System.out.printf("Inet %s: %s / %s\n", netInt.getName(),  inetAddress.getHostName(), inetAddress.getHostAddress());
            }
        }
        if (hostAddress == null) {
            throw new UnknownHostException("Cannot find ip address for hostname: " + hostName);
        }

        final int nonSecurePort = Integer.valueOf(env.getProperty("server.port", env.getProperty("port", "8080")));

        final EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(inetUtils);
        instance.setHostname(hostName);
        instance.setIpAddress(hostAddress);
        instance.setNonSecurePort(nonSecurePort);
        System.out.println(instance);
        return instance;
    }
}

部署新发现器后,我得到了正确的结果,并且服务发现器具有正确的覆盖 IP 地址。

为了了解下一步这里是我们 运行 这个 docker 蜂拥而至的环境的一些信息。我们目前有 2 个液滴,一个用于开发,另一个用于生产。目前我们只在开发服务器上进行 Swarmify。生产几个月没动过。

下一步是部署一个发现客户端 Springboot 应用程序,该应用程序将连接到正确的服务发现器,并且还具有过度的 IP 地址而不是入口。但是当我构建应用程序时,它总是连接到 docker 群外的生产服务发现者,进入另一个液滴。我可以看到正在部署在 swarm 上的应用程序,但是从生产服务器查看 Eureka 仪表板我可以看到它连接到它。

第二个问题是应用程序也有你在上面看到的 EurekaClient 配置,但它被忽略了。启动应用程序时甚至不会调用方法中的日志。

这是发现客户端应用程序的配置:

eureka:
  client:
    serviceUrl:
      defaultZone: service-discovery_service:8761/eureka
    enabled: false
  instance:
    instance-id: ${spring.application.name}:${random.value}
    prefer-ip-address: true

spring:
  application:
    name: account-service

我假设您可以使用 defaultZone 指向正确的服务发现者,但我可能是错的。

只是不要使用 eureka 服务发现,而是使用其他类似 traefik 的东西。更简单的解决方案。