mongodb - 如何从spring boot连接到k8s mongodb端点
问题描述
我有一个部署在 Kubernetes 中的 spring boot 应用程序,需要连接到集群外部托管的 mongodb 服务器。根据https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-mapping-external-services中指定的 Kubernetes ,我为我的 mongodb 服务器创建了 Kubernetes 服务和端点。现在我的 Spring Boot 应用程序需要连接到这个端点。我试过以下
-- 添加 uri 到 application.properties
spring.data.mongodb.uri=mongodb://mongo
-- 从 spring 显式定义 mongodb 客户端
@Configuration
@Slf4j
public class AppConfig {
@Autowired
DiscoveryClient discoveryClient;
public @Bean MongoClient mongoClient() {
MongoClientURI mongoClientURI = new MongoClientURI("mongodb://mongo");
return new MongoClient(mongoClientURI);
}
}
但我的应用程序不断抛出错误
com.mongodb.MongoSocketException: mongo: Try again
at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211) ~[mongo-java-driver-3.11.2.jar:na]
at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75) ~[mongo-java-driver-3.11.2.jar:na]
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongo-java-driver-3.11.2.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128) ~[mongo-java-driver-3.11.2.jar:na]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongo-java-driver-3.11.2.jar:na]
at java.base/java.lang.Thread.run(Thread.java:835) ~[na:na]
Caused by: java.net.UnknownHostException: mongo: Try again
at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) ~[na:na]
at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929) ~[na:na]
at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515) ~[na:na]
at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848) ~[na:na]
at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505) ~[na:na]
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364) ~[na:na]
at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298) ~[na:na]
at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203) ~[mongo-java-driver-3.11.2.jar:na]
... 5 common frames omitted
我的项目中有以下依赖项
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-kubernetes-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-kubernetes-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-ribbon</artifactId>
</dependency>
解决方案
经过一番搜索,我能够如下连接,
public @Bean MongoClient mongoClient() {
List<ServiceInstance> mongo = discoveryClient.getInstances("mongo");
List<ServerAddress> mongoAddressList = new ArrayList<>();
for (ServiceInstance serviceInstance : mongo) {
ServerAddress serverAddress = new ServerAddress(serviceInstance.getHost());
mongoAddressList.add(serverAddress);
}
MongoClientURI mongoClientURI = new MongoClientURI("mongodb://mongo");
return new MongoClient(mongoAddressList);
}
这是有效的,但不知道这是否是最好的方法。
推荐阅读
- ffmpeg - 将 AVPackets 复用到 mp4 文件中 - 重新审视
- stm32 - STM32半回调未调用
- python-3.x - 大量的 sympy lamdify 问题
- c# - 在单击一行数据网格中的按钮时,隐藏另一行上的按钮
- node.js - 我怎么知道猫鼬文档匹配过滤器
- c# - 在渲染页面之前添加叠加层
- c# - AddAdoptionDetails' 不是类型过滤操作的有效元数据类型。类型过滤仅对实体类型和复杂类型有效
- .htaccess - Nuxt JS 服务器部署 - 如何使用 htaccess 将 URL 重定向到 localhost:3000
- javascript - Retrive complex data with jquery from dropdown object in ASP.NET MVC
- python - 字符串操作,然后将虚拟变量应用于它们