IBM Cloud Docs
连接外部应用程序

连接外部应用程序

应用程序和驱动程序使用连接字符串来建立与 IBM Cloud® Databases for MongoDB的连接。 每个部署都有专门用于驱动程序和应用程序的连接字符串。 连接字符串显示在部署的“概述”的“端点”面板中,还可以从 Cloud Databases CLI 插件Cloud Databases API 中检索。

您在部署中创建的任何用户都可以使用连接字符串。 虽然您可以将管理用户用于所有连接和应用程序,但最好专门为要连接的应用程序创建用户。 有关详细信息,请参阅 获取连接字符串

连接外部应用程序时,仅使用 MongoDB或者 MongoDB's精选社区支持图书馆。Cloud Databases不支持任何不支持的驱动程序MongoDB。

使用连接信息

驱动程序与部署建立连接所需的所有信息都在 Service credentials 页面上创建的凭证的 "MongoDB" 部分中。 该表包含供参考的细目。

mongodb/URI 连接信息
字段名称 索引 描述
Type 连接类型 - 用于MongoDB,它是“URI”
Scheme URI 方案 - 用于MongoDB,它是“mongodb”
Path URI 的路径 - 用于MongoDB,它是数据库名称。 首次供应 MongoDB 实例时,用户要连接的缺省数据库为 admin
Authentication Username 用于连接的用户名。
Authentication Password 用户的密码-可能显示为 $PASSWORD
Authentication Method 如何进行认证;“直接”认证由驱动程序处理。 Mongo 3.6 使用 SCRAM SHA 1,而 Mongo 4.2 使用 SHA 256
Hosts 0... 要连接到的主机名和端口
Composed 0... 用于组合方案,认证,主机,路径和副本集名称的 URI。
Certificate Name 数据库部署服务专有证书的分配名称
Certificate Base64 证书的 base64 编码版本。
  • 0... 指示数组中可能有一个或多个这些条目。

如果在连接信息的“组成”字段中提供 URI 格式的连接字符串,许多MongoDB驱动程序都能连接到您的部署。Cloud Databases提供了一个高可用的MongoDB,实例,因此请确保在连接字符串中包含所有成员。 例如:

mongodb://admin:$PASSWORD@d5eeee66-5bc4-498a-b73b-1307848f1eac.8f7bfd8f3faa4218aec56e069eb46187-0.databases.appdomain.cloud:30484,d5eeee66-5bc4-498a-b73b-1307848f1eac.8f7bfd8f3faa4218aec56e069eb46187-1.databases.appdomain.cloud:30484,d5eeee66-5bc4-498a-b73b-1307848f1eac.8f7bfd8f3faa4218aec56e069eb46187-2.databases.appdomain.cloud:30484/<database name>?authSource=admin&replicaSet=replset

replicaSet 查询参数包含部署的副本集名称。 可能是 replset。 某些驱动程序和应用程序需要单独传入。

以下示例使用连接字符串和 MongoDB Java 驱动程序 中的信息来连接到数据库。

public class MongodbConnect {
    private static Logger log = LoggerFactory.getLogger(LoggerFactory.class);

    public static void main(String[] args) {

        System.setProperty("javax.net.ssl.trustStore", "path/to/keystore");
        System.setProperty("javax.net.ssl.trustStorePassword", "store_password");

        // make sure you append ssl=true to the connection URI
        final String mongoURI = "mongodb://user:password@host:port,host:port/?authSource=admin&replicaSet=replset&ssl=true";

        MongoClient mongoClient = MongoClients.create(mongoURI);
        boolean testDB = false;

        // this loop will continue attempting to connect to the database until the admin database is found
        while (!testDB) {
            try {
                // check if you can connect to the database by checking for
                // the presence of the admin database. If the admin databases isn't found
                // then you're not connected.
                MongoIterable<String> databases = mongoClient.listDatabaseNames();
                for (String name: databases) {
                    if (name.contains("admin")) {
                        System.out.println("admin found...");
                        testDB = true;
                    }
                }
            } catch (Exception e) {
                log.info(e.getMessage());
            }
        }

        // close connection
        mongoClient.close();

    }
}

下一个示例使用来自连接字符串和 Python 驱动程序 pymongo 的信息来连接到数据库。 这只是一个简单的连接示例,没有错误处理或重试逻辑,可能不适合生产。

import pymongo
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure


client = MongoClient(
    "mongodb://admin:$PASSWORD@host.databases.appdomain.cloud:30484/<database name>?authSource=adminreplicaSet=replset",
    ssl=True,
    ssl_ca_certs="/path/to/cert/ca-certificate.crt"
)

try:
    db_list = client.list_database_names()
    print("List of databases:")
    print(db_list)

except ConnectionFailure as err:
    print("Unable to connect to database")

此最后一个示例使用 MongoDB Node.js 驱动程序

const MongoClient = require("mongodb").MongoClient;

let connectionString = "mongodb://<username>:<password>@<host>:<port>,<host>:<port>/<database>?authSource=admin&replicaSet=replset";

let options = {
    tls: true,
    tlsCAFile: `/path/to/cert`,
    useUnifiedTopology: true
};

// connects to a MongoDB database
MongoClient.connect(connectionString, options, function (err, db) {
    if (err) {
        console.log(err);
    } else {
       // lists the databases that exist in the deployment
        db.db('example').admin().listDatabases(function(err, dbs) {
            console.log(dbs.databases);
            db.close();
        });
    }
});

驱动程序 TLS 和服务专有证书支持

与 Databases for MongoDB 的所有连接都已启用 TLS 1.2,因此用于连接的驱动程序需要能够支持加密。

Databases for MongoDB Enterprise Edition支持以下 密码套件:

  • ECDHE-ECDSA-AES128-GCM-SHA256
  • ECDHE-RSA-AES128-GCM-SHA256
  • ECDHE-ECDSA-AES256-GCM-SHA384
  • ECDHE-RSA-AES256-GCM-SHA384
  • ECDHE-ECDSA-CHACHA20-POLY1305
  • ECDHE-RSA-CHACHA20-POLY1305
  • DHE-RSA-AES128-GCM-SHA256
  • DHE-RSA-AES256-GCM-SHA384

您的部署还附带了服务专有证书,这样驱动程序就能在连接时验证服务器。

有关更多信息,请参阅 Cloud Databases 证书常见问题

使用服务专有证书

  1. 端点 面板或连接信息的 Base64 字段复制证书信息。
  2. 如果需要,将 Base64 字符串解码为文本。
  3. 将证书保存到文件中。 (您可以使用提供的名称或您自己的文件名)。*
  4. 向驱动程序或客户机提供证书的路径。

*为了MacOS,确保已将证书导入信任库,并将证书标记为 trust always

CLI 插件支持服务专有证书

您可以使用命令 ibmcloud cdb deployment-cacert "your-service-name" 通过 CLI 插件显示部署的解码证书。 它将 base64 解码为文本。 将命令的输出复制并保存到文件,并提供该文件的驱动程序路径。

其他语言驱动程序

MongoDB 有大量的语言驱动程序。 此表涵盖一些最常见的驱动程序。 如果要查找更多语言,请尝试 MongoDB.org 驱动程序列表