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进行投诉反馈,一经查实,立即删除!