这个案例演示了如何应用领域驱动设计和六边形/干净架构来构建微服务。
以下部分描述了如何使用域驱动和六边形/干净架构构建图书馆管理系统:
以下是将为图书馆管理系统实现的主要用户故事列表:
- 作为一名图书馆管理员,我想将一本书添加到馆藏中,以便图书馆的顾客可以借阅它。
- 作为图书馆管理员,我想从馆藏中删除一本书,使其不再可供借阅。
- 作为图书馆管理员或读者,我希望根据不同的条件(例如书名、作者、出版商、日期等)搜索书籍,以便我可以查看详细信息或稍后使用它来结账。
- 作为赞助人,我想借出一本书,以便我可以阅读并稍后返回。
- 作为顾客,我想在读完一本借出的书后归还。
- 作为订阅者,我想保留一本书,目前还没有,以便我稍后可以结账。
- 作为订阅者,我想取消之前当我对这本书不再感兴趣时所保留的内容。
- 作为赞助人,我想借阅之前制作的书架,以便我可以阅读。
此外,图书馆可能会对图书和借阅/保留操作施加某些政策和限制,例如研究人员顾客可以保留受限制的图书或限制一次可以保留或借出的图书数量。它是用 Rust 实现的,并使用AWS Dynamo DB、AWS SNS、AWS CloudWatch和AWS Lambda来构建现代微服务。
示例域驱动应用程序还使用AWS CDK将基础设施作为代码进行管理,以便您可以在所有环境中一致地部署服务。
您可以从https://github.com/bhatti/ddd-sample-microservice下载示例应用程序。
在软件设计中,模块化设计通过将功能分解为独立的模块来促进构建大型系统,其中每个模块为其实现的行为定义一个接口。
模块化设计演变成强调关注点分离的基于组件的设计,并演变成分布式系统,从而产生了Web 服务、面向服务的架构和事件驱动的架构。这种演变导致了微服务架构,其中每个服务都为其功能的业务领域定义了一个有界上下文。每个服务都是自主的、敏捷的、松散耦合的、有弹性的、可靠的、可独立部署的和可扩展的。
这种架构鼓励使用抽象、单一责任、DRY、依赖倒置、公共闭包、公共重用、发布等效和持久无知原则。
软件开发团队经常使用逆康威定律 来定义明确的服务所有权,从而提高开发人员的速度。
随着云计算在过去 15 年中得到更广泛的采用,微服务架构通过云原生应用程序( CNA )架构进行了扩展,它提供了隔离状态、分布式、弹性、自动化和松散耦合 ( IDEAL ) 等属性。
CNA和微服务架构的扩展优势包括:
- 适合目的
- 合理调整和模块化
- 弹性
- 主权和宽容
- 具有弹性和受保护
- 可控、适应性强
- 工作负载感知和资源高效利用
- 敏捷且有工具支持
- 可观察性,包括指标、跟踪和日志记录
- 弹力
- 可用性
- 独立、自治
- 零信任安全
- 自动化
- 去中心化治理
代码结构:
|--- books | |--- domain | | |--- model.rs | |--- domain.rs | |--- dto.rs | |--- factory.rs | |--- repository | | |--- ddb_book_repository.rs | |--- repository.rs |--- books.rs |--- catalog | |--- bin | | |--- main.rs | |--- command | | |--- add_book_cmd.rs | | |--- get_book_cmd.rs | | |--- remove_book_cmd.rs | | |--- update_book_cmd.rs | |--- command.rs | |--- controller.rs | |--- domain | | |--- service.rs | |--- domain.rs | |--- dto.rs | |--- factory.rs |--- catalog.rs |--- checkout | |--- bin | | |--- main.rs | |--- command | | |--- checkout_book_cmd.rs | | |--- return_book_cmd.rs | |--- command.rs | |--- controller.rs | |--- domain | | |--- model.rs | | |--- service.rs | |--- domain.rs | |--- dto.rs | |--- factory.rs | |--- repository | | |--- ddb_checkout_repository.rs | |--- repository.rs |--- checkout.rs |--- core | |--- command.rs | |--- controller.rs | |--- domain.rs | |--- events.rs | |--- library.rs | |--- repository.rs |--- core.rs |--- gateway | |--- ddb | | |--- publisher.rs | |--- ddb.rs | |--- events.rs | |--- factory.rs | |--- logs.rs | |--- sns | | |--- publisher.rs | |--- sns.rs |--- gateway.rs |--- hold | |--- bin | | |--- main.rs | |--- command | | |--- cancel_hold_book_cmd.rs | | |--- checkout_hold_book_cmd.rs | | |--- hold_book_cmd.rs | |--- command.rs | |--- controller.rs | |--- domain | | |--- model.rs | | |--- service.rs | |--- domain.rs | |--- dto.rs | |--- events.rs | |--- factory.rs | |--- repository | | |--- ddb_hold_repository.rs | |--- repository.rs |--- hold.rs |--- lib.rs |--- library.rs |--- main.rs |--- parties | |--- domain | | |--- model.rs | |--- domain.rs | |--- events.rs | |--- factory.rs | |--- repository | | |--- ddb_party_repository.rs | |--- repository.rs |--- parties.rs |--- patrons | |--- bin | | |--- main.rs | |--- command | | |--- add_patron_cmd.rs | | |--- get_patron_cmd.rs | | |--- remove_patron_cmd.rs | | |--- update_patron_cmd.rs | |--- command.rs | |--- controller.rs | |--- domain | | |--- service.rs | |--- domain.rs | |--- dto.rs | |--- factory.rs |--- patrons.rs |--- utils | |--- date.rs | |--- ddb.rs |--- utils.rs
|