论软件架构风格

摘要:本人于2021年初参与了本公司某智慧导购营销系统的开发,并且作为架构组成员参与了项目整体的架构设计与评审,以及方案设计与评审。项目基线版本于去年十月份上线,至今已经平稳运行了一年,并且功能还在不断完善的进行持续迭代。由于用户数据量庞大,并且涉及到资产损失,客户对我们的软件系统质量属性要求比较高,为此我们对于产品架构的设计以及软件测试质量也相当重视,在架构设计和软件测试方面我们也做了大量的工作,最终系统上线之后,没有出现过大的纰漏,基本满足了性能要求,可靠性以及可修改性。本论文将详细阐述为满足业务需求跟项目目标以及软件质量属性的前提下我们对于软件架构风格的选择和应用,以及软件架构风格的特性进行论述。

        随着互联网的发展和社交流量的发展,零售行业也进行了营销模式的改变,依托互联网和社交平台来打造自己的私域流量营销平台成为了各个品牌行业的主流。我们的社交型客户关系营销系统为此提供解决方案。我们的产品主要依托微信生态,通过企业微信和微信两大公域来打造私域流量平台。对企业客户和客户群进行管理,客户聊天和客户群聊对客户进行引流,提供客户画像对客户进行精准营销,提供客户会话存档,敏感词校验,识别营销风险,支持客户标签,区分客户类型。作为流量的入口,客户对我们的系统质量属性有很高的要求,为满足良好的软件质量属性我们对软件系统架构设计尤为重视,为满足特定的应用场景以及良好的软件质量属性我们采用了分层的软件架构风格,基于Soa理念的微服务架构风格,以及独立构件-事件驱动(隐式调用风格),以及基于h5和小程序应用的RIA富互联网架构风格。

      首先,我们的产品是依托于企业微信,企业微信对我们提供了集成h5和小程序入口。导购端主要通过企微来跟客户进行社交沟通,为了丰富企业微信的功能,我们的产品承担了这一部分定个性功能,通过h5或者小程序链接这两富互联网让用户无感知的享受到我们产品提供的应用功能,客户无需再去专门下载别的app,无感知的富互联网架构风格使用户操作性得到了良好的体验,也对我们的产品功能达到了丰富,提升了客户满意度。

        其次,我们的产品依赖于企微的事件驱动需要做到数据的实时更新和处理。所以我们采用了独立构件-事件驱动的架构风格。Kafka是一个优秀的消息中间件,它通过事件通知来隐式通知来驱动我们产品服务的数据和业务逻辑的变更。它具有良好的消息支持模式,支持广播跟订阅,并且可以保持消息的不丢失,增加了系统可靠性。在客户通知等回调事件中驱动我们业务下游的数据统计以及客户关系等业务逻辑的变更,延期低,并发高,并且可靠性高。

        以上是基于第三方应用以及特殊业务场景的局限性我们可以选择的最优的架构风格。对于客户对系统可用性的质量属性要求,我们决定使用基于SOA理念的微服务架构风格。我们的产品通过领域划分成了多个服务,各个服务之前可独立部署运营,粗粒度,低耦合,也可针对流量较大的模块进行动态扩容(比如双十一等活动)流量会突增。我们每个模块部署也是集群部署,通过负载均衡技术,达到了模块的高可用。即使有服务节点挂了也不影响其它服务的运行,软件可用性得到了保障。由于工期比较紧张,我们采用不同的迭代组对拆分后耦合度低的领域模块进行并行开发,前后端分离,提供标准的rest api服务接口。服务与服务之前也是基于rest api进行通信。服务的注册与发现基于阿里巴巴的nacos注册中心,可支持集群和充当配置中心。微服务架构风格解决了服务解耦和高可用,也缩短了软件开发的成本,但是随之增大了运维成本和部署成本,但是基于项目需要的考量,以及客户的要求,利大于弊所以我们选择了微服务的架构风格,也基本达到了设计目的。

        在我们单个服务的设计过程中,我们是基于java springboot 和springcloud alibaba开发的。我们采用了调用-返回的软件分层的架构风格。在硬代码层面 spring mvc 提供了mvc分层模式。view是视图层,controller是控制层,modle是实体层和业务逻辑层。实际上我们对后端服务进行了以下分层,首先最外层是api层,分为内部api和外部api 内部api提供服务间调用的接口,外部api 提供客户端调用接口。其次往下是聚合层,负责聚合多领域的业务逻辑处理。再往下就是领域层,包括领域实体以及领域模型,这是对领域用例抽象的提取与实现,此层是比较重也是最重要的一层,我们把事务也放在了这一层,如果在应用层描述用例中使用了事务,从写法很容易把多个聚合下的事务形成一个大事务,如果是放在领域层,只会有当前业务域内的事务,相当于本机事务,事务的一致性仅在业务域范围内部更加可用,无需引入分布式事务。部分有关联业务域可用遵循 BASE 理论的最终一致性。对于上面微服务架构的最大的缺陷,事务的一致性有了一定的处理机制。再往下一层是数据操作层,对于数据库的操作放在了这一层,包含实体与数据库的映射,处理数据库操作,以及和领域层交互。领域层的实体跟数据库实体会在这一层有一层的转化。

      其次还有基础设施层,这一层包含了产品的基础组件,像数据库mysql以及内存数据库mysql 搜索引擎es以及消息队列还有定时任务等等。

      在项目中,我们对基础资源的生命周期进行了抽象,包含初始化、安装、启动、停止、启动时是否异步、在需要该基础资源的时候将其注册到启动管理器中,然后循环遍历启动管理器,调用启动器的初始化、安装、启动方法,只要对应资源实现了相关对应抽象,这样基础组件就像插件一样。另外,为了系统软件的可修改性以及可变形,后续自研或者替换产品,我们在基础组件之上简简单单的封装了一层,方便以后替换以及复用。

        总结,以上就是我们在产品研发过程中为达到客户需求已经软件质量属性所应用到的架构风格,各种架构风格提供了不同类型的解决方案以解决不同的场景问题,上线将近一年了,期间经历过618活动的冲击,系统还算平稳运行,客户也比较满意,但是架构很难十全十美,也很难一次到位,因为需求在不断的变化,系统的体量也在逐渐增大,所以项目在不停的变化中,架构也要随之调整,既有调整也要有抽象化的可复用性,只有能经历不断演化且软件质量不降低或者还能提升的架构才是健壮的架构。我们需要努力提高能力,经过不断的学习,提升软件设计水准,为行业和社会贡献自己的一份力量。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容

  • 软件架构设计的一个核心问题是能否使用重复的软件架构模式,即能否达到架构级别的软件重用。也就是说,能否在不同的软件系...
    deniro阅读 8,963评论 0 16
  • 论文摘要 2014年12月,本人所在的深圳市XX科技有限公司启动了一个销售过程管理系统的开发项目,本人作为I...
    CoryLiu阅读 6,692评论 0 5
  • 风险驱动设计 风险指的是觉察到的失败概率*觉察到的影响。风险驱动模型归纳为三个步骤:1.识别风险,排定优先级识别风...
    前端进城打工仔阅读 5,543评论 0 2
  • 要为系统选择或设计某一个体系结构风格,必须根据 特定项目的具体特点,进行分析比较后再确定,体系结构风格的使用几乎完...
    Real_man阅读 1,189评论 0 1
  • 要为系统选择或设计某一个体系结构风格,必须根据 特定项目的具体特点,进行分析比较后再确定,体系结构风格的使用几乎完...
    AIOPstack阅读 522评论 0 0