我对我的英语感到抱歉。有一个大型 java 项目(spring、hibernatne 等)具有 monolite 架构。我们将其命名为核心。添加新功能是一项艰苦的工作,因此我们接受了从核心中创建新功能,然后通过 http(REST api) 链接它们的决定。现在有核心和围绕它的许多“服务”,但核心和服务只有一个数据库。服务之间不会传输任何数据。他们作为恶魔工作,或者核心向他们提出要求。当核心调用任何服务时,会发生以下情况:服务收到请求,直接向数据库进行 SQL 查询,对接收到的数据执行自己的逻辑并将结果返回给核心。我认为使用公共(public)数据库是一种不好的做法,因此我想关闭对数据库任何服务的直接完全访问。
我有两个想法:
- 为了进行修改,我想使用事件(创建、更新、删除)和 boker(ActiveMQ、RabbitMQ)
对于阅读,我有以下 3 个选择之一:
2.1。为核心端的每个选择查询创建内部 API(这不是一个好的选择,因为我们不想经常重新编译核心)
2.2。让服务直接从DB读取数据
2.3。将 sql 查询打包到“服务”端的某个对象中并将其发送到核心,在那里查询将被解包并执行,结果将作为 JSON 数组发送回客户端。另外,在核心方面,我将检查它是否只是“选择”查询。
我想问你一个问题:
- 像这样将读取和修改分开是一个好的选择吗?
- 您可以推荐我哪些阅读选项?
- 如果我选择 2.3 选项进行阅读,您可以推荐我什么框架吗?我已经开始关注 JOOQ,但它可能根本不适合
谢谢
最佳答案
正确的方法是让服务独立工作,每个服务都有自己的数据库和队列,但您也可以使用外部提供程序,这可能是您当前的数据库。
使用事件在源数据库中进行数据更改是错误的,因为事件是已经发生的操作。事件就像触发器一样,即使您可以保留它们携带的数据,您也应该只在您的服务中实现数据冗余,即:运输服务需要知道客户端地址,以便它保留自己的该地址的副本,即使尽管地址存储在客户端服务中。
现在回到你的问题:
- 您可以将阅读和写作分开,但不能按照您描述的方式进行
- 选项 2.2 是更正确的选项。
- 为了阅读,请使用 JDBC 或一些精益的 orm,例如 Dapper
关于java - 项目架构,在核心和服务之间传输数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36811249/