文档首页> 文档数据库服务 DDS> 最佳实践> 连接DDS实例的常用方式
更新时间:2024-05-20 GMT+08:00

连接DDS实例的常用方式

本节介绍了四种连接DDS实例的方式:

  • mongo shell连接
  • python mongo客户端
  • java mongo客户端
  • 基于Spring MongoTemplate操作MongoDB

mongo shell连接

  • 前提条件
    1. 连接数据库的弹性云服务器必须和DDS实例之间网络互通,可以使用curl命令连接DDS实例服务端的IP和端口号,测试网络连通性。

      curl ip:port

      返回“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,说明网络互通。

    2. MongoDB官网,下载与数据库实例版本号一致的客户端安装包。解压后获取其中的“mongo”文件,并上传到弹性云服务器。
    3. 如果开启SSL,需要在界面上下载根证书,并上传到弹性云服务器。
  • 连接命令
    • SSL开启

      ./mongo ip:port --authenticationDatabase admin -u username -p password --ssl --sslCAFile $path to certificate authority file --sslAllowInvalidHostnames

    • SSL关闭

      ./mongo ip:port --authenticationDatabase admin -u username -p password

      表1 参数说明

      参数

      说明

      ip

      如果通过弹性云服务器连接,“ip”是主机IP,即“基本信息”页面该实例的“内网地址”。

      如果通过连接了公网的设备访问,“ip”为该实例已绑定的“弹性公网IP”。

      port

      端口,默认8635,当前端口,参考“基本信息”页面该实例的“数据库端口”。

      username

      当前用户名。

      password

      当前用户的密码。

      path to certificate authority file

      SSL证书的路径。

  • 注意事项
    1. 如果开启SSL,连接命令中必须包含“--ssl”和“--sslCAFile”选项。
    2. 数据库认证“--authenticationDatabase”必须为“admin”,rwuser用户必须要在admin上认证。

更多信息,请参见《文档数据库服务快速入门》中各实例类型下“连接实例”的内容。

python mongo客户端

  • 前提条件
    1. 连接数据库的弹性云服务器必须和DDS实例之间网络互通,可以使用curl命令连接DDS实例服务端的IP和端口号,测试网络连通性。

      curl ip:port

      返回“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,说明网络互通。

    2. 在弹性云服务器上安装Python以及第三方安装包pymongo。推荐使用pymongo2.8版本。
    3. 如果开启SSL,需要在界面上下载根证书,并上传到弹性云服务器。
  • 连接代码
    • SSL开启
      import ssl
      import os
      from pymongo import MongoClient
      # 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全
      # 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV
      rwuser = os.getenv('EXAMPLE_USERNAME_ENV')
      password = os.getenv('EXAMPLE_PASSWORD_ENV')
      conn_urls="mongodb://%s:%s@ip:port/{mydb}?authSource=admin"
      connection = MongoClient(conn_urls % (rwuser, password),connectTimeoutMS=5000,ssl=True, ssl_cert_reqs=ssl.CERT_REQUIRED,ssl_match_hostname=False,ssl_ca_certs=${path to certificate authority file})
      dbs = connection.database_names()
      print "connect database success! database names is %s" % dbs
    • SSL关闭
      import ssl
      import os
      from pymongo import MongoClient
      # 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全
      # 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV
      rwuser = os.getenv('EXAMPLE_USERNAME_ENV')
      password = os.getenv('EXAMPLE_PASSWORD_ENV')
      conn_urls="mongodb://%s:%s@ip:port/{mydb}?authSource=admin"
      connection = MongoClient(conn_urls % (rwuser, password),connectTimeoutMS=5000)
      dbs = connection.database_names()
      print "connect database success! database names is %s" % dbs
  • 注意事项
    1. {mydb}代表要连接数据库的名称。
    2. URL中的认证数据库必须为“admin”,即“authSource=admin”。

java mongo客户端

  • 前提条件
    1. 连接数据库的弹性云服务器必须和DDS实例之间网络互通,可以使用curl命令连接DDS实例服务端的IP和端口号,测试网络连通性。

      curl ip:port

      返回“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,说明网络互通。

    2. 参考MongoDB兼容性列表,下载兼容数据库实例版本的mongo jar包。
    3. 在弹性云服务器上安装jdk。
    4. 如果开启SSL,需要在界面上下载根证书,并上传到弹性云服务器。
  • 连接代码

    用keytool工具手动生成trustStore:

    // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全;

    // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。

    String password = System.getenv("EXAMPLE_PASSWORD_ENV");

    keytool -import -file /var/chroot/mongodb/CA/ca.crt -keystore /home/Mike/jdk1.8.0_112/jre/lib/security/mongostore -storetype pkcs12 -storepass ${password}

    • “/var/chroot/mongodb/CA/ca.crt”为根证书路径。
    • “/home/Mike/jdk1.8.0_112/jre/lib/security/mongostore”为生成的trustStore的路径。
    • SSL开启
      import java.util.ArrayList;
      import java.util.List;
      import org.bson.Document;
      import com.mongodb.MongoClient;
      import com.mongodb.MongoCredential;
      import com.mongodb.ServerAddress;
      import com.mongodb.client.MongoDatabase;
      import com.mongodb.client.MongoCollection;
      import com.mongodb.MongoClientURI;
      import com.mongodb.MongoClientOptions;
      public class MongoDBJDBC {
      public static void main(String[] args){
            try {
                    System.setProperty("javax.net.ssl.trustStore", "/home/Mike/jdk1.8.0_112/jre/lib/security/mongostore");
                    // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全;
                    // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
                    String password = System.getenv("EXAMPLE_PASSWORD_ENV");
                    System.setProperty("javax.net.ssl.trustStorePassword", password);
                    ServerAddress serverAddress = new ServerAddress("ip", port);
                    List addrs = new ArrayList();
                    addrs.add(serverAddress);
                    // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全;
                    // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
                    String userName = System.getenv("EXAMPLE_USERNAME_ENV");
                    String rwuserPassword = System.getenv("EXAMPLE_PASSWORD_ENV");
                    MongoCredential credential = MongoCredential.createScramSha1Credential("rwuser", "admin", rwuserPassword.toCharArray());
                    List credentials = new ArrayList();
                    credentials.add(credential);
                    MongoClientOptions opts= MongoClientOptions.builder()
                    .sslEnabled(true)
                    .sslInvalidHostNameAllowed(true)
                    .build();
                    MongoClient mongoClient = new MongoClient(addrs,credentials,opts);
                    MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb");
                    MongoCollection collection = mongoDatabase.getCollection("testCollection");
                    Document document = new Document("title", "MongoDB").
                    append("description", "database").
                    append("likes", 100).
                    append("by", "Fly");
                    List documents = new ArrayList();
                    documents.add(document);
                    collection.insertMany(documents);
                    System.out.println("Connect to database successfully");
                    } catch (Exception e) {
                    System.err.println( e.getClass().getName() + ": " + e.getMessage() );
               }
            }
      }

      样例代码:

      javac -cp .:mongo-java-driver-3.2.0.jar MongoDBJDBC.java
      java -cp .:mongo-java-driver-3.2.0.jar MongoDBJDBC
    • SSL关闭
      import java.util.ArrayList;
      import java.util.List;
      import org.bson.Document;
      import com.mongodb.MongoClient;
      import com.mongodb.MongoCredential;
      import com.mongodb.ServerAddress;
      import com.mongodb.client.MongoDatabase;
      import com.mongodb.client.MongoCollection;
      import com.mongodb.MongoClientURI;
      import com.mongodb.MongoClientOptions;
      public class MongoDBJDBC {
      public static void main(String[] args){
            try {
                    ServerAddress serverAddress = new ServerAddress("ip", port);
                    List addrs = new ArrayList();
                    addrs.add(serverAddress);
                    // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全;
                    // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
                    String userName = System.getenv("EXAMPLE_USERNAME_ENV");
                    String rwuserPassword = System.getenv("EXAMPLE_PASSWORD_ENV");
                    MongoCredential credential = MongoCredential.createScramSha1Credential("rwuser", "admin", rwuserPassword.toCharArray());
                    List credentials = new ArrayList();
                    credentials.add(credential);
                    MongoClient mongoClient = new MongoClient(addrs,credentials);
                    MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb");
                    MongoCollection collection = mongoDatabase.getCollection("testCollection");
                    Document document = new Document("title", "MongoDB").
                    append("description", "database").
                    append("likes", 100).
                    append("by", "Fly");
                    List documents = new ArrayList();
                    documents.add(document);
                    collection.insertMany(documents);
                    System.out.println("Connect to database successfully");
                    } catch (Exception e) {
                    System.err.println( e.getClass().getName() + ": " + e.getMessage() );
               }
              }
      }

基于Spring MongoTemplate操作MongoDB

  • 使用介绍

    本章节介绍如何使用Spring集成的MongoDB,使用MongoTemplate操作MongoDB。详情请参考mongo官网

  • 前提条件
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-data-mongodb</artifactId>
    	<exclusions>
    		<exclusion>
    			<artifactId>spring-boot-starter-logging</artifactId>
    			<groupId>org.springframework.boot</groupId>
    		</exclusion>
    	</exclusions>
    </dependency>
  • 配置指导
    spring:
      data:
        mongodb:           #MongoDB配置,作为参考
          // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全;
          // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
          String userName = System.getenv("EXAMPLE_USERNAME_ENV");
          String rwuserPassword = System.getenv("EXAMPLE_PASSWORD_ENV");
          uri: mongodb://" + userName + ":" + rwuserPassword + "@192.***.***.***:8635,192.***.***.***:8635/${mongodb.database}
          database: ${mongodb.database}
  • 开发指导
    /**
     * mongoDB执行
     */
    @Autowired
    private MongoTemplate template;
    
    /**
     * 日志配置
     */
    @Autowired
    private LoggingProperties properties;
    
    @Override
    public void write(BaseLog businessLog, LoggingOption option) {
        if (template != null) {
            LoggingConfig config = properties.getBusinessConfig(businessLog.getCategory());
            String collection = config.getMeta().get("collection");
            if (StringUtils.isNotEmpty(collection)) {
                Object data = mapping(businessLog, config);
                template.save(data, collection);
                if (log.isDebugEnabled()) {
                    log.debug("save audit log to mongodb successfully!, message: {}",
                            StringEscapeUtils.escapeJava(TransformUtil.toJsonByJackson(businessLog)));
                }
            } else {
                log.warn("mongo log write log failed, mongoconfig is null");
            }
        } else {
            log.warn("mongo log write log failed, mongoTemplate is null");
        }
    }
  • 注意事项
    1. SSL方式连接,需要手动生成trustStore文件。
    2. 认证数据库必须为“admin”,之后再切换至业务数据库。