业务架构和系统架构_技术架构和系统架构

业务架构和系统架构_技术架构和系统架构通用业务系统架构演进

大家好,又见面了,我是你们的朋友全栈君。

前言

系统搭建初期,为对公司业务进行快速支持,往往搭建的系统非常加单,主要为了满足快速迭代的需求,使用公司初期的高速发展。 随着业务的越来越繁杂,系统会变得越来越复杂,除了需要在技术角度去满足系统的高性能,稳定性,高可用等需求外,设计可以满足业务需求迭代的架构同样重要。

常见痛点

为快速支撑复杂业务能力,系统代码往往采用类中写几千行代码,一个方法中到处if-else,如果再没有阅读性好的代码和注释,随着员工离职,接手的程序员很难快速介入代码进行开发,反过来则限制了系统业务能力的快速迭代。 最坏的结果可能造成因为越来越难以迭代,使得系统推翻重做。

通用业务系统实现

系统初期往往采用三层架构方式搭建,上层为controller,中间层为service,下层的数据访问为dao层。

Controller

Controller层往往推荐只作请求参数和响应参数的处理等一些浅逻辑,比如协议转换等。

业务架构和系统架构_技术架构和系统架构

业务代码中,往往按照业务领域划分和组织代码结构,比如按照订单,会员等划分,这样同样可以在Controller层做好请求到领域内的映射。

比如:

  • 将请求参数解析出来组装成内部参数
  • 调用下层服务执行业务逻辑
  • 组装返回响应结果,异常情况下,则对异常堆栈封装等

主要的原则是:网关内对协议进行处理,将业务逻辑进行收敛,不暴漏给外部,这样在内部逻辑进行重构时,不需要外界感知变化。

Service

业务层是承载业务流程和业务规则的地方,同样可以采用分层方式进行代码逻辑组织:

  • 1.业务服务层
  • 2.业务流程层
  • 3.业务组件层

业务架构和系统架构_技术架构和系统架构

业务服务层

业务服务层可以作为按业务领域划分的领域对外的接口,每个接口代表一个领域业务,比如订单领域内逻辑统一放在Order Service,账户领域交给User Service。

在接口指责划分上,可以采用读写接口分离的原则,比如:Order Read Service和Order Write Service,这样在未来系统在技术角度需要做读写分离处理和流量管理时,可以减少极大的梳理成本。

接口中功能方法的名称尽量有意义,比如订单创建叫做cereate Order,取消订单叫做 cancel Order,而不是简单的增删改查名称。

参数组织上如:Request,DO,DTO等。

业务流程层

业务流程代表对于规则的解释和梳理,规则是将PM的需求翻译成代码的过程,所以同样可以通过多种标准化动作进行控制:

  1. 组装参数
  2. 规则判断分支
  3. 执行动作节点,每个动作节点包含业务功能代码

主要原则是将容易变动的地方做到易修改,易测试,减少新功能迭代时的理解成本。 将不易变动的功能进行拆分,固化,变成可维护的业务组件。

业务组件层

业务组件层是将一些可服用的逻辑,可固化的功能进行内聚封装,可以有参数组件,规则判断组件,动作行为组件等。

业务组件的形成往往是在对业务理解深刻之后演进出来的,过早的抽象往往效果不好。

组件内聚之后可能产生如:短信组件,下单组件扽。

多种组件可以组合产生业务流程的能力。

Dao

数据访问层同样可以由两部分组成:接口定义,技术组件。

业务架构和系统架构_技术架构和系统架构

接口定义

底层数据能力需要和上层业务能力分离,通过设计合理的接口,向业务层屏蔽底层复杂度。 可以基于面向接口编程的思想设计数据库访问接口和缓存访问接口等。

技术组件

系统随着业务发展和需要承载的用户越来越多,需要经历单机,集群,服务化等多个阶段,所以需要沉淀下来一些技术组件,来将多个阶段问题进行固化封装,达到系统发展而业务无需感知的能力。 可以沉淀的技术组件包括:数据存储,缓存,消息,调度任务,事务,锁机制等。

数据存储,底层可以封装访问关系数据库,日志系统HBase,文件系统HDFS,本地文件系统等。

缓存,可以按照不同的超时时间纬度或数据量进行选择,比如本地内存的Encache,集中式缓存Memcache,集中式可持久化的Redis集群等,同时可以将缓存击穿处理等逻辑进行集成。

消息,在系统中常常用来解决异步处理能力,消息的消费往往和调度任务组合起来,可以按照调度规则,配置一次或者多次业务逻辑的处理。

事务,往往采用数据库实现,单机的事务依赖于数据库事务,可以使用spring-tx的事务进行事务控制,业务逻辑中,事务应该尽量小,可以将业务逻辑紧密的数据库操作放在一起。在分布式场景下可以根据不同的业务需求选择不同的分布式事务处理机制。

锁,主要有两种:乐观锁和悲观锁。

  • 乐观锁:往往采用数据库加版本字段实现,粒度较小;
  • 悲观锁:可以采用基于JDK的Lock实现,粒度较粗;
  • 分布式场景下可以基于Redis集群和Zookeeper实现;

总结

通过以上方式我们可以提炼出针对于业务系统所需要具备的通用能力,在一定程度上满足了业务系统规则易变的特点,当然不同业务场景有自己的要求,很难有银弹,还需要根据自己的业务场景进行提炼和补充。

转载于:https://my.oschina.net/u/1000241/blog/3014150

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106981.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js正则表达式语法大全_vb 正则表达式

    js正则表达式语法大全_vb 正则表达式 JavaScript正则表达式的用法正则表达式是一种可以用于模式匹配和替换的强大工具,在很多语言中都可以应用。JavaScript对正则表达式提供了很好的支持,Javascript中有一个正则表达式对象RegExp。该对象提供了大量的属性和方法来处理正则表达式,同时,String对象也提供了相关的方法来处理正则表达式,在Web应用中,经常使用正则表达式来验证用户输入的信息,例如在用

    2022年9月20日
    0
  • html怎么动态获取系统时间_代码实现获取当前的地理位置

    html怎么动态获取系统时间_代码实现获取当前的地理位置HTML+JS动态获取当前时间效果图:说明:JavaScript中Date对象创建Date对象的语法:varmyDate=newDate()常用Date对象方法:方法描述Date()返回当日的日期和时间getDate()从Date对象返回一个月中的某一天(1~31)getDay()从Date对象返回一周中的某…

    2022年9月23日
    0
  • js的数据类型有哪些?[通俗易懂]

    js的数据类型有哪些?[通俗易懂]数据类型一、数据类型:基本数据类型(值类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)。引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function)。特殊的对象:正则(RegExp)和日期(Date)。特殊类型:underfined未定义、Null空对象、Infinate无穷、NAN非数字基本数据类型的值直接在栈内存中存储,值与值之间独立存在,修改一个变量不会影响.

    2022年9月5日
    3
  • pytest的使用_java中方法的调用

    pytest的使用_java中方法的调用Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

    2022年7月30日
    3
  • phpstorm2021永久激活码-激活码分享

    (phpstorm2021永久激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html9ZHRNTE33T-eyJsaWN…

    2022年3月28日
    851
  • mysql 各个版本驱动jar包

    mysql 各个版本驱动jar包http://central.maven.org/maven2/mysql/mysql-connector-java/

    2022年5月21日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号