当前位置: 首页 > 知识库问答 >
问题:

从 Spring 启动应用程序容器拒绝连接到 Rabbitmq 容器

宋臻
2023-03-14

从我的spring-boot应用程序容器连接到Rabbitmq时,我遇到了一个错误。

我在docker compose文件中附加了两个docker容器(Rabbitmq和spring-boot应用程序)和网桥网络:

    version: '3.3'
services:
  rabbitmq:
    image: rabbitmq:3.8-management-alpine
    container_name: rabbitmq
    ports:
      - 5673:5673
      - 5672:5672
      - 15672:15672
    networks:
      - orchestrator-rabbitmq
    environment:
      - RABBITMQ_DEFAULT_USER=adminsi
      - RABBITMQ_DEFAULT_PASS=test
  orchestrator:
    restart: on-failure
    build:
      context: .
      dockerfile: Dockerfile-orchestrator
      args:
        VERSION: ${VERSION}
    environment:
      - spring_rabbitmq_host=rabbitmq
      - spring_rabbitmq_port=5672
      - spring_rabbitmq_username=adminsi
      - spring_rabbitmq_password=test
    container_name: orchestrator
    depends_on:
      - rabbitmq
    networks:
      - orchestrator-rabbitmq
    ports:
      - 7127:7127

networks:
  orchestrator-rabbitmq:
    external:
      name: orchestrator-rabbitmq

当我的Spring Boot应用程序尝试连接到后者时,Rabbitmq拒绝了连接。日志下方:

当我在我的spring boot应用程序容器(在我的例子中是orchestrator)中执行下面的命令时,我得到以下响应:

nc -vz rabbitmq 5672

回应是:

连接到 rabbitmq (172.19.0.2) 5672 端口 [tcp/*] 成功!

所以tcp连接在两个容器之间成功了,但是当我使用上面docker撰写文件中定义的凭据在我的orchestrator容器中curl到Rabbitmq时,我得到了连接被拒绝:

curl -u "adminsi:test" http://localhost:15672

但是,当我改变localhost与Rabbitmq作为主机如下:

curl -u "adminsi:test" http://rabbitmq:15672

响应成功!

在我的Spring启动应用程序(orchestrator)中的属性配置下方:

spring.rabbitmq.host=rabbitmq
spring.rabbitmq.port=5672
spring.rabbitmq.username=adminsi
spring.rabbitmq.password=test

我正在使用apache camel在rabbitmq中发布消息(下面是一个从API读取并在rabbatmq主题中发布响应的camel路由示例):

from("direct:OrchestratorDtstoreLoadDataRoute")
                .routeId("orchestrator-dtstore-route")
                .log(LoggingLevel.INFO, "Reading dtstore projects")
                .removeHeaders("*")
                .setHeader("Content-Type", () -> "application/json")
                .setHeader("CamelHttpMethod", () -> "GET")
                .setHeader("Authorization", () -> dtstoreToken)
                .setHeader("x-apikey", () -> dtstoreXapiKey)
                .recipientList(simple("cxfrs:{{cmdb.service.out.dtstore.url}}/projects"))
                .log(LoggingLevel.DEBUG, "dtstore projects : ${body}")
                .to(ExchangePattern.InOnly, "rabbitmq:q.cmdb.dtstore.projects?routingKey=dtstore&autoDelete=false&exchangeType=topic")
                .end();

Orchestrator Dockerfile:

FROM openjdk:17.0.2-jdk-slim
ARG VERSION

ENV ORCHESTRATOR_VERSION=$VERSION

RUN apt-get update && apt-get install -y \
  nano \
  netcat \
  iputils-ping \
  curl \
  && rm -rf /var/lib/apt/lists/*


WORKDIR /opt/app

COPY target/orchestrator-$ORCHESTRATOR_VERSION.jar .

EXPOSE 7127

ENTRYPOINT java -jar orchestrator-$ORCHESTRATOR_VERSION.jar

我在运行 docker 撰写文件之前运行 mvn 干净的包。

谢谢你的帮助。

共有1个答案

潘星阑
2023-03-14

在旅程结束时,我找到了解决方案,是的,在将Spring属性修改为以下新属性后:

camel.component.rabbitmq.hostname=localhost
camel.component.rabbitmq.port=5672
camel.component.rabbitmq.username=adminsi
camel.component.rabbitmq.password=test

这样,在rabbitmq知道这些属性之前,我们可以告诉绑定到rabbitmq的camel有关主机、端口、用户名和密码的信息,因此,camel无法解析rabbitmq的主机。

然后,我更改了orchestrator容器的docker-compose环境:

version: '3.3'
services:
  rabbitmq:
    image: rabbitmq:3.8-management
    container_name: rabbitmq
    ports:
      - 5673:5673
      - 5672:5672
      - 15672:15672
    networks:
      - orchestrator-rabbitmq
    environment:
      - RABBITMQ_DEFAULT_USER=adminsi
      - RABBITMQ_DEFAULT_PASS=test
  orchestrator:
    restart: on-failure
    build:
      context: .
      dockerfile: Dockerfile
      args:
        VERSION: ${VERSION}
    environment:
      - camel_component_rabbitmq_hostname=rabbitmq
      - camel_component_rabbitmq_port=5672
      - camel_component_rabbitmq_username=adminsi
      - camel_component_rabbitmq_password=test
    container_name: orchestrator
    depends_on:
      - rabbitmq
    networks:
      - orchestrator-rabbitmq
    ports:
      - 7127:7127

networks:
  orchestrator-rabbitmq:
    external:
      name: orchestrator-rabbitmq

我已经将rabbitmq的主机属性(camel_component_rabbitmq_hostname)修改为rabbitq,以便进行容器解析。

我希望我的解决方案适用于您,享受!

 类似资料:
  • 我花了几个小时在谷歌上搜索,但似乎找不到正确的路径/文档来帮助我走上正确的道路:( 前提很简单。 我有一个在localhost:8080上打开的springboot应用程序。我有一个在localhost:15672上打开的rabbitmq服务器 当这两个应用程序都运行时,springboot应用程序将通过一些用户交互向Rabbitmq服务器发送消息。当我对这两个独立的服务进行dockerize(容

  • 我有一个运行java进程的docker容器,我试图将该进程连接到本地主机上运行的rabbitmq。 以下是我到目前为止所做的步骤: null 能够ping local-ip和curl rabbitmq admin api [{“名称”:“/”,“跟踪”:false}] 当我试图从容器内部telnet时,我得到 由:java.net.ConnectException:在java.net.plains

  • 当试图用docker-compose将我的express应用程序连接到mongo容器时,连接被拒绝。我可以使用localhost:27017和使用dbsetup.js的L/P设置连接到robo3T的db容器,但是当express试图连接时,我得到了一个错误:

  • 喂,伙计们! 这是我的第一次,所以我会尽力做到最好。 我想创建一个应用程序,它是运行与Springboot框架,我想把它连接到一个docker容器嵌入MySQL(但Spring启动应用程序不是运行在docker) 所以我一直关注这个帖子 我已经做了我的docker-comact: 我用这个命令运行它: 一切都很好,所以现在我在Spring靴上改变application.properties: 但当

  • 我有一个Java应用程序在Docker容器中运行,在另一个容器中运行。 如何连接容器以在Java应用程序中使用<code>rabbitmq</code>?

  • 我正在运行2个spring boot应用程序:一个客户端和rest-api。客户机与rest-api通信,rest-API与mongodb数据库通信。所有3层都在docker容器中运行。 我启动容器,通常指定docker文件中公开的端口,并将它们映射到主机上的端口,例如:-p 7070:7070,其中7070是docker文件中公开的端口。 当我通过< code > Java-jar[applic