PHP,DDD,CQRS,Event Sourcing,Kubernetes,Docker,Golang

0%

本篇博文由本博客(http://www.veitor.net)经原文翻译,转载请注明出处。

聚合可能是领域驱动设计中最困难的构建块。它们很难理解,甚至难以正确设计。但是不用担心,我们在这里给你提供帮助。在进入聚合之前,我们需要先了解一些关键概念:事务和并发策略。

阅读全文 »

本篇博文由本博客(http://www.veitor.net)经原文翻译,转载请注明出处。

你已经了解了实体和值对象了。作为基本构建块,他们应该包含了任何应用的大部分业务逻辑。但是,在一些场景中值对象和实体并不是一个最好的解决方案。让我们看一下Eric Evans在他的《Domain-Driven Design: Tackling Complexity in the Heart of Software:》书中说的话:

当领域中的一个重要过程或转化不是实体或者值对象的自然职责时,增加一个操作作为一个单独的接口,此时该接口被声明为Service领域服务。根据模型的通用语言定义接口,并确保名称是通用语言中的一部分,是服务成为无状态。

阅读全文 »

本篇博文由本博客(http://www.veitor.net)经原文翻译,转载请注明出处。

我们已经讨论过了尝试将领域中的任何事物首先建模成值对象。但是当领域建模时,你可能会发现通用语言中一些概念需要一个身份。

阅读全文 »

本篇博文由本博客(http://www.veitor.net)经原文翻译,转载请注明出处。

通过使用self关键字,我们不会将”值对象”作为领域驱动设计的基本构建块,而是在代码中将它们作为你通用语言的概念。一个值对象在你的领域中不仅仅是一个东西,它能够度量、量化或者描述一些信息。值对象可以看作是小的简单对象(如金钱或者日期范围),它们不像实体(Entity)通过身份标识来进行区分,而是根据其所持有的内容来做区分。

阅读全文 »

SNI:在同一个IP地址上运行多个SSL证书

什么是Server Name Indication(SNI)?SNI是SSL的重要组成部分,它允许多个网站存在同一个IP地址上,如果没有SNI,每个域名都需要有自己的一个IP才能安装SSL证书。然而,SNI解决了这个问题。

阅读全文 »

背景

你已经应用了一个服务一个数据库的模式,每个服务都有自己的数据库。但是一些事务需要跨服务,因此你需要一种机制来保证跨服务的数据一致性。假设你正在建设一个电子商城,客户有其信用额度。应用必须确保新订单不会超过该客户的可用额度限制。因为订单和客户信息在不同的数据库中,因此应用不能简单的使用ACID事务。

阅读全文 »

背景

我们假设你正在使用微服务架构来开发一个在线商城应用。大多数服务需要用某种数据库来持久化数据,如:订单服务存储关于订单的数据,客户服务存储客户相关的数据。

customersandorders.png

阅读全文 »

CQRS/ES下,许多开发者不了解如何在系统中处理这样的场景:

在用户创建的时候,我们想要去验证用户名在数据库中是否是唯一的。我应该使用Event Store还是使用读数据库查询?我该在哪执行这个查询?

这个问题是StackOverflow上与CQRS话题有关的最受关注的话题。因此在这篇文章中,我们将尝试针对这个问题寻找出最佳解决方案。

阅读全文 »

经常能看到在一些书本和文章中写到hydration,这一单词单独去翻译为“水合”、“水合作用”等,但放在文章中又似乎读不同,难以理解。

通过查阅了更多的信息之后,hydration的大致意思基本了解了。

可以理解为对象提供水分,为什么对象呢?就是刚实例化的对象。并且我们最常见提到“水合”的地方就是刚从数据库或其他存储介质中取出数据填充到对象上。

那么这种一个已经在内存中实例化的对象,还没有包含任何数据,然后用数据(例如从数据库、网络、文件系统等获取的)填充到该对象内,这种行为成为hydration水合。

常见的一种水合方式就是序列化和反序列化了,如在PHP中对对象进行serializeunserialize,此时的反序列化==实例化+水合

将类的继承层次表示为单张数据表,这张表内含有每个类的所有字段

classInheritanceTableSketch.gif

关系数据库不支持继承,当对象映射到数据库时,我们必须考虑如何在关系数据表中良好的展示我们的对象继承结构。当对象映射到关系数据库时,在多张表中处理继承结构过程中,我们尝试着去尽量减少迅速增加的join查询。(参考类表查询)。单表继承将所有类的继承结构的所有字段映射到了一张表中。