Spring 无法连接到 docker 上的 MongoDB

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

我创建了两个 docker compose 文件,一个用于数据库:

# docker compose -f ./_DockerEndpoints.yaml -p storage up -d
version: '3.8'

services:
  my-postgresql-db:
    image: postgres:latest
    container_name: postgresql-db
    ports:
      - "5432:5432"
    volumes:
      - /Users/Develop/Personal/projects/tools/data/PostgreSQL:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: paulmarcelinbejan
      POSTGRES_PASSWORD: PaulMarcelinBejanPassword
      POSTGRES_DB: MyDB
    networks:
      - storage-network
    healthcheck:
      test: ["CMD", "pg_isready", "-q", "-d", "MyDB", "-U", "paulmarcelinbejan"]
      interval: 10s
      timeout: 5s
      retries: 4
  my-mongo-db:
    image: mongo:latest
    container_name: mongo-db
    ports:
      - "27017:27017"
    volumes:
      - /Users/Develop/Personal/projects/tools/data/MongoDB:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: paulmarcelinbejan
      MONGO_INITDB_ROOT_PASSWORD: PaulMarcelinBejanPassword
    command: --auth
    networks:
      - storage-network
    healthcheck:
      test: ["CMD", "mongo", "--eval", "db.getCollectionNames()"]
      interval: 10s
      timeout: 5s
      retries: 4

networks:
  storage-network:
    driver: bridge

一个用于网络应用程序

# docker compose -f ./HyperBank_APIs.yaml -p hyperbank up -d
version: '3.8'

services:
  hyperbank-config-provider:
    image: hyperbank-config-provider:latest
    container_name: config-provider
    ports:
      - "8888:8888"
    networks:
      - hyperbank-network
      - storage_storage-network
    healthcheck:
      test: "curl --fail --silent http://config-provider:8888/actuator/health | grep UP || exit 1"
      start_period: 20s
      interval: 5s
      timeout: 10s
      retries: 3

  hyperbank-types:
    image: hyperbank-types:latest
    container_name: types
    ports:
      - "9008:9008"
    environment:
      CONFIG_PROVIDER_HOST: config-provider
    networks:
      - hyperbank-network
      - storage_storage-network
    depends_on:
      hyperbank-config-provider:
        condition: service_healthy

networks:
  hyperbank-network:
    driver: bridge
  storage_storage-network:
    external: true

我使用 localhost:5432 将 DBeaver 连接到 PostreSQL,并使用 localhost:27017 将 Studio3T 连接到 MongoDB

在 spring-boot 中,我使用容器名称作为主机:my-postgresql-db 和 my-mongo-db

在超级银行类型启动期间,两个数据库不存在连接问题

这些是 MongoDB 的日志:

2024-04-01 18:41:03 {"timeMillis":1711989663655,"thread":"main","level":"INFO","loggerName":"org.mongodb.driver.client","message":"MongoClient with metadata {\"driver\": {\"name\": \"mongo-java-driver|sync|spring-boot\", \"version\": \"4.9.1\"}, \"os\": {\"type\": \"Linux\", \"name\": \"Linux\", \"architecture\": \"aarch64\", \"version\": \"6.3.13-linuxkit\"}, \"platform\": \"Java/Eclipse Adoptium/21.0.2+13-LTS\"} created with settings MongoClientSettings{readPreference=primary, writeConcern=WriteConcern{w=null, wTimeout=null ms, journal=null}, retryWrites=true, retryReads=true, readConcern=ReadConcern{level=null}, credential=MongoCredential{mechanism=null, userName='paulmarcelinbejan', source='HyperBankMongoDB', password=<hidden>, mechanismProperties=<hidden>}, streamFactoryFactory=null, commandListeners=[], codecRegistry=ProvidersCodecRegistry{codecProviders=[ValueCodecProvider{}, BsonValueCodecProvider{}, DBRefCodecProvider{}, DBObjectCodecProvider{}, DocumentCodecProvider{}, CollectionCodecProvider{}, IterableCodecProvider{}, MapCodecProvider{}, GeoJsonCodecProvider{}, GridFSFileCodecProvider{}, Jsr310CodecProvider{}, JsonObjectCodecProvider{}, BsonCodecProvider{}, EnumCodecProvider{}, com.mongodb.client.model.mql.ExpressionCodecProvider@da4cf09, com.mongodb.Jep395RecordCodecProvider@1980a3f]}, loggerSettings=LoggerSettings{maxDocumentLength=1000}, clusterSettings={hosts=[my-mongo-db:27017], srvServiceName=mongodb, mode=SINGLE, requiredClusterType=UNKNOWN, requiredReplicaSetName='null', serverSelector='null', clusterListeners='[]', serverSelectionTimeout='30000 ms', localThreshold='30000 ms'}, socketSettings=SocketSettings{connectTimeoutMS=10000, readTimeoutMS=0, receiveBufferSize=0, sendBufferSize=0}, heartbeatSocketSettings=SocketSettings{connectTimeoutMS=10000, readTimeoutMS=10000, receiveBufferSize=0, sendBufferSize=0}, connectionPoolSettings=ConnectionPoolSettings{maxSize=100, minSize=0, maxWaitTimeMS=120000, maxConnectionLifeTimeMS=0, maxConnectionIdleTimeMS=0, maintenanceInitialDelayMS=0, maintenanceFrequencyMS=60000, connectionPoolListeners=[], maxConnecting=2}, serverSettings=ServerSettings{heartbeatFrequencyMS=10000, minHeartbeatFrequencyMS=500, serverListeners='[]', serverMonitorListeners='[]'}, sslSettings=SslSettings{enabled=false, invalidHostNameAllowed=false, context=null}, applicationName='null', compressorList=[], uuidRepresentation=JAVA_LEGACY, serverApi=null, autoEncryptionSettings=null, contextProvider=null}","endOfBatch":false,"loggerFqcn":"org.apache.logging.slf4j.Log4jLogger","contextMap":{},"threadId":1,"threadPriority":5,"appName":"spring.application.name","version":"spring.application.version"}
2024-04-01 18:41:03 {"timeMillis":1711989663667,"thread":"cluster-ClusterId{value='660ae39ffcaa200ce45daab3', description='null'}-my-mongo-db:27017","level":"INFO","loggerName":"org.mongodb.driver.cluster","message":"Monitor thread successfully connected to server with description ServerDescription{address=my-mongo-db:27017, type=STANDALONE, state=CONNECTED, ok=true, minWireVersion=0, maxWireVersion=21, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=20379000}","endOfBatch":false,"loggerFqcn":"org.apache.logging.slf4j.Log4jLogger","contextMap":{},"threadId":37,"threadPriority":5,"appName":"spring.application.name","version":"spring.application.version"}

当我在超级银行类型上执行 api 时,它会正确地在 PostgreSQL 上执行查询:

2024-04-01 18:47:24 Hibernate: 
2024-04-01 18:47:24     select
2024-04-01 18:47:24         s1_0.id_account_type,
2024-04-01 18:47:24         s1_0.code,
2024-04-01 18:47:24         s1_0.description 
2024-04-01 18:47:24     from
2024-04-01 18:47:24         account_type s1_0 
2024-04-01 18:47:24     where
2024-04-01 18:47:24         s1_0.id_account_type=?

但是当尝试在 MongoDB 上插入文档时会出错:

2024-04-01 18:47:24 {"timeMillis":1711990044245,"thread":"http-nio-9008-exec-1","level":"WARN","loggerName":"org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver","message":"Failure in @ExceptionHandler com.hyperbank.architecture.web.controller.HyperBankExceptionRestController#handleFunctionalException(FunctionalException)","thrown":{"commonElementCount":0,"localizedMessage":"Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='paulmarcelinbejan', source='HyperBankMongoDB', password=<hidden>, mechanismProperties=<hidden>}","message":"Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='paulmarcelinbejan', source='HyperBankMongoDB', password=<hidden>, mechanismProperties=<hidden>}","name":"org.springframework.data.mongodb.UncategorizedMongoDbException","cause":{"commonElementCount":84,"localizedMessage":"Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='paulmarcelinbejan', source='HyperBankMongoDB', password=<hidden>, mechanismProperties=<hidden>}","message":"Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='paulmarcelinbejan', source='HyperBankMongoDB', password=<hidden>, mechanismProperties=<hidden>}","name":"com.mongodb.MongoSecurityException","cause":{"commonElementCount":84,"localizedMessage":"Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server my-mongo-db:27017. The full response is {\"ok\": 0.0, \"errmsg\": \"Authentication failed.\", \"code\": 18, \"codeName\": \"AuthenticationFailed\"}","message":"Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server my-mongo-db:27017. The full response is {\"ok\": 0.0, \"errmsg\": \"Authentication failed.\", \"code\": 18, \"codeName\": \"AuthenticationFailed\"}","name":"com.mongodb.MongoCommandException","extendedStackTrace":"com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server my-mongo-db:27017. The full response is {\"ok\": 0.0, \"errmsg\": \"Authentication failed.\", \"code\": 18, \"codeName\": \"AuthenticationFailed\"}\n\tat com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:205) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:443) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:365) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:102) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:49) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:224) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.SaslAuthenticator.getNextSaslResponse(SaslAuthenticator.java:131) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.SaslAuthenticator.lambda$authenticate$0(SaslAuthenticator.java:63) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.java:277) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:59) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:57) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.InternalStreamConnectionInitializer.authenticate(InternalStreamConnectionInitializer.java:205) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.InternalStreamConnectionInitializer.finishHandshake(InternalStreamConnectionInitializer.java:85) ~[mongodb-driver-core-4.9.1.jar!/:?]\n\tat com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:209) ~[mongodb-driver-core-4.9.1.jar!/:?]"},"endOfBatch":false,"loggerFqcn":"org.apache.commons.logging.LogAdapter$Log4jLog","contextMap":{},"threadId":41,"threadPriority":5,"appName":"spring.application.name","version":"spring.application.version"}}}
mongodb docker docker-compose dockerfile docker-network
1个回答
0
投票

问题与身份验证机制有关,正在使用 SCRAM-SHA-1,所以我替换了:

spring:  
   data:
      mongodb:
         host: ${endpoints.nosql.HyperBankMongoDB.host}
         port: ${endpoints.nosql.HyperBankMongoDB.port}
         database: ${endpoints.nosql.HyperBankMongoDB.name}
         username: ${endpoints.nosql.HyperBankMongoDB.username}
         password: ${endpoints.nosql.HyperBankMongoDB.password}
         authentication-database: ${endpoints.nosql.HyperBankMongoDB.authentication-database}

与:

spring:
   data:
      mongodb:
         uri: mongodb://${endpoints.nosql.HyperBankMongoDB.username}:${endpoints.nosql.HyperBankMongoDB.password}@${endpoints.nosql.HyperBankMongoDB.host}:${endpoints.nosql.HyperBankMongoDB.port}/${endpoints.nosql.HyperBankMongoDB.name}?authSource=${endpoints.nosql.HyperBankMongoDB.authentication-database}&authMechanism=${endpoints.nosql.HyperBankMongoDB.authentication-mechanism}

为了添加auth机制SCRAM-SHA-256

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