其他
阿里是如何用DDD来拆分微服务的?
The following article is from 阿里巴巴中间件 Author 修冶
背景
ALIWARE
拆分目的是什么?
ALIWARE
开发简单直接,代码和项目集中式管理。 排查问题时只需要排查这个应用就可以了,更有针对性。
只需要维护一个工程,节省维护系统运行的人力成本。
拆分时机应该如何决策?
ALIWARE
业务规模:业务模式得到市场的验证,需要进一步加快脚步快速占领市场,这时业务的规模变得越来越大,按产品生命周期来划分(导入期、成长期、成熟期、衰退期)这时一般在成长期阶段。如果是导入期,尽量采用单体架构。 团队规模:一般是团队达到百人的时候。
技术储备:领域驱动设计、注册中心、配置中心、日志系统、持续交付、监控系统、分布式定时任务、CAP 理论、分布式调用链、API 网关等等。 人才储备:精通微服务落地经验的架构师及相应开发同学。
研发效率:研发效率大幅下降,具体问题参加上面拆分目的里提到的。
拆分时应该坚守哪些指导原则?
ALIWARE
1. 单一服务内部功能高内聚低耦合
拆分的粒度是不是越细越好?
ALIWARE
弓箭原理
三个火枪手原则
拆分策略有哪些?
ALIWARE
功能维度
第一步,找出领域实体和值对象等领域对象。 第二步,找出聚合根,根据实体、值对象与聚合根的依赖关系,建立聚合。
第三步,根据业务及语义边界等因素,定义限界上下文。 第四步,每一个限界上下文可以拆分为一个对应的微服务,但也要考虑一些非功能因素。
非功能维度
扩展性:区分系统中变与不变的部分,不变的部分一般是成熟的、通用的服务功能,变的部分一般是改动比较多、满足业务迭代扩展性需要的功能,我们可以将不变的部分拆分出来,作为共用的服务,将变的部分独立出来满足个性化扩展需要。同时根据二八原则,系统中经常变动的部分大约只占 20%,而剩下的 80% 基本不变或极少变化,这样的拆分也解决了发布频率过多而影响成熟服务稳定性的问题。
复用性:不同的业务里或服务里经常会出现重复的功能,比如每个服务都有鉴权、限流、安全及日志监控等功能,可以将这些通过的功能拆分出来形成独立的服务,也就是微服务里面的 API 网关。在如,对于滴滴业务,有快车和顺风车业务,其中都涉及到了订单支付的功能,那么就可以将订单支付独立出来,作为通用服务服务好上层业务。如下图:
高性能:将性能要求高或者性能压力大的模块拆分出来,避免性能压力大的服务影响其它服务。常见的拆分方式和具体的性能瓶颈有关,例如电商的抢购,性能压力最大的是入口的排队功能,可以将排队功能独立为一个服务。同时,我们也可以基于读写分离来拆分,比如电商的商品信息,在 App 端主要是商详有大量的读取操作,但是写入端商家中心访问量确很少。因此可以对流量较大或较为核心的服务做读写分离,拆分为两个服务发布,一个负责读,另外一个负责写。还有数据一致性是另一个基于性能维度拆分需要考虑的点,对于强一致的数据,属于强耦合,尽量放在同一个服务中(但是有时会因为各种原因需要进行拆分,那就需要有响应的机制进行保证),弱一致性通常可以拆分为不同的服务。
高可用:将可靠性要求高的核心服务和可靠性要求低的非核心服务拆分开来,然后重点保证核心服务的高可用。具体拆分的时候,核心服务可以是一个也可以是多个,只要最终的服务数量满足“三个火枪手”的原则就可以。比如针对商家服务,可以拆分一个核心服务一个非核心服务,核心服务供交易服务访问,非核心提供给商家中心访问。
安全性:不同的服务可能对信息安全有不同的要求,因此把需要高度安全的服务拆分出来,进行区别部署,比如设置特定的 DMZ 区域对服务进行分区部署,可以更有针对性地满足信息安全的要求,也可以降低对防火墙等安全设备吞吐量、并发性等方面的要求,降低成本,提高效率。
异构性:对于对开发语言种类有要求的业务场景,可以用不同的语言将其功能独立出来实现一个独立服务。
服务都拆了为什么还要合并?
ALIWARE
拆分过程中要注意的风险
ALIWARE
不打无准备之仗
不断纠正
要做行动派,而不是理论派
来源:阿里巴巴中间件