开源项目:Jdon Framework

案例      文档    Github    JiveJdon

项目新闻:

Jdon框架作者板桥DDD研究十年心血:《复杂软件设计之道:领域驱动设计全面解析与实战》出版,有助于理解Jdon框架

(1)JiveJdon是基于Jdon框架实现的复杂DDD应用案例,在Jdon.com运行近十年。
(2)增加了基于事件溯源+Saga+消息系统+流程管理器的分布式事务替代实现:账户转账代码

(3)多核并发测试代码,验证Jdon框架支持无锁并发和内存事务,参考:Adaptive如何基于LMAX架构实现服务级别的高性能分布式事务?

编程范式都是一种面向上下文编程 (Context oriented programming:简称COP):

  • 数据结构 + 算法 = 限定上下文应用
  • 数据 + 单一职责 = 对象 =>对象存在于上下文(OOP面向对象
  • Model模型数据 + View视图动作事件 = Controller控制器 =>控制器是一种上下文( MVC模式
  • Data数据 + Interactive交互 = Context场景 =>场景是一种上下文 (DCI)
  • struct结构 + trait接口 = 嵌套/ 聚合/ 组合 =>组装背后存在上下文(Rust语言Go语言

Jdon框架编程范式:

  Jdon框架(Jdon Framework)是一个DDD+CQRS+EventSourcing实施框架,其特点是无需任何消息中间件如Apache Kafka,直接支持基于领域模型的发布/订阅(pub-sub)的异步编程模型,可以直接将“命令”以非堵塞方式传递给领域模型,也可以监听领域模型中发生的领域事件。能够快速地将领域驱动设计(DDD)落地为异步、高并发、高吞吐量的Java应用系统 。

  Jdon框架(JdonFramework)将DDD和领域事件灵活结合在一起,实现业务逻辑和数据库等基础设施分离,帮助你实现一个清晰且流畅的六边形软件架构:

 

  由领域模型聚合根实体(Aggregates)在用例场景下接受一个命令(Command)指示,完成业务逻辑任务后触发了一个领域事件(Domain Event)。

  不同有界上下文之间通过领域事件通讯,发布/订阅(pub-sub)异步机制符合DDD有界上下文映射的客户/提供者模式(Customer/Supplier)。

微服务的分布式事务

  通过记录导致状态改变的领域事件,可以实现柔性的微服务架构下的分布式最终一致性事务,JF关键是保证了记录领域事件时实现单写原则,避免并发争夺问题,事件日志的追加操作是原子的,也是相互隔离的,借助Apache Kafka的近似正好一次交付(其他消息系统需要手工处理幂等性),以及Saga模式实现全部回滚,可以在微服务分布式环境中实现近似ACID事务。

  事件溯源 + Saga流程管理器 + 消息系统的正好一次交付=新的分布式事务中间件:

  具体实现架构图如下:流程管理器负责流程向前推动或向后回退回滚,当参与流程或事务会话的任何一个步骤出现问题,流程管理器向已经处理过的聚合根实体发出回退命令,各个聚合根由此完成业务上的幂等性。账户转账代码是这一架构的原理实现,具体代码分析可见JdonFramework的Github首页

下图是结合Apache Kakfa实现的微服务下的事件溯源架构:

《复杂软件设计之道:领域驱动设计全面解析与实战》(本站原创书籍在事件溯源章节详细讨论分布式事务)

清洁Clean架构和六边形架构

  这两个架构的核心点都是将业务逻辑和基础设施分离,JdonFramework的pub-sub发布订阅模型将业务领域与基础设施实现了分离,领域模型通过发送消息事件给基础设施,驱动其相应功能,包括数据库表的存储。JF提供的命令和事件模型可以实现一个六边形的清晰、干净、整洁的架构,真正将领域模型成为业务核心,而传统系统基本都是以关系数据库Orcalce等为业务核心,让数据库技术污染了自己的业务模型,不具有可持续性,见架构整洁之道,实现案例见JiveJdon

  

历史

  JF诞生于2004年底,作为中国第一个开源Java框架,创新地运用了当时刚刚出现的新的技术思想Ioc/DI(依赖注入Dependency Injection),JF比当时Spring 1.x率先支持了注入的自动匹配;同时遵循约定优于配置以达到快速开发。

  Jdon Framework(简称JF)是国内第一个IOC/AOP开源框架,首个DDD领域驱动设计Java实施框架。

  2009年JF 6.1版本引入了事件驱动(Event Sourcing)和In-memory内存缓存概念,2011年7月Martin Fowler推荐的LMAX架构也采取类似架构,其性能达到每秒处理600万订单,每微秒延迟获得100T的吞吐量。传统编程是在一个线程内进行顺序同步编程,而JF的事件编程是一种无锁的并行异步编程模型,大大发挥了现代多核CPU潜力。

  JF 6.5版本为推广适合多核CPU的无堵塞并发编程范式进行了探索,使用了Domain Events和DCI等不同抽象层次对并发编程进行了封装,从而降低开发者使用并发编程的难度,见 无堵塞的并发编程DDD DCI和领域事件

  JF与其他开发工具相比:JF是一个领域驱动设计DDD框架。JF是快速性 灵活性和可伸缩性综合平衡的产物,它带来了多快好省的简单的解决之道(simplify the best):对于小项目,使用JF可以开发出高质量可扩展的好的系统;对于大项目,使用JF可以更快地开发出系统。

 

JF关键技术特点

  1. DDD(Domain-Driven Development),开发基于领域驱动设计(Domain-Driven Design)应用, 提供基于内存的领域模型(in memory model), 运行时刻领域对象作为“总司令部”通过Domain Events驱动命令技术构架为之服务,探索了一条真正以业务对象为核心的崭新的DDD落地编程模型。

  2. Reactive Actors模型,类似ERLang或Scala中的信箱, 事件驱动架构Event-driven Architecture(EDA) ,异步领域事件,并发策略, 懒加载赋值(Lazy initialization or evaluation),结合Kafka/RabbitMQ/ZeroMQ/JMS可实现大型分布式可伸缩的架构。

  3. 易于实现事件溯源EventSourcingCQRS架构

  4. 依赖注入DIAOP框架, 类自动配对注射autowiring/Autowired,无需指定,提高重构效率,所有类最大限度松耦合,包括框架本身的类或构件都是可替换的,提供强大可定制能力;灵活简单的AOP,没有复杂AOP脚本代码,可以将任何POJO引入introduce作为拦截器。

  5. 命令查询分类架构Command Query Responsibility Segregation(CQRS/CQS), 提供模型的增删改查命令流程整合,不必编写MVC模式中Controller控制器,防止新手将业务写入控制器。服务命令模式:可根据url参数直接激活对应的Service方法;提供大量数据批量查询自动分页和缓存性能优化功能。

  6. JF可以保证应用系统的良好性能和可扩展性,容易接入各种持久层框架如Hibernate或Key-value存储或NoSQL数据库。可使用分布式缓存如Ehcache + terracotta/memcached扩展到大型分布式云系统。

 

如果没有DDD,你的项目会变成:

 

#CQRS架构 #领域事件 #工作流 #Saga事务

下载      文档       演示    企业培训咨询