野蛮群体领事服务发现 – 服务地址无效

我正在开发Wildfly Swarm应用程序,我想用Consul作为我的服务发现。 所以我添加了拓扑 – @Advertise("service-name")分数,在我的端点中设置了我的Consulpath到project-defaults.yml并添加了@Advertise("service-name")

如果我开始使用我的应用程序

 java –jar my-swarm-app.jar 

一切正常。

我的项目defaults.yml:

 service: catalog: service-name: "service-name" swarm: port: offset: 501 consul: url: "http://172.30.3.80:8500" 

但是,当我用这个Dockerfile将我的胖jar包装到Docker镜像中时:

 FROM openjdk:8-jre-alpine ADD my-swarm-app.jar /opt/my-swarm-app.jar EXPOSE 8581 ENTRYPOINT ["java", "-jar", "-Djava.net.preferIPv4Stack=true", "/opt/my-swarm-app.jar"] 

build立它:

 docker build -f Dockerfile -t my-swarm-app . 

像这样运行:

 docker run -p 8581:8581 my-swarm-app 

我得到以下exception:

 2017-09-26 15:17:54,240 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC000001: Failed to start service swarm.topology.register.consent-service.http: org.jboss.msc.service.StartException in service swarm.topology.register.consent-service.http: com.orbitz.consul.ConsulException: Invalid service address at org.wildfly.swarm.topology.deployment.RegistrationAdvertiser.start(RegistrationAdvertiser.java:79) at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: com.orbitz.consul.ConsulException: Invalid service address at com.orbitz.consul.AgentClient.register(AgentClient.java:180) at com.orbitz.consul.AgentClient.register(AgentClient.java:184) at org.wildfly.swarm.topology.consul.runtime.Advertiser.advertise(Advertiser.java:65) at org.wildfly.swarm.topology.consul.runtime.ConsulTopologyConnector.advertise(ConsulTopologyConnector.java:60) at org.wildfly.swarm.topology.deployment.RegistrationAdvertiser.start(RegistrationAdvertiser.java:77) ... 5 more 

难道我做错了什么?

编辑:我已经尝试使用consul-api自我实现服务发现。

  <dependency> <groupId>com.ecwid.consul</groupId> <artifactId>consul-api</artifactId> <version>1.2.4</version> </dependency> 

像这样:

 @ApplicationScoped public class Config { private ConsulClient client; @Inject @ConfigurationValue("swarm.http.port") private Integer port; public void init(@Observes @Initialized(ApplicationScoped.class) ServletContext context) { client = new ConsulClient("http://172.30.3.80:8500"); // register new service with associated health check NewService newService = new NewService(); newService.setId("myapp_02"); newService.setTags(Collections.singletonList("EU-East")); newService.setName("myapp_aaa"); newService.setPort(port); client.agentServiceRegister(newService); } } 

它在Docker镜像中工作。 这可能是Wildfly-Swarm拓扑部分中的一个错误,或者我缺less一些configuration?

编辑2:我发现这个问题是与蜻蜓群参数-Djava.net.preferIPv4Stack=true 。 当我用这个参数运行jar文件,我得到同样的exception,但如果我删除它的Dockerfile创builddocker的形象和运行它,我得到这个exception:

 2017-09-27 20:34:46,460 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC000001: Failed to start service jboss.undertow.listener.default: org.jboss.msc.service.StartException in service jboss.undertow.listener.default: WFLYUT0082: Could not start 'default' listener. at org.wildfly.extension.undertow.ListenerService.start(ListenerService.java:153) at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) Caused by: java.net.SocketException: Protocol family unavailable at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:433) at sun.nio.ch.Net.bind(Net.java:425) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) at org.xnio.nio.NioXnioWorker.createTcpConnectionServer(NioXnioWorker.java:171) at org.xnio.XnioWorker.createStreamConnectionServer(XnioWorker.java:245) at org.wildfly.extension.undertow.HttpListenerService.startListening(HttpListenerService.java:126) at org.wildfly.extension.undertow.ListenerService.start(ListenerService.java:142) ... 5 more 

这里是链接到github项目,您可以重现错误: https : //github.com/pkristja/wildfly-swarm-consul-demo

它看起来类似于这个问题。

你可以尝试添加swarm.bind.address: 127.0.0.1到ymlconfiguration。