0

我有 3 个服务(3 个不同的项目,例如 ClientService、AggregationService、DataService)共享相同的域对象,其中只有一个(DataService)连接到 MongoDB 并将数据发送回其他 2 个服务。所有这些服务都是基于 Spring Boot

当我在各自的项目中保留域对象的单独 java 文件时,它一切正常,因为 ClientService 和 AggregationService 中的域对象没有 mongodb 注释,例如 @Document、@Field。

但是当我将域对象保存在一个公共模块中以便我不必维护 3 个副本时,ClientService 和 AggregationService 在启动期间开始抛出异常。尽管这些服务确实启动并正确返回了响应,但是当这些服务启动时也会出现异常。下面是域对象:

@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>

如果我删除此依赖项,则异常不会出现。保持跨项目共享的域对象的方法应该是什么?

4

1 回答 1

0

这是一个旧帖子,但需要答案。

首先,微服务不应该共享代码。当有需要跨域发送的对象时,我们应该使用每个微服务都应该拥有的 DTO 模式,并且该代码不应该被共享。这是推荐的做法。

来到 MongoDB 异常,这是 Spring Boot 应用程序的正常行为。当它在类路径中看到 MongoDB 并且在属性文件中没有配置时,它会在 localhost:27017 处查找 MongoDB 实例因此,如果我们不打算从微服务连接到 MongoDB,那么 MogoDB 驱动程序不应该出现在类中小路。

于 2020-08-20T02:04:08.100 回答