摘要:
正文:
当前我国跨境电子商务正处于高速发展阶段。在发展初期,中小跨境电商企业通过入驻平台能够以较低的成本快速起步、推动商品销售以及学习平台的运营规范。但是从长远角度看,企业只通过平台进行经营会受到多方面的限制。一方面平台规则发生变化时,企业必须在平台规则范围内做出改变。另一方面市场环境变幻莫测,单一运营方式无法独立支撑企业生态。因此,某跨境电子商务公司为进一步发展跨境电商业务和推广品牌,决定建立自营在线商城系统。本项目组全体成员共12人,我担任系统架构设计师,主要负责整体架构设计,中间件选型和底层设计。该项目的架构工作于当年4月完成,整个项目耗时10个月,于2018年11月完成。
在架构工作的开始阶段,我们便意识到,架构风格定义了用于描述系统的术语表和一组指导构建系统的规则,是系统组织方式的惯用模式,可以为我们的项目提供架构级的通用解决方案,这种架构级的软件重用可以极大提高我们的系统建设进程。软件系统开发中常用的软件架构风格有数据流风格,调用/返回风格,独立构件风格,虚拟机风格,仓库风格。数据流风格包括批处理序列与管道-过滤器,其每一步处理都是独立,顺序执行的,适用于简单的线性流程。调用/返回风格包括主程序/子程序风格,面向对象风格,层次结构风格,其进一步降低系统耦合度,明确系统层次。独立构件风格包括进程通信,事件驱动系统,其构件特点为软件重用提供了支持。虚拟机风格包括解释器风格,基于规则的系统风格,其具有良好灵活性,可自定义规则。仓库风格包括数据库系统风格,超文本系统风格,黑板系统风格,其以数据为中心。除此之外,还有 dssa,soa 等架构风格。
在了解需求及架构评估后,我们决定在公司技术顾问的建议下,采用层次架构风格。为了解决公司原电商系统代码冗余问题,我们进行了系统服务化,中间层不同的子系统提供不同的业务服务。最终,我们将系统分为应用层,服务层,数据层。应用层负责具体业务和视图展示,如 站首页,搜索输入与结果展示等,其又分为视图层与业务逻辑层。服务层负责为应用层提供通用服务支持,如账户管理服务,session管理服务等,其又细分为逻辑处理层与数据接口层。而数据层负责提供数据存储访问服务,如数据库服务,缓存服务,文件服务,搜索服务等。接下来,我将分层次详细介绍基于三层的层次体系结构的设计过程。
首先是应用层。在应用层中,我们将系统根据应用进行水平划分,这有助于代码管理与维护。我们将系统划分为前台展示系统、后台管理系统、物流系统、财务系统、即时通讯系统等十余个子系统,这里以后台管理系统为例。后台管理系统作为系统管理员的操作平台,通过商品管理、会员管理、新闻管理、系统管理等核心模块对整个电商平台系统进行流程化统一管理。核心模块需要调用服务层的服务作为支撑,如会员管理模块需要调用服务层的会员信息服务接口。在应用层的设计中,视图层采用structs这一基于J2EE平台的MVC框架,主要通过Servlet与JSP技术实现,业务逻辑层采用spring这一基于IoC和AOP技术的框架,面向接口开发。另还用到了vue框架配合ssh实现前后台的分离和交互,使得前台和后台可并行开发,提高开发效率。
其次是服务层。随着服务器规模的扩大,开发人员的增多,每个系统都变得复杂,存在大量的重复代码。为解决这个问题,我们将代码冗余的系统服务化,即系统之间增加一个服务层。首先从结构上来看,系统结构更为清晰,立体。稳定性上来看,许多散落的代码成为了通用服务,并交付专门的团队负责运维。出于对成本与技术成熟度的考虑,我们采用了阿里研发的dubbo服务框架。在服务框架实际操作时有两个问题:服务框架自身的部署方式问题与实现服务框架所依赖的一些外部jar包与系统自身依赖的jar包之间的冲突。前者,我们通过Tomcat作为Web容器,而服务框架作为容器的一部分。后者,我们通过Java的ClassLoader将服务框架自身用的类与系统用的类进行隔离。
最后是数据层。数据层涉及缓存,文件系统,数据库,搜索系统等模块。由于用户对数据的访问具有集中性,所以我们基于SpringCache与Redis实现了缓存机制。由于系统的业务特性,数据库往往是读操作远多于写操作,所以我们对数据库进行了读写分离。数据访问方面,我们采用基于ORM或类ORM接口的方式,数据库使用基于ORM的Mybatis框架,再将框架包装一层,用于实现数据层功能,对外暴露的仍然是Mybatis的接口。该方法开发高效,敏捷,成本较低,而且兼容性不错。此外,我们采用solr作为数据层搜索引擎,数据访问层物理部署采用Proxy方式等。
最终项目成功上线,正常运行了近一年的时间,获得用户一致好评。但是在系统运行过程中,我也发现了这种架构存在的一些不足。首先是层次架构的多层调用降低了系统的性能,可以在层与层之间设立缓存机制来解决。还有我们采用的负载均衡算法是加权轮转算法,过于简单,常常出现资源分配不合理的现象,可以将算法改为加权最小连接数算法来解决。这些都是我在今后的系统设计和开发中需要注意与改进的地方,也警示我在以后的工作实践中需要不断地学习,提高自身素质和能力。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!