支付宝SOFA架构:降低业务系统复杂度
前言
从业这么多年,接触过银行的应用,Apple的应用,eBay的应用和现在阿里的应用,虽然分属于不同的公司,使用了不同的架构,但有一个共同点就是都很复杂。导致复杂性的原因有很多,如果从架构的层面看,主要有两点,一个是架构设计过于复杂,层次太多能把人绕晕。另一个是根本就没架构,ServiceImpl作为上帝类包揽一切,一杆捅到DAO(就简单场景而言,这种Transaction Script也还凑合,至少实现上手都快),这种人为的复杂性导致系统越来越臃肿,越来越难维护,酱缸的老代码发出一阵阵恶臭,新来的同学,往往要捂着鼻子抠几天甚至几个月,才能理清系统和业务脉络,然后又一头扎进各种bug fix,业务修补的恶性循环中,暗无天日!
CRM作为阿里最老的应用系统,自然也逃不过这样的宿命。不甘如此的我们开始反思到底是什么造成了系统复杂性? 我们到底能不能通过架构来治理这种复杂性?基于这个出发点,我们团队开始了一段非常有意义的架构重构之旅(Redefine the Arch),期间我们参考了SalesForce,TMF2.0,汇金和盒马的架构,从他们那里汲取了很多有价值的输入,再结合我们自己的思考最终形成了我们自己现在的基于扩展点+元数据+CQRS+DDD的应用架构。该架构的特点是可扩展性好,很好的贯彻了OO思想,有一套完整的规范标准,并采用了CQRS和领域建模技术,在很大程度上可以降低应用的复杂度。本文主要阐述了我们的思考过程和架构实现,希望能对在路上的你有所帮助。
复杂性来自哪里
经过我们分析、讨论,发现造成现在系统异常复杂的罪魁祸首主要来自以下四个方面:
可扩展性差
面向过程
Programs must be written for people to read, and only incidentally for machines to execute
所以强烈谴责那些不顾他人感受的编码行为。
分层不合理
随心所欲
复杂性应对之道
扩展点设计
身份识别
扩展点
面向对象
SOLID
领域建模
分层设计
这一块的设计比较直观,整个应用层划分为三个大的层次,分别是App层,Domain层和Repostiory层。
- App层主要负责获取输入,组装context,做输入校验,发送消息给领域层做业务处理,监听确认消息,如果需要的话使用MetaQ进行消息通知;
- Domain层主要是通过领域服务(Domain Service),领域对象(Domain Object)的交互,对上层提供业务逻辑的处理,然后调用下层Repository做持久化处理;
- Infrastructure层主要包含Repository,Config和Common,Repository负责数据的CRUD操作,这里我们借用了盒马的数据通道(Tunnel)的概念,通过Tunnel的抽象概念来屏蔽具体的数据来源,来源可以是MySQL,NoSql,Search,甚至是HSF等;Config负责应用的配置;Common是一写工具类;负责message通信的也应该放在这一层。 这里需要注意的是从其他系统获取的数据是有界上下文(Bounded Context)下的数据,为了弥合Bounded Context下的语义Gap,通常有两种方式,一个是用大领域(Big Domain)把两边的差异都合起来,另一个是增加防腐层(Anticorruption Layer)做转换。什么是Bounded Context? 简单阐述一下,就是我们的领域概念是有作用范围的(Context)的,例如摇头这个动作,在中国的Context下表示NO,但是在印度的Context下却是YES。
规范设计
放对位置
贴好标签
SOFA应用架构
整体架构
提效工具
Archetype
mvn archetype:generate -DgroupId=com.alibaba.crm -DartifactId=demo -Dversion=1.0.0-SNAPSHOT -Dpackage=com.alibaba.crm.demo -DarchetypeArtifactId=sofa-framework-archetype -DarchetypeGroupId=com.alibaba.sofa -DarchetypeVersion=1.0.0-SNAPSHOT
测试容器
<dependency><groupId>com.alibaba.crm</groupId><artifactId>crm-test</artifactId><version>1.0.0-SNAPSHOT</version><scope>test</scope>
</dependency>
然后将TestApplication修改如下即可:
public class TestApplication {public static void main(String[] args) {PandoraBootstrap.run(args);SpringApplication.run(Application.class, args);TestsContainer.start();//启动测试容器,避免重复启动PandoraBoot}
}
支付宝SOFA架构:降低业务系统复杂度相关推荐
- 【架构】--- 业务架构图
业务架构图是什么?为什么有这个图? 业务架构图是一种表达业务层级和关系的工具. 业务架构服务于业务目标,通过描绘业务上下层关系,梳理一整套完整.简单的业务视图,降低业务系统的复杂度,提高客户理 ...
- 企业如何利用 Serverless 快速扩展业务系统?
2022 年 9 月 24 日,阿里云用户组(AUG)第 12 期活动在厦门举办.活动现场,阿里云高级技术专家史明伟(花名:世如)向参会企业代表分享了<未来已来--从技术升级到降本提效>. ...
- 成为会带团队的技术人 架构设计:治理好系统复杂度才最务实
上一讲我们以架构之名聊了一下理解业务这件事儿,这一讲我想进一步来聊一聊日常工作中架构工作的核心关注点是什么? 我是在接触分布式开发之后,才对"架构"有了概念,从三高(高可用.高性能 ...
- 团队管理之—— 架构设计:治理好系统复杂度才最务实
在接触分布式开发之后,才对"架构"有了概念,从三高(高可用.高性能.高可扩展)到 DevOps(集群.网关.复杂均衡等),从系统的功能模块设计到微服务的业务建模.领域设计.很长的时 ...
- 系统架构之业务逻辑层
一.上章回顾 上章我们主要讲述了系统设计规范与原则中的具体原则与规范及如何实现满足规范的设计,我们也讲述了通过分离功能点的方式来实现,而在软件开发过程中的具 体实现方式简单的分为面向过程与面向对象的开 ...
- 安信证券服务化平台,助力业务系统云原生架构转型
互联网应用的海量用户.快速迭代.不间断服务和流量突增等业务特征促进其技术架构从传统集中式到分布式SOA和微服务架构方向逐步演进.随着敏态业务的逐渐增多,对业务连续性.交付效率和故障处理效率等方面提出了 ...
- 写代码犹如写文章: “大师级程序员把系统当故事来讲,而不是当做程序来写” | 如何架构设计复杂业务系统? 如何写复杂业务代码?
写代码犹如写文章: "大师级程序员把系统当故事来讲,而不是当做程序来写" | 如何架构设计复杂业务系统? 如何写复杂业务代码? Kotlin 开发者社区 "大师级程序员把 ...
- 复杂业务系统的架构设计思路
最近有一些系统设计方面的思考和体会,在这里梳理一下. 做技术方案,核心是下面几个问题: 做什么?- 产品需求 业务上怎么做?- 业务文档 技术上怎么做?- 技术方案 代码怎么实现?- 落地实现 明确了 ...
- 业务系统技术架构的方法论
业务类系统(通常称为To B 类产品),一般包括crm,供应链,物流等.系统的架构设计非常具有挑战性. 面向用户的To C 类前台产品,无论产品经理还是用户都已经培养起了使用习惯,对功能有一定程度的理 ...
- 大金融业务系统的技术架构演进方向
大金融业务系统技术架构演进 大金融三浪叠加的发展阶段:信息金融.互联网金融.智能金融,对标的业务架构从1.0.2.0发展到了今天的3.0架构. 信息金融采用1.0业务架构,采用瀑布型开发.单块架构.物 ...
最新文章
- 九度oj 题目1376:最近零子序列
- wannalfy 挑战赛8 F 白云的树(树形dp)
- 什么是CPAN(安装NAGIOS使用到)
- win下安装elasticsearch(win_Elasticsearch)
- 域名怎么绑定ip_服务器怎么绑定域名?
- SQL命令大全-中英文对照
- linux android build tools,build.gradle 文件中的 Android SDK Build Tools version
- VM虚拟机中 localhost login_UTM 2.0 虚拟机来了,解决上网和无声音问题
- MySQL数据库datetime类型不能为空值的问题
- linux重启后版本变了,linux – 重启后如何使设备映射保持不变?
- matlab线性代数命令大全,线性代数 - MATLAB 系统中文帮助手册
- 大数据分析需掌握哪些方面
- loadrunner11 下载安装说明
- 9 ASCLL 码表
- 利用IPV6实现宿舍远程连接实验室并免费上网
- Gephi 网络可视化——调整网络布局
- WiFi基础知识讲解
- python中led是什么意思_用于检测LED闪光灯的Python库
- 华为手机下拉菜单变大_华为手机下拉菜单变少了 华为下拉通知栏变白色
- QT5.10开发(5)QT入门知识
热门文章
- vs2019无法启动程序 系统找不到指定文件
- 简单网络管理协议SNMP通讯基础篇-熊健-专题视频课程
- 《获取Windows中的当前时区列表》
- EPSON TM U220串口打印机乱码
- linux开启nginx 443端口无效,http – Nginx正在侦听端口80或443但没有响应
- 数据结构——二叉树相关练习题
- 梦三国测试服显示连接服务器失败,我的登陆进去以后说与服务器失去连接怎么回事...
- Map获取key,value的方法
- [Maven实战-许晓斌]-[第二章]-2.6 NetBeans上面安装Maven插件
- 器件选型-ARM7,ARM9,ARM11,Cortex系列基础知识