springboot连接mongodb集群(mongoTemplate)

2023-12-29 16:32:33


前言

单机版本的mongo,直接配置yml 就可以了

今天项目中遇到了需要连接mongo集群的问题,发现直接配置yml是无法实现的,百度了半天依然不行,最后参考了下另外一个成熟项目,尝试扒了下,特此记录;


一、单机版mongo的yml

  • springboot 2.7.1
  • pom 中springboot的mongo starter版本
    <dependency>
         <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-mongodb</artifactId>
          <version>2.3.12.RELEASE</version>
      </dependency>
  • yml配置
spring: 
  data:
    mongodb:
      host: 101.61.4.414
      port: 27017
      username: root
      password: root
      authentication-database: admin
      database: admin
  • 测试类
@SpringBootTest
public class MongoTem {

  @Autowired
  MongoTemplate mongoTemplate;

  @SneakyThrows
  @Test
  void ss() {
	   Query query = new Query();
	    query.addCriteria(Criteria.where("type").regex("app"));
	    // 符合条件的数据
	    List<Map> maps = mongoTemplate.find(query, Map.class, "111");
	}
}

二、springboot连接mongo集群

1.自定义yml参数

yml如下:

mongodb:
  uri: 101.10.66.17:27017,101.10.66.17:27018,101.10.66.16:27017
  database: 2222
  username: root
  password: root
  authenticationDatabase: root

pom如下:
springboot 2.7.1

     <dependency>
     	 <groupId>org.springframework.data</groupId>
         <artifactId>spring-data-mongodb</artifactId>
         <version>3.4.1</version>
     </dependency>
     <dependency>
         <groupId>org.mongodb</groupId>
         <artifactId>mongodb-driver-sync</artifactId>
         <version>4.6.1</version>
     </dependency>

2.定义一个配置文件,读取该配置,并重新注入MongoTemplate

代码如下:

@Configuration
public class MongoConfig {

  @Value("${mongodb.uri}")
  private String mongoUri;

  @Value("${mongodb.database}")
  private String database;

  @Value("${mongodb.username}")
  private String username;

  @Value("${mongodb.password}")
  private String password;

  @Value("${mongodb.authenticationDatabase}")
  private String authenticationDatabase;

  @Bean
  public MongoClient mongoClient() throws Exception {
    // 初始化连接 用户密码
    MongoCredential credential = MongoCredential
        .createScramSha256Credential(username, authenticationDatabase, password.toCharArray());

    // 解析集群ip:端口配置
    List<ServerAddress> serverAddresses = Stream.of(mongoUri.split(","))
        .map(cl -> cl.split(":"))
        .map(split -> new ServerAddress(split[0], Integer.parseInt(split[1])))
        .collect(Collectors.toList());

    // 设置MongoClient ip:端口  以及Cluster 类型
    Builder builder = MongoClientSettings.builder();
    builder.applyToClusterSettings((setting) -> {
      setting.hosts(serverAddresses);
      setting.requiredClusterType(ClusterType.REPLICA_SET);
    }).credential(credential).build();
    return new MongoClientImpl(builder.build(),
        MongoDriverInformation.builder().driverName("sync").build());
  }

  @Bean
  public MongoTemplate mongoTemplate() throws Exception {
    MongoClient mongoClient = mongoClient();
    // 利用集群配置,重新覆盖MongoTemplate
    MongoDatabaseFactorySupport factory = new SimpleMongoClientDatabaseFactory(mongoClient, database);
    return new MongoTemplate(factory);
  }
}

3.集群配置完毕,正常使用 MongoTemplate

代码如下:

@SpringBootTest
public class MongoTem {

  @Autowired
  MongoTemplate mongoTemplate;

  @SneakyThrows
  @Test
  void ss() {
	   Query query = new Query();
	    query.addCriteria(Criteria.where("type").regex("app"));
	    // 符合条件的数据
	    List<Map> maps = mongoTemplate.find(query, Map.class, "111");
	}
}

总结

对于mongo的集群,是不支持直接配置的,需要手动配置,解析集群连接信息,然后重新利用配置的MongoClient,覆盖掉原有的 MongoTemplate,这样就能继续使用 MongoTemplate了;
其中版本需要对应上,此文所用版本为 spring-data-mongodb :3.4.1 mongodb-driver-sync: 4.6.1

文中涉及所有代码: mongo集群连接示例

发现一个连接集群的简化版本:
代码如下:

@Configuration
public class MongoConfig {

  @Value("${mongodb.uri}")
  private String mongoUri;

  @Value("${mongodb.database}")
  private String database;

  @Value("${mongodb.username}")
  private String username;

  @Value("${mongodb.password}")
  private String password;

  @Value("${mongodb.authenticationDatabase}")
  private String authenticationDatabase;
  
  /**2. 利用 MongoClients 初始化连接**/
  // 标准集群url如下 mongodb://用户名:密码@ip:port,ip:port,ip:port/?验证数据库信息
  // mongodb://root:root@101.10.66.17:27017,101.10.66.17:27018,101.10.66.16:27017/?authSource=root
  
  @Bean
  public MongoClient mongoClient() {
    return MongoClients.create(String.format("mongodb://%s:%s@%s/?authSource=%s",username,password,mongoUri,authenticationDatabase));
  }

  @Bean
  public MongoTemplate  mongoTemplate(){
    return new MongoTemplate(mongoClient(),database);
  }

}

文章来源:https://blog.csdn.net/qq_32419139/article/details/134857749
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。