问题描述
我正在开发两个不同的spring boot服务,这将需要访问用户的MongoRepository公用集合。
为简单起见,我们有SpringBootApp1: User.java
@Document(collection = "user")
public class User {
@Id
private String id;
....
}
然后我得到的存储库为: UserRepository.java
public interface UserRepository extends MongoRepository<User,String> {
}
现在,我需要另一个应用程序SpringBootApp2来读取用户。我打算在第二项服务中执行相同的操作,但是随后我将拥有两个版本的User对象,一个在每个服务上定义,并且两个都试图从同一MongoRepository集合中读取。如果在一项服务中修改了一个User类,那么除了在这两个服务上都具有重复项或代码之外,另一个User类将不知道,并且它们将开始不同步。
解决方法
为什么需要SpringBootApp2再次读取User表?您可以在SpringBootApp1中公开一个API,该API可通过从App2调用来获取所需的数据。您可以将所有与数据库相关的操作保留在一个微服务或一个应用中,如果需要数据库中的数据,只需公开App1中的方法并从App2中调用即可。
更新: 如您所说,App1对集合进行READ-WRITE并仅授予经过身份验证的用户访问权限,而App2进行简单的READ-ONLY活动,在这种情况下,您可以在App2中使用JPA repo接口,并且仅使用read from集合方法已实施。实体不需要任何设置方法,也不需要为接口实现保存/更新方法。这种设计是无害的。您只是从两个不同的服务调用同一个数据库。没什么害处。无论如何,您总是在对App2中的集合进行全新查询。
否则,如果您也对此方法有疑问,并且如果您不想保留来自不同服务的多个数据库读取逻辑,那么(我不知道您的App1除了数据库操作之外还提供哪些其他功能)我建议您创建App3,该App3仅用于数据库操作。
在这种情况下:
- App1将执行与安全相关的操作以及其他服务
- 设计App3,它可以进行数据库操作,而无需任何直接的用户凭据或安全性
- App1将执行身份验证,并且在成功调用App3进行任何DB READ-WRITE工作时,App3不需要任何安全性
- App2将为任何数据库读取操作调用App3,App3不需要任何安全性