我有3个服务(3个不同的项目,例如客户服务,汇总服务,dataService),它们共享相同的域对象,其中只有一个(dataService)连接到mongoDB并将数据发送回其他2服务。所有这些服务都是基于春季启动的
当我保留保存在各个项目中的域对象的单独的java文件时,这一切都很好,因为clientservice和gentregationservice中的域对象没有mongoDB注释,例如@document, @field。
但是,当我将域对象保存在一个通用模块中时,我不必维护3个副本,客户服务和聚合服务在启动过程中开始抛出异常。尽管这些服务确实启动并正确返回响应,但是当这些服务启动时,例外也出现了。以下是域对象:
@Document(collection = "transformed_categories")
public class Category extends ResourceSupport {
@Field("id")
private String customId;
private String name;
private String type;
}
例外:
2017-02-27 15:10:41.098 INFO 9052 --- [ main] c.c.delivery.CleintServiceApplication : Started CleintServiceApplication in 3.47 seconds (JVM running for 3.918)
2017-02-27 15:10:41.895 INFO 9052 --- [localhost:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server localhost:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.connection.SocketStream.open(SocketStream.java:63) ~[mongo-java-driver-3.4.1.jar:na]
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) ~[mongo-java-driver-3.4.1.jar:na]
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113) ~[mongo-java-driver-3.4.1.jar:na]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_05]
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_05]
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_05]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) ~[na:1.8.0_05]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_05]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_05]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_05]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_05]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_05]
at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:57) ~[mongo-java-driver-3.4.1.jar:na]
at com.mongodb.connection.SocketStream.open(SocketStream.java:58) ~[mongo-java-driver-3.4.1.jar:na]
... 3 common frames omitted
我找到了引起问题的确切位置。问题是由Maven依赖性引起的,我将我打算保留所有域对象的公共图书馆项目中添加了。
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.10.0.RELEASE</version>
</dependency>
如果我删除了此依赖性,那么例外就不会出现。在整个项目中共享域对象的方法应该是什么?
这是一个旧帖子,但需要答案。
首先,微服务不应共享代码。当有域对象需要发送的域对象时,我们应该使用DTO模式,该模式应由每个微服务所有,并且该代码不应跨越。这是推荐的练习。
来到MongoDB例外,这是Spring Boot应用程序的正常行为。当它在类路径中看到mongodb并且在属性文件中没有配置时,它将在localhost上寻找mongoDB实例:27017因此,如果我们不打算通过微服务连接到MongoDB,那么MogoDB驱动程序不应在类路径中存在。