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 的东西。更简单的解决方案。
目前正在使用 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 的东西。更简单的解决方案。