在构建面向微服务的应用程序时,我想知道什么是适当的微服务粒度。
让我们成像一个包含以下内容的应用程序:
一组各种资源类型,其中每个资源映射给定的业务模型。 (例如:在todo app资源中可能是User,TodoList和TodoItem ......)
每个资源都保存在可以复制的NoSQL数据库中。
每个资源都通过REST Api
该应用程序管理内部聊天室。
用于收集聊天室和REST api交互的Api网关。
应用程序前端:连接到API网关的SPA应用程序
在考虑微服务如何满足此应用程序的需求时,第一种(和天真的)方法是:
另一种方法可能是将服务1拆分为与系统中存在的业务模型一样多的服务。(让我们将这些服务称为资源服务)
我想知道第二种方法有什么好处。 事实上,我认为这种方法存在很多缺点:
当开始一个新项目时,第二种方法对我来说是一种过度设计的工作。
我觉得从第一种方法开始,然后根据观察到的需求将整体资源服务拆分为几个特定服务,将最小化复杂性和风险。
您对此的看法是什么? 有没有最好的做法?
非常感谢!
答案 0 :(得分:2)
根据定义,第一种方法不是微服务方式。
是的,想法是拆分 - 有界上下文的每个服务 - 一个用户,一个用于库存,待办事等等。
微服务的想法非常简单,假设:
适当地改进微服务架构可以大幅度减少维护和开发时间,但它需要非常严重的理由使用它(有很多原因,很多文章,我不会在这里开始)和非常严重的投资在开始。
它带来了模块化,所有权概念,应用程序不同上下文的分离。
我的个人建议检查您是否真的需要MS架构。如果你不能投资engenerring并开始努力,并没有适当的理由这样的系统 - 为什么要打扰?
如果你确实需要MS,我会建议不要使用第一种方法。您将开发错误的东西,将错过MS的真正挑战,并可能以巨大的重构结束,这可能比开始正常的MS系统需要更多的工作。它喜欢制作正方形以使其适合圆桶。
现在回答您的问题标题:粒度。(您的问题与您的帖子标题略有不同)。
将其附加到域模型/有界上下文。您可以在开始时制作内容丰富的服务,以避免复杂的分布式事务。
首先回答问题,如果你的设计/架构需要它们? 如果没有,可能你做了一个很好的设计。 在不同微服务的模型之间传递参考ID应该足够了,如果没有,请尝试重新考虑是否可以避免更复杂的事务。
如果您的系统具有不可避免的分布式传输量,可能会考虑使用/制作一些CQRS迷你框架作为您的共享代码基础架构组件" /通信协议。
答案 1 :(得分:0)
这是微服务或任何其他SOA方法的关键问题。这是理论与现实相遇的地方。通常,您不应为此而强制使用微服务架构。这自然应该来自功能分解(自上而下)和运营,技术,开发需求(自下而上)。第一种方法更接近您需要做的事情,但是第一步不要过多地关注技术方面。问自己,为什么需要针对特定业务功能实施单独的服务。利用其所有技术资源,将其视为微型应用程序。问问自己是否有理由将特定功能实现为全栈应用程序。