Web services 微服务粒度:是否按域模型?

Web services 微服务粒度:是否按域模型?,web-services,rest,microservices,Web Services,Rest,Microservices,在构建面向微服务的应用程序时,我想知道什么是合适的微服务粒度 让我们想象一个应用程序,包括: 一组不同的资源类型,其中每个资源映射一个给定的业务模型。(例如:在todo应用程序中,资源可以是用户、TodoList和TodoItem…) 这些资源中的每一个都保存在可以复制的NoSQL数据库中 这些资源中的每一个都是通过RESTAPI公开的 该应用程序管理一个内部聊天室 用于收集聊天室和REST Api交互的Api网关 应用程序前端:连接到API网关的SPA应用程序 在考虑微服务如何满足此应用

在构建面向微服务的应用程序时,我想知道什么是合适的微服务粒度

让我们想象一个应用程序,包括:

  • 一组不同的资源类型,其中每个资源映射一个给定的业务模型。(例如:在todo应用程序中,资源可以是用户、TodoList和TodoItem…)

  • 这些资源中的每一个都保存在可以复制的NoSQL数据库中

  • 这些资源中的每一个都是通过RESTAPI公开的

  • 该应用程序管理一个内部聊天室

  • 用于收集聊天室和REST Api交互的Api网关

  • 应用程序前端:连接到API网关的SPA应用程序


在考虑微服务如何满足此应用程序的需求时,第一种(也是最天真的)方法是:

  • 一个用于管理所有资源和业务逻辑的整体式服务: 通过管理,我的意思是为所有这些资源提供RESTAPI,并在数据库中处理这些资源的持久性
  • 每个数据库副本一个服务
  • 一种使用websocket或其他任何方式提供内部聊天室的服务
  • 一个用于身份验证的服务
  • api网关的一个服务
  • 为SPA前端的静态资产提供一项服务

  • 另一种方法是将服务1拆分为系统中存在的业务模型数量相同的服务。(我们称这些服务为资源服务)

    我想知道第二种方法的好处是什么。 事实上,我看到这种方法有很多缺点:

    • 需要设置服务间通信过程
    • 当请求表示与资源Y有关系的资源X的服务时,需要做更多的工作(即:服务间请求)
    • 更多的devops工作
    • 在资源服务之间共享公共代码更加困难
    • 业务逻辑放在哪里

    当开始一个新的项目时,第二种方法对我来说是一种过度设计的工作

    我想从第一种方法开始,然后根据观察到的需求将monolith资源服务拆分为几个特定的服务,这样可以最大限度地降低复杂性和风险

    你对此有什么看法? 有什么最佳实践吗


    非常感谢

    根据定义,第一种方法不是微服务方式

    是的,我们的想法是将每个服务拆分为有限的上下文,一个用于用户,一个用于库存,待办事项等

    微服务的概念非常简单,假设:

  • 您希望为模块化支付额外的开发操作费用,并尽可能地完成/删除不同有界上下文之间的依赖关系(请参阅dev/product/pjm团队)
  • 它的思想是围绕所有权、模块化,允许独立的团队开发自己的代码,而不需要他们了解系统的其余部分。只要有通用语言(通用的一套约定/通信协议/术语/文档),它们就可以以完全隔离、自动的方式工作
  • 维护、管理、测试和开发变得更快——初始开发运营成本和复杂的架构工程投资
  • 共享代码应该是最少的,如果需要,可以表示umbiguouse语言(公共通信接口/约定集)。共享文档化的代码,作为集成/基础架构的迷你框架,并将特殊的开发/开发操作/团队连接到it上,只要it(如我所说)文档化良好,并作为独立的架构相关子项目进行威胁,那么这将是一件容易的事情
  • 适当工程化的微服务体系结构可以极大地减少维护和开发时间,但它需要非常认真的理由来使用它(有很多理由,关于这方面的文章很多,我不会在这里开始),并且一开始就需要相当认真的工程投资

    它带来了模块化、所有权概念、应用程序不同上下文的解耦

    我个人的建议是检查您是否真的需要MS架构。若你们不能在一开始就投入能源和开发运营的努力,并且并没有合适的理由建立这样的系统,为什么还要麻烦呢

    如果您确实需要MS,我真的建议不要使用第一种方法。您将开发错误的东西,将错过MS的真正挑战,并可能以巨大的重构结束,这可能需要比从一开始就正确地工程化MS系统更多的工作。这就像把它做成方形,以便以后能装进圆形的桶里

    现在回答您的问题标题:粒度。(您的问题正文与您的文章标题有点不同)

    将其附加到域模型/有界上下文。为了避免复杂的分布式事务,您可以在开始时提供丰富的服务

    首先,如果您在设计/架构中需要它们,请回答问题? 如果不是,可能你设计得很好。 在来自不同微服务的模型之间传递引用ID应该足够了,如果不行,请尝试重新考虑是否可以避免更多复杂的事务


    如果您的系统不可避免地存在大量的分布式事务,那么可以考虑使用/制作一些CQRS迷你框架作为“共享代码基础结构组件”/通信协议

    这是微服务或任何其他SOA方法的关键问题。这是理论符合现实的地方。一般来说,您不应该为了它而强制使用微服务体系结构。这应该很自然地来自功能分解(自上而下)和操作、技术、开发和运营需求(自下而上)。第一种方法更接近您需要做的事情,但是在第一步,不要太关注t