- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发 Wildfly-Swarm 应用程序,我想使用 Consul 作为我的服务发现。所以我添加了 topology-consul fraction,在 project-defaults.yml 中设置我的 Consul 路径,并将 @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 将我的 fat 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"]
构建它:
docker build -f Dockerfile -t my-swarm-app .
然后像这样运行它:
docker run -p 8581:8581 my-swarm-app
我得到以下异常:
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 拓扑分数中的错误,还是我缺少某些配置?
编辑 2:我发现问题出在 wildfly-swarm paramater -Djava.net.preferIPv4Stack=true
上。当我使用这个参数运行 jar 文件时,我得到了同样的异常,但是如果我删除它用于创建 docker 图像的 Dockerfile 并运行它,我得到这个异常:
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
最佳答案
它看起来类似于 this问题。
你可以尝试将 swarm.bind.address: 127.0.0.1
添加到 yml 配置中吗?
关于java - Wildfly-Swarm Consul 服务发现 - 无效的服务地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46430584/
当我将新节点加入现有节点时,docker swarm 抛出错误“swarm already part of swarm” 我在我的本地机器上运行 docker swarm 并尝试初始化 swarm 并
我经常遇到问题,因为我在具有多个节点的 docker swarm 上部署的服务无法启动,并且没有生成可以使用 docker service logs {serviceName} 查看的日志。 服务无法
我在同一个子网中有 4 个虚拟机,它们是 docker-swarm 的一部分。现在我想连接另一个位于不同国家(不同子网)的节点(虚拟机)。我是一个 IP 菜鸟,我很难在 docker 中设置一个能够处
我想将堆栈部署到 Docker 群,我希望每个节点都运行给定的服务。 我查看了 deploy.placement 配置,我发现的最接近的选项是放置首选项 spread=node.label.abc ,
初始化集群模式: root@ip-172-31-44-207:/home/ubuntu# docker swarm init --advertise-addr 172.31.44.207 Swarm
这个命令的初始化群有什么区别: docker swarm init --advertise-addr docker -H swarm join --token 和这个: docker run s
我正在考虑构建一个 Docker Swarm 集群。为了让事情既简单又相对容错,我想简单地运行 3 个节点作为管理器。 不使用任何专用工作节点时有什么权衡?有什么我应该注意的可能不明显的吗? 我找到了
我最感兴趣的是我从docker node ls得到的信息. Docker 将加入的节点的信息存储在哪里? 最佳答案 docker 把加入的节点的信息存储在哪里? 资料来自docker node ls可
我想知道是否有人可以区分这两者。它们都有相似的命名。 最佳答案 Docker Swarm是一个单独的产品,您可以使用它来集群多个 Docker 主机。在 Docker 版本 1.12 之前,它是集群主
我有一个带有两个节点的 Swarm,我正在运行 cadvisor 作为全局服务。我得到指标,grafana/Promethues 可以抓取它们。但是我的数字是错误的。当我使用 docker 命令行工具
我正在尝试连接到 docker 事件总线以监听 swarm 上发生的各种事件,例如节点离开和加入集群、创建的服务等。 问题。 是否有可能在群体级别获得此类信息? 如果是这样,是否dockerpy库可用
我正在使用最新的 mac 版 docker (17.09.0-ce),当我运行 docker-machine create --help 时它说... --swarm-master Configur
我创建了一个 docker swarm 集群,其中包含 4 个节点 2 是 swarm manager(swarm 支持多个管理器)我知道如果当前管理器节点关闭,然后第二个管理器扮演成为集群管理器的角
为了测试我们的托管构建,我正在尝试建立一个与主机和外部世界隔离的 docker 网络。 我有以下 docker-compose.yml (灵感来自 this forum post ): version
在创建 docker swarm 集群时,我遇到了以下两个命令: docker run swarm create docker 群初始化 两者都用于初始化 Docker swarm 集群。任何人都可以
问题陈述:我需要通过 JMX 连接到 docker swarm 服务中的特定容器。服务未在任何端口上公开,因此我无法通过直接点击公开端口上的 docker 基板来访问 JMX。 另外,如果服务被暴露,
目前我可以看到Spring Cloud Data Flow有这些服务器:Local、YARN、Cloud Foundry、Mesos和Kubernetes;是否有支持 Swarm 的计划? 最佳答案
我看到与 described here 相同的问题和 here .我已经尝试了在这两种情况下有效的所有方法,但都无济于事——我仍然看到相同的行为。有人可以提供我可以尝试的替代方案吗? 我的设置: 我正
在一个 swarm 中拥有多个 docker 机器(一个管理器和许多节点)与在一个 swarm 中拥有多个 docker 服务副本之间到底有什么区别? 最佳答案 好吧,由于没有人回答这个问题,我继续在
当在多台机器的 Docker Swarm 集群中运行时,Traefik 不会创建前端或后端。 我按照以下教程在我的 MacBook(操作系统版本:10.14.2 (18C54))上创建了一个 Dock
我是一名优秀的程序员,十分优秀!