我使用基于单个数据库的多个微服务进行项目,其中包含许多模式.每个数据库模式都有一个微服务,这没有多大意义,因为有些模式只有两个表.一些微服务只执行非常简单的CRUD操作,在我看来,这不一定是微服务.例如:contactDetailsaddress.

现在我需要实现一个利用这些服务的Web应用程序.建议使用REST构建API网关,并将请求转发到各个微服务来获取数据,并将其聚合到单个JSON中并返回到前端.一些API需要来自五个以上微服务的数据,这只是数据库中的一条SELECT语句.我认为,当传入流量变得很高时,这可能会影响性能,也会增加服务之间的通信开销.我可以对少数调用使用并行化,但有些调用是相互依赖的.因此,它是连续的.

以下是我的建议:

  • 直接使用具有跨模式的View/SP的数据库,并调用处理共享逻辑和繁重操作的微服务.因为它是一个单一的数据库,短期内没有计划 for each 微服务提供一个单一的数据库.如果发生这种情况,最好的办法是重新设计数据库.
  • 使用GraphQL网关
  • 将所需数据同步到NoSQL/内存优化表,因为新的Web应用程序主要是只读应用程序.

我想就这件事得到一些反馈.我坚信这个设计目前是不可行的.但是,进行五个以上的内部服务调用来获取一个简单的数据集是没有意义的

谢谢!

推荐答案

对于您在问题中描述的这种特定情况,我建议从您的新服务/Web应用程序直接访问数据库.

每当我们谈论微服务和数据所有权时,并不一定意味着所有数据访问都应该通过相关微服务的一个端点来完成.在这种情况下,所有权意味着所有数据操作都应该通过相关的微服务来完成.换句话说,直接从数据源获取数据并不违反数据所有权原则.

我已经在 comments 区问过,有没有什么转换逻辑.如果有的话,那么直接访问也需要执行相同的操作.根据您在这里的 comments ,情况并非如此.


关于这个话题的更多信息,我强烈推荐阅读Monolith to Microservices book's 4th Chapter.

.net相关问答推荐

为什么$NULL在ForEach-Object{}和Foreach()中的行为不同?

.NET Blazor-使用子组件中的处理程序方法进行双向数据绑定

如何使用AWS Lambda函数制作网络挂钩?

在接口内部声明 IEnumerable 而在具体类中声明 IList

AsyncLocal 的语义与逻辑调用上下文有何不同?

我可以使用 UriTemplate 将非字符串传递给 WCF RESTful 服务吗?

BackgroundWorker 中未处理的异常

如何以编程方式 Select ListView 中的项目?

在 Moq Callback() 调用中设置变量值

LINQ 性能常见问题解答

什么决定了 Path.GetTempPath() 的返回值?

如何退出所有正在运行的线程?

没有 @Html.Button !

如何在多个解决方案之间共享相同的 Resharper 设置,无需人工干预?

等效于 C# 在 powershell 中的使用关键字?

Visual Studio 类图不显示关系

CI服务器的比较?

如何以编程方式删除 WebClient 中的 2 个连接限制

判断对象列表是否包含具有特定值的属性

如果锁定的对象内部发生异常,它会保持锁定状态吗?