大型网站复杂业务持续重构之道——全程领域建模实践

人物介绍:

Jack Chen ——“宠物商店”的首席架构架构师,拥有丰富的软件设计与建模经验,但对新生事物持怀疑态度。

王总——“宠物商店”的总经理,从美国留学后回国创立“宠物商店”网站。一路来唾手可得的成功让他养成了固执专横的行事作风。

Spark —— Jack Chen的大学同学,一家商业软件公司的高级咨询顾问。最近热衷于宣扬“领域驱动设计”的最佳实践。

引子

就象大家所听说过的那些神奇小子创业故事一样,几只从大西洋游回的海龟找到了一个伟大的idea——在互联网上开办在线商店销售宠物。幸亏的是他们找到了投资者而且发展的很不错。但是随着时间的推移,当初“完美”的技术架构随着越来越多的装进篮子的需求后变得不堪重负。作为公司首席架构师的Jack Chen已经被这几个月“鸡毛蒜皮”的需求折磨失眠好几天啦。

Jack Chen周一一早就被兴奋的王总给喊进了办公室,立即就被王总扔出来的idea吓傻了。

“我有一个很cool的想法,我们可以在线为宠物医院提供在线预约的服务业务。而不仅仅是卖掉它们,你知道这意味着什么吗?这是一个年产值上百亿的市场!!!”。

“可是王总,我们的系统不能支持这种非实物的服务预订销售,它可能对我们原有的网站形成巨大的冲击,我们需要三个月的时间对这个业务进行全方面的评估…”

Jack Chen立即就被气势汹汹的王总打断了,“三个月的评估?我需要在两个月内就给我上线这个新业务。我们的投资人非常认可我的idea,并要求我们立即把这个项目上线,它可能会帮助我们提高明年的IPO价格。你明白吗? DO IT ASAP!”

评估

“好吧,也许这个该死的王胖子是对的。我们这个将技术与业务混在一起的乱摊子也是到了该整理整理的时候。”自言自语发了半小时牢骚后的Jack Chen终于恢复到正常状态上来了,我想我应该看看我们现在是什么样子的,为了支持这个该死的“在线为宠物医院提供在线预约的服务”的需求我们需要做出哪些改变。于是Jack Chen在白板上很快的就画出了下面的Use Case图来。

图1 原宠物商店UseCase汇总图

为了支持“在线预约”这种特殊的产品,它会影响到大部分的Use Case,具体列举如下:

商品信息需要增加“预约时间”这个属性,客户在下订单时会把它作为标识一个预约的关键要素。“在线预约”是个虚拟的商品,它可不需要真的需要去检货和包装发货,如果真的那么做啦,我就太傻了。每个宠物医院每天都只能接受一定数量的预约,从这个概念上来说,它与实物商品有类似的库存概念。可是我该怎么去表达它们呢?最要命的是:我真的要把这些所有受影响的Use Case都翻出来去让它们支持虚拟物品的业务吗?我怎么可能在2个月内完成这些重构?银弹

了无生趣的Jack Chen在王总的办公室门口徘徊了N圈,还是没有勇气去迎接那一通狂风暴雨般的中英文双语版的羞辱谩骂。“也许事情是有转机的,我好象在哪里听说过有种银弹可以解决这种系统重构的问题的”。“该死,谁把Spark送给我的《领域驱动设计》垫在显示器下啦,他一直在向我布道这本书给他的项目带来的种种神奇改变,也许我也可以试试它的威力”。

“好吧,Spark,我承认你给推荐的书非常棒,你说的也很有道理。我读了它,明白并一些概念——例如:领域分割 、Entity、Service、Value Object…,可我对于该如何去做还是一头雾水。你能不能直接把你从重构项目中获得的最佳实践直接分享给我呢?不然的话,周一王胖子是不会放过交不出答案的我的!”。读完了这本书,Jack Chen觉得很有收获,但又不知道怎么开始,打个电话给领域建模的先行者Spark也许真的是解决问题最快的方法。

“什么,这个问题说来话长?不要紧,我已经在你家门口了,你同我慢慢说”,Jack Chen带着星巴克咖啡+肯德基全家桶+久久鸭脖+谄媚的笑容出现在Spark家门口。

布道

Spark听完了Jack Chen对于现状及需求的描述之后,一幅气定神闲的样子讪讪地说出“这个很简单嘛,你现在需要做的只是这样一些事情:”

用大比例结构对你的系统进行领域划分找出这个需求影响的领域及对外接口建立一个适合你们公司的领域驱动设计的技术框架按照需求的紧急度来重构各个领域的设计与编码

下面我们就按照这个顺序来实践一下:

一、概要领域划分

Jack Chen立即把自己之前画的Use Case重画了一遍,然后用希冀的眼神看着Spark等待着认可。“你的错误是过于看重Case或者操作者身份,领域的划分不是基于功能或角色来进行的,通常来说我们是将内聚程度较高的Use Case归到一个上下文中。尽量使得领域自闭程度较高,并拥有相同的业务语言环境。例如基于你的Use Case图,我会画出以下的领域”

图2 宠物商店领域通道图

通道图是一个对业务领域建模非常有帮助的工具,它可以同时表达出执行序列与分片的作用。

二、找出受影响的领域与接口

从领域的角度来看,只有商品对外暴露出来的接口是会影响到各个领域,需要优先建立商品领域(ProductDomain)及读取商品信息服务接口(GetProductService)来进行重构。

之外,在【图2】 中用绿色标识出来的Use Case是由于增加支持“在线预约”这种虚拟商品所需要进行代码重构的部分。这部分工作如果工期比较紧,可以优先使用模式的方式来进行代码重构,这样也可以在之后更加容易用领域驱动设计的方法再次重构。

三、建立技术框架

这一点,是《领域驱动设计》这本书没有过多提及的内容。这个需要结合你们公司的原来技术框架用最小化改造成本最大化收益的方式来建立领域驱动的技术框架。下面是一个可以广泛使用的领域驱动的技术框架,可以在这之上增加更多的个性元素形成你公司自己的框架。

图3 领域驱动设计参考技术框架图

这个框架的各个元素基本上在 《领域驱动设计》一书中都可以找到对应的解释,但这里需要解释一下我建立这个框架的个性理解:

领域对外(页面、AJAX、ESB调用)只暴露领域服务,其它所有领域类都是包内自闭的,对外不可见。基础仓库的引入,基础仓库是一个抽象的仓库,它封装了
大量常用工具方法、业务对象生命周期维护(实体OR映射、DAO调用)、外部接口调用。可以降低业务仓库不必要的重复编码与
复杂性。业务仓库是继承基础仓库的子类。基础设施的引用,基础设施是用来承载引用非领域调用的桩,我们在使用领域驱动设计的时候往往是从一个旧的系统重构开始。这时我们不可能要求所有的业务子系统相互调用都通过Domain Service调用,这时我们可以通过Infrastructure优美的把调用封装在业务仓库的业务方法内。

四、重构受影响领域的设计与编码

图4 重构后的商品详情页类图

Spark以商品详情页这个Use Case为例展示了以领域驱动设计的重构类图:

增加行为表ProductExt用于存储商品的扩展信息,如预约时间段、预约医院。并为表建立一一对应的实体Entity。基础仓库Repository通过Infrastructure中的DAO封装了对实体的操作,如create()、update()、delete()、findById()、findList()商品业务仓库ProductRepository扩展了基础仓库,客户程序可以用productId为参数,通过ProductVo.getProduct()方法获得商品详细信息的业务实现,由于业务仓库的的公开方法对外返回的都是Value Object,因此不会直接暴露Entity类型给客户程序。GetProductService服务类通过invoke()服务方法 对外(商品详情页面)提供服务,它通调用业务仓库中的业务方法,并将接口规格化。事务配置在DomainService的invoke()方法上,即事务控制以Use Case为粒度进行控制。尾声

在Spark的帮助下,Jack Chen成功的脱离了困境。现在他正在公司里积极推行自己的领域驱动设计框架,他们公司的网站正在以每三周一次的重构速度快速迭代演进。他象Spark一样,成为了一个领域驱动的布道者。

来源:InfoQ

时间: 2024-10-29 08:19:38

大型网站复杂业务持续重构之道——全程领域建模实践的相关文章

大型网站复杂业务持续重构之道:全程领域建模实践

中介交易 SEO诊断 淘宝客 云主机 技术大厅 人物介绍: Jack Chen --"宠物商店"的首席架构架构师,拥有丰富的软件设计与建模经验,但对新生事物持怀疑态度. 王总--"宠物商店"的总经理,从美国留学后回国创立"宠物商店"网站.一路来唾手可得的成功让他养成了固执专横的行事作风. Spark -- Jack Chen的大学同学,一家商业软件公司的高级咨询顾问.最近热衷于宣扬"领域驱动设计"的最佳实践. 引子 就象大家所

CPS:中国网站的可持续盈利之道

对国内大多数网站,尤其是个人网站来说,"赚一次钱容易,难的是赚一辈子钱",像SP火的时候,淘宝疯狂烧钱的时候,都有很多个人网站趁机发了财(当然对能把握机会的人我是佩服的),但等这几把火熄灭了了的时候,很多人都开始哀叹"冬天来了",过把瘾就死. 目前国内的个人网站主要都是通过http://www.aliyun.com/zixun/aggregation/39768.html">网站联盟赚钱,但可能很少有人知道,网站联盟这种形式是1996年亚马逊(ama

CSDN社区问答第4期:曾宪杰 大型网站系统与Java中间件

问题描述 本期的社区问答(5月19日-5月25日)我们请来了<大型网站系统与Java中间件实践>一书的作者曾宪杰(华黎)为大家解答关于大型网站和支撑大型网站架构的Java中间件.分布式系统方面的问题.曾宪杰,淘宝花名华黎,现任淘宝技术部总监.2002年毕业于浙江大学计算机系.2007年加入淘宝网平台架构团队,负责构建淘宝自主的消息中间件系统,同期主导了淘宝数据层的创建,这两个产品也是淘宝中间件中较为重要的两个.2010年下半年起开始负责整个淘宝中间件团队,帮助团队成为业内知名的Java技术团队

大型网站性能监测、分析与优化常见问题Q&amp;A

大型网站性能监测.分析与优化常见问题Q&A @tanwen110 (唐文),曾负责腾讯四大平台之一网络媒体平台的整体运维.运营规划工作:曾任百度T7架构师和百度性能优化TOPIC.百度UAQ.APM平台负责人:畅销书<海量运维.运营规划之道>作者: mmTrix创始人,后并入上市公司高升控股(000971.SZ),出任技术VP. 购买链接:http://item.jd.com/11962556.html Q:基于rest的微服务,有什么好的监控方案推荐的,最好是对系统影响最小的 A:自

雅虎显示广告业务持续低迷 梅耶尔束手无策

硅谷网讯(思睿)北京时间4月17日消息,据国外媒体报道,自玛丽萨•梅耶尔(Marissa Mayer)于去年开始担任CEO以来,雅虎股价已经有了大幅度上升.但对于雅虎显示广告业务的持续低迷,梅耶尔也没有给出太好的解决办法. 根据雅虎周二发布的财报显示,截至3月31日,雅虎第一季度净利润为3.90亿美元,比去年同期的2.86亿美元增长36%,而这还要归功于阿里巴巴集团的强势表现,雅虎持有阿里巴巴24%的股份. 然而,雅虎第一季度营收却为11.40亿美元,比去年同期的12.21亿美元下滑7%,这主要

大型网站架构的演化

一个成熟的大型网站(如淘宝.京东等)的系统架构并不是开始设计就具备完整的高性能.高可用.安全等特性,它总是随着用户量的增加,业务功能的扩展 逐渐演变完善的,在这个过程中,开发模式.技术架构.设计思想也发生了很大的变化,就连技术人员也从几个人发展到一个部门甚至一条产品线. (欢迎大家访问我的个人网站:工学1号馆) 所以成熟的系统架构是随业务扩展而完善出来的,并不是一蹴而就:不同业务特征的系统,会有各自的侧重点,例如淘宝,要解决海量的商品信息的搜索.下 单.支付,例如腾讯,要解决数亿的用户实时消息传

大型网站技术架构:核心原理与案例分析

链接 性能优化 Web前端性能优化 应用服务器性能优化 软件质量保证 代码控制 自动化发布 灰度发布 网站运行监控 伸缩性设计 按功能物理分离 负载均衡 分布式缓存 可扩展设计 利用分布式消息队列降低系统耦合性 利用分布式服务打造可服用的业务平台 1 链接 个人博客: alex-my.xyz CSDN: blog.csdn.net/alex_my 本书作者: 李智慧 2 性能优化 1 Web前端性能优化 浏览器优化访问 减少http请求.主要是合并css,合并js,合并图片.将浏览器一次访问所需

回望网购二十年:大型零售商在线业务步履维艰

在互联网令消费者购物活动发生革命性改变的将近20年以后,许多大型零售商仍旧面临着无法将网购变成其自身一项大型业务的困境. 据<华尔街日报>报道,大型零售商网购业务的发展进程可在美国证券交易委员会(SEC)与多家大型零售连锁运营商之间的最新通信中得到反映,如塔吉特.沃尔玛.美国最大的宠物用品零售商PetSmart以及成衣配饰制造和零售商Fifth & Pacific等. 在这些通信中,美国证券交易委员会要求这些经常都会标榜其在线业务实力的公司提供硬数据,公布有关它们在线出售的商品数量的细

大型网站架构演化历程

大型网站的挑战主要来自庞大的用户,高并发的访问和海量数据,任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户,问题就会变得棘手.大型网站架构主要就是解决这类问题. 本文内容大部分来自<大型网站技术架构>,这本书很值得一看,强烈推荐. 大型网站系统的特点 高并发,大流量 需要面对高并发用户,大流量访问. 高可用 系统 7 x 24 小时不间断服务. 海量数据 需要存储.管理海量数据,需要使用大量服务器.Facebook 每周上传的照片数量接近 10 亿,百度收录的网页数目有数百亿,Go