连接到服务器时监控线程出现异常

问题描述 投票:0回答:1

我已经创建了一个可以运行的docker环境

  1. mongo - 启动 mongodb
  2. mongoimport - 输入一些虚拟数据
  3. ordersearchservice - spring-boot 微服务应用程序
  4. productinfoservice - spring-boot 微服务应用程序
  5. userinfoservice - spring-boot 微服务应用程序

userinfoservice 是目前唯一需要连接 mongodb 的服务。 它应该从 mongodb 文档中获取用户详细信息。 如果我在 docker 容器之外运行它,一切都工作正常,但是如果我启动容器,mongodb 连接将无法正常工作。 有两个错误。

  1. userinfoservice
    启动时出错
Exception in monitor thread while connecting to server localhost:27017
userinfoservice-1     |
userinfoservice-1     | com.mongodb.MongoSocketOpenException: Exception opening socket
userinfoservice-1     |         at 
  1. 从邮递员(甚至直接从浏览器)点击控制器时出错
userinfoservice-1     | org.springframework.dao.DataAccessResourceFailureException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/[0:0:0:0:0:0:0:1]:27017}, caused by {java.net.ConnectException: Connection refused}}]
userinfoservice-1     |         at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:88) ~[spring-data-mongodb-4.2.5.jar!/:4.2.5]

这是我正在使用的文件

  1. docker-compose.yml
version: "3"

services:
  mongo:
    image: mongo
    container_name: mongodb
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: pwd
      MONGO_INITDB_DATABASE: admin

  mongoimport:
    image: mongo
    volumes:
      - ./mongo/data/users.json:/src/data/users.json
    command: mongoimport --host mongo --username root --password pwd --db admin --collection users --file /src/data/users.json --jsonArray
    depends_on:
      - mongo

  ordersearchservice:
    build:
      context: ./order-search-service
      dockerfile: Dockerfile
    image: order-search-service
    ports:
      - "8081:8081"
    depends_on:
      - mongoimport
    environment:
      SPRING_DATA_MONGODB_URI: mongodb://root:pwd@localhost:27017/admin

  productinfoservice:
    build:
      context: ./product-info-service
      dockerfile: Dockerfile
    image: product-info-service
    ports:
      - "8082:8082"
    depends_on:
      - ordersearchservice
    environment:
      SPRING_DATA_MONGODB_URI: mongodb://root:pwd@localhost:27017/admin

  userinfoservice:
    build:
      context: ./user-info-service
      dockerfile: Dockerfile
    image: user-info-service
    ports:
      - "8083:8083"
    depends_on:
      - productinfoservice
    environment:
      SPRING_DATA_MONGODB_URI: mongodb://root:pwd@localhost:27017/admin

  1. 用户信息服务/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.5</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.shaan</groupId>
    <artifactId>user-info-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user-info-service</name>
    <description>User Info service</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-reactivestreams</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-core</artifactId>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

  1. 用户信息服务/Dockerfile
FROM maven:3.8.4-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline -B
COPY src ./src
RUN mvn package -DskipTests

FROM openjdk:17-oracle
WORKDIR /app
COPY --from=build /app/target/user-info-service-0.0.1-SNAPSHOT.jar .
ENTRYPOINT  java -jar user-info-service-0.0.1-SNAPSHOT.jar

  1. userinfoservice/src/main/resources/application.properties
spring.application.name=user-info-service
spring.data.mongodb.uri=mongodb://root:pwd@localhost:27017/admin

searchOrderByPhoneUrl=http://localhost:8081/orderSearchService/order/phone
searchProductByProductCode=http://localhost:8082/productInfoService/product/names

server.port=8083

我已经尝试过以下方法:

  1. 我以为userinfoservice启动时mongodb还没有启动,所以我让它依赖于mongodb。
  2. 我仔细检查了数据库连接问题,但 docker 启动 mongodb 完全正常
  3. 我检查了 pom.xml 中的数据库反应式驱动程序,它看起来也已就位(不需要,因为应用程序在 docker 之外工作正常)
  4. 我检查了防火墙。什么都没有。

但是当服务在docker中运行时我仍然无法获取数据。 如果我遗漏了什么,请告诉我。感谢您的帮助。

spring-boot docker-compose
1个回答
0
投票

在容器内运行应用程序时,每个容器通常都有自己独立的网络命名空间。这意味着容器内的“localhost”指的是容器本身,而不是主机或其他容器。因此

userinfoservice
应用程序无法查看
mongo
服务,因为
27017
端口暴露于您自己的本地计算机,并且从您自己的本地主机可见,但从容器中看不到。

默认情况下

Docker Compose
您正在为您的应用程序设置单个网络。服务的每个容器都加入默认网络,并且可以被该网络上的其他容器访问,并且可以通过服务的名称发现。 (https://docs.docker.com/compose/networking/

© www.soinside.com 2019 - 2024. All rights reserved.