enode框架入门:开篇2013-11-26 cnblogs netfocus前言今天是个开心的日子,又是周末,可以安心轻松的写写文章了。经过了大概3年的DDD理论积累 ,以及去年年初的第一个版本的event sourcing框架的开发以及项目实践经验,再通过今年上半年利用业余时 间的设计与开发,我的enode框架终于可以和大家见面了。自从Eric Evan提出DDD领域驱动设计以来已 经过了很多年了,现在已经有很多人在学习或实践DDD。但是我发现目前能够支持DDD开发的框架还不多,至少 在国内还不多。据我所知道的java和.net平台,国外比较有名的有:基于java平台的是axon framework,该框 架很活跃,作者也很勤奋,该框架已经在一些实际商业项目中使用了,算比较成功;基于.net平台的是ncqrs ,该框架早起比较活跃,但现在没有发展了,因为几乎没人在维护,让人很失望;国内有:banq的jdon framework可以支持DDD+CQRS+EventSourcing的开发,但是它是基于java平台的,所以对于.net平台的人,没 什么实际用处;.net平台,开源的主要就是园子里的晴阳兄开发的apworks框架。晴阳兄在DDD方面,在国内的 贡献很大,写了很多DDD系列的文章,框架和案例并行,很不错。当然,我所关注的紧紧是c#和java语言的框 架,基于scala等其他语言实现的框架也有很多,这里就不一一例举了。上面这么多框架都有各自的特 点和优势,这里就不多做评价了,大家有兴趣的自己去看看吧。我重点想介绍的是我的enode框架,框架的特 色,以及使用的前提条件。enode框架简介框架名称:enode框架特色:提供一个基于DDD设计思想,实现了CQRS + EDA + Event Sourcing + In Memory这些架构模式 的,支持负载均衡的,轻量级应用开发框架。开源地址:https://github.com/tangxuehua/enodenuget包Id:enode使用该框架前需要了解或遵守以下几个约定:一个command只允许导致一个聚合根的修改或一个聚合根的创建,如果违反这个规则,则框架不允许;如果一个用户操作会涉及多个聚合根的修改,则需要通过saga (process manager)来实现;拥抱最终一 致性,简单的说就是通过将command+domain event不断的串联来最终实现最终一致性;如果想彻底的知道 enode哪里与众不同,可以看一下源代码中的BankTransferSagaExample,相信这个会让你明白什么是我所说的 事件驱动设计;框架的核心编程思想是异步消息处理加最终一致性,所以,如果你想实现强一致性需求,那这个框架不太 适合,至少目前没有提供这样的支持;框架的设计目标不是针对企业应用开发,传统企业应用一般访问量不大且要求强一致性事务;enode框架更 多的是针对互联网应用,特别是为一些需要支持访问量大、高性能、可伸缩且允许最终一致性的互联网站点提 供支持;看过:可伸缩性最佳实践:来自eBay的经验的人应该知道要实现一个可伸缩的互联网应用,异步编程 和最终一致性是必须的;另外,因为如果数据量一大,那我们一般会把数据分开存放,这就意味着,如果你还 想实现强一致性,那就要靠分布式事务。但是很不幸,分布式事务的成本代价太高。伸缩、性能和响应延迟都 受到分布式事务协调成本的反面影响,随着依赖的资源数量和用户访问数量的上升,这些指标都会以几何级数 恶化。可用性亦受到限制,因为所有依赖的资源都必须就位。框架定位:目前定位于单台机器上运行的单个应用内的CQRS架构前提下的command端的实现;如果要实现多 台机器多个应用之间的分布式集成,则大家需要再进一步借助ESB来与更高层的SOA架构集成;enode框架架构图: