Kubernetes部署Spring Boot服务无MongoDB配置仍自动初始化连接报错
问题排查及解决方案
前置报错日志
2021-11-23 14:45:46 INFO [,,] Located property source: [BootstrapPropertySource {name='bootstrapProperties-configmap.api-products.default'}] 2021-11-23 14:45:47 INFO [,,] The following profiles are active: kubernetes 2021-11-23 14:45:48 INFO [,,] Bootstrapping Spring Data MongoDB repositories in DEFAULT mode. 2021-11-23 14:45:48 INFO [,,] Finished Spring Data repository scanning in 5 ms. Found 0 MongoDB repository interfaces. 2021-11-23 14:45:49 INFO [,,] BeanFactory id=15b1d6de-94f9-35c9-8f2b-4562a7a1e1e6 2021-11-23 14:45:49 INFO [,,] Bean 'io.kubernetes.client.spring.extended.manifests.config.KubernetesManifestsAutoConfiguration' of type [io.kubernetes.client.spring.extended.manifests.config.KubernetesManifestsAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2021-11-23 14:45:49 INFO [,,] Bean 'io.kubernetes.client.spring.extended.network.config.KubernetesLoadBalancerAutoConfiguration' of type [io.kubernetes.client.spring.extended.network.config.KubernetesLoadBalancerAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2021-11-23 14:45:50 INFO [,,] Tomcat initialized with port(s): 8080 (http) 2021-11-23 14:45:50 INFO [,,] Starting service [Tomcat] 2021-11-23 14:45:50 INFO [,,] Starting Servlet engine: [Apache Tomcat/9.0.53] 2021-11-23 14:45:50 INFO [,,] Initializing Spring embedded WebApplicationContext 2021-11-23 14:45:50 INFO [,,] Root WebApplicationContext: initialization completed in 3348 ms 2021-11-23 14:45:52 INFO [,,] Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms'} 2021-11-23 14:45:52 INFO [,,] Exception in monitor thread while connecting to server localhost:27017 com.mongodb.MongoSocketOpenException: Exception opening socket at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-4.2.3.jar!/:na] at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:143) ~[mongodb-driver-core-4.2.3.jar!/:na] at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:188) ~[mongodb-driver-core-4.2.3.jar!/:na] at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144) ~[mongodb-driver-core-4.2.3.jar!/:na] at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na] Caused by: java.net.ConnectException: Connection refused (Connection refused) at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na] at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na] at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[na:na] at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[na:na] at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:na] at java.base/java.net.Socket.connect(Socket.java:609) ~[na:na] at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:107) ~[mongodb-driver-core-4.2.3.jar!/:na] at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[mongodb-driver-core-4.2.3.jar!/:na] at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-4.2.3.jar!/:na]
1. 未配置MongoDB却自动触发连接报错
原因
Spring Boot 默认开启自动装配机制,只要项目ClassPath中存在MongoDB相关依赖(如spring-boot-starter-data-mongodb、mongodb-driver-core),即便没有手动添加MongoDB配置,MongoAutoConfiguration自动配置类也会生效,默认尝试连接localhost:27017的MongoDB实例。
解决方案
- 若业务确实不需要使用MongoDB,直接在项目依赖管理文件(pom.xml/build.gradle)中移除所有MongoDB相关依赖即可
- 若MongoDB依赖是其他组件传递引入无法直接移除,可主动禁用MongoDB自动配置:
方式一:在启动类注解中排除自动配置类
方式二:在配置文件中添加排除规则@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
2. 预配置端口8000未生效,实际启动为8080
原因
从日志可确认服务激活了kubernetes配置 profile,且加载了default命名空间下的api-products ConfigMap作为配置源。Spring Boot 外部配置源(K8s ConfigMap/Secret、环境变量)的优先级高于Jar包内的配置文件,出现该问题的原因通常为:
- ConfigMap中配置了
server.port=8080,覆盖了Jar包内的端口配置 - Jar包内的
server.port=8000仅配置在非kubernetes的profile段,激活kubernetesprofile后未读取到对应配置
解决方案
- 检查
default命名空间下api-productsConfigMap的内容,若存在server.port=8080配置,修改为8000即可 - 若ConfigMap中无端口配置,检查项目配置文件,在
kubernetesprofile对应的配置段补充server.port=8000 - 也可直接在Deployment的env字段添加环境变量
SERVER_PORT=8000,环境变量优先级更高,可直接覆盖所有配置文件的端口设置
内容的提问来源于stack exchange,提问作者user3415721
相关产品推荐
相关产品推荐

