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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
    	本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!