当前位置: 首页 > 知识库问答 >
问题:

DDD和微服务-数据流和结构

锺离慈
2023-03-14

我正在尝试创建一个简单的博客平台,同时了解有关DDD和微服务的更多信息,因此我想在此上下文中向您询问两个建议:

    < li >我在我的项目中假设的一个业务规则是,只有角色为< code > publicis 和< code>Administrator的用户才能创建帖子,但是由< code > publicis 创建的帖子在发布之前必须首先得到< code>Administrator的批准。在我的理解中,这是<代码>帖子的一部分。域,所以在< code>Post聚合(同时也是实体)中,我将Post状态的更改封装到像< code > SetPublishedStatusBy 这样的方法中,这些方法将< code >用户(请求者)数据作为参数,并评估上述规则(创建域事件)。然而,现在我有些怀疑关于请求者的信息是否真的是< code >帖子的一部分。域。也许应该在不同的地方评估请求者,比如< code >帖子。API或其他一些服务,然后在完成后不带参数地调用< code>SetPublishedStatus? < li >让我们继续讨论以上内容。除了< code>Posts微服务,我还在开发独立的< code>Users微服务,负责存储用户,并为< code>Administrator提供一些管理用户的工具。当用户想要发布一个新帖子时,什么是合适的数据流呢?我可以这样想象:
    < li >客户端向网关发送带有发布ID的< code>PublishPost命令 < li >网关验证来自HTTP请求的用户(可能通过带有JWT的cookie完成) < li >网关向< code > post 微服务发送< code>PublishPost命令 < Li > < code > post 微服务调用< code>Users微服务从DB获取相关用户数据 < Li > < code > post 微服务按ID从数据库中检索post < li >所有业务规则都通过< code >帖子进行评估。域,并且状态更改为< code >公共 < Li > < code > post 如果一切正常,微服务将更新数据库,并通知网关发送< code >成功 HTTP响应

共有1个答案

聂建茗
2023-03-14

我的想法...

对于DDD,在与领域专家讨论时,最好从领域的泛在语言中获得指导。

“SetPublishedStatusBy”一词可能不会出现在讨论中。

我认为这次讨论最有可能的结果是:

  • 管理员并发布帖子。
  • 公关人员可以提交管理员在发布之前必须批准的帖子。
  • 管理员可以批准已由公关人员提交的已提交帖子,这将导致该帖子被发布。
  • 管理员可以拒绝提交的帖子。

我的帖子聚合最终会看起来像:

class Post
{
    void Submit()
    {
        this.Status = Submitted;
    }
    void Publish()
    {
        this.Status = Published;
    }
    void Approve()
    {
        if (this.Status != Submitted) throw "This post is not pending approval.";
        this.Status = Published;
    }
    void Reject()
    {
        if (this.Status != Submitted) throw "This post is not pending approval.";
        this.Status = Rejected;
    }
}

创建帖子时,UI将根据上下文在API中调用Publish或Submit。然后,API将检查当前用户是否可以执行请求的发布或提交。

其他两个选项:

  1. 引入一个名为Post请求的聚合,公关人员有权创建它,并且只有在管理员批准时才能创建帖子。
  2. 如果您希望规则更具动态性,即用户只需点击“发布”,无论他们是公关人员还是管理员,然后根据当天的规则,结果是发布的帖子或提交的帖子,那么您需要在您的API和可以与用户服务交互的Aggregate之间建立一个编排/传奇/任务层,以决定对帖子服务的第一次调用应该是“提交”还是“发布”。
 类似资料:
  • 不过,当我发现有必要的时候,我开始稍微尝试应用概念。我发现仍然有许多我不能甚至不考虑应用到我的应用程序中,其中一些是:适配器、命令(CQR?)、事件… 除此之外,我还有点纠结于与六角形建筑有关的东西。我试图应用外部行为应该依赖于内部的定义,所以基础结构层->应用程序层->领域层 在本例中,我将应用程序层中的服务定义为以下LoginService示例:

  • 我读过萨姆·纽曼的《微服务》一书,在关于分裂整体的一章中,他举了一个“打破外键关系”的例子,他承认跨API进行连接会更慢--但他接着说,如果你的应用程序足够快,它比以前慢有关系吗? 这似乎有点油嘴滑舌?人的经历是什么?您使用了哪些技术来使API联接执行得令人满意?

  • 我正在从事一个基于微服务架构的大型项目,所以考虑一下我有10个服务,其中一些有自己的数据库,这些数据库采用不同的技术(mysql、mongodb、elastic等) 那么,备份和恢复服务集合的最佳做法是什么? 真正的问题是这些数据库相互关联,例如,在我的逻辑后端服务器中,我保留来自oauth服务器的每个用户的oauhId, 现在考虑分别恢复这两个数据库,现在logic server中的my use

  • 我经常听说,在微服务架构中,对于每一个微服务,我们都必须创建单独的数据库。 但是,如果我必须在不同的数据库中维护外键约束,这是不可能的。就像我在身份验证微服务中有一个用户表,我想在我的目录服务中使用它(用户表中的用户 ID 列) 那么如何解决呢。 感谢提前

  • 我想知道你是否能帮忙。我正在编写一个订单系统,目前已经实现了一个订单微服务来处理下订单。我正在使用DDD与事件源和CQRS。 订单服务本身接收生成事件的命令,实际的订单服务侦听自己的事件以创建读取模型(这里的想法是使用CQR,因此用于写入的命令和用于读取的查询) 在执行上述操作后,我遇到了一个问题,可能只是我没有完全理解正确的方法。 一个订单实际上有依赖项,这意味着一个订单需要一个客户和一个产品。

  • 我不清楚如何取回购买服务不保存的数据--例如:用户的全名。当试图通过购买用户名进行更复杂的搜索购买时,问题会变得更严重。 我认为,显然可以通过在两个服务之间同步用户来解决这个问题,方法是在用户创建时广播某种类型的事件(并在购买服务端只保存相关的用户属性)。在我看来,这远非理想。当你有数百万用户时,你如何处理这个问题?您会在每个使用用户数据的服务中创建数百万条记录吗? 另一个明显的选择是在用户服务端