《全栈空间:后现代前后端架构》

261 阅读12分钟

 

最近忙着整活EI论文,意外发现一篇自己从前写的水文:特此纪念一下曾经深耕过的大前端。

 

  1. 引言
  2. 相关工作
  3. 项目环境和应用描述
  4. 软件架构设计
  5. 实施 —- 验证概念
  6. 总结

虽然使用服务端JavaScript,结合node.js框架来实现web应用程序的现象在现在的企业环境中越来越常见,但是关于node.js对web应用架构发展的影响的研究却很少出现在科技文献中。尤其是人们很少研究如何结合web组件,利用它们之间的相互影响来构建纯JavaScript的商业应用。因此,本文,我们将呈现一个在真实环境下,结合CMS/CRM的在线服务以及它的软件架构,它通过相关核心功能的原型实现进行评估。结果充分表明该方法的可行性和潜力。

一、引言\

当Ryan Dahl在2009年推出node.js时,人们对服务器端JavaScript利用率的好奇心明显增加了 - 无论是在商业还是在科学领域。运行在Google的V8 JavaScript引擎上的node.js,引入了非阻塞I / O事件模型的概念,它用单线程替代了传统web服务器中熟知的多线程。这种单线程事件循环可以更好的使用硬件资源,可以接受更高的并发客户端连接数,使node.js成为服务器端web应用程序开发的重要替代方案。

除了与性能相关的优点之外,JavaScript在高级应用程序前端的应用也很广泛,如今非常常见。因此,将其用于后端开发也大大简化了web应用程序开发的整个过程。此外,node.js还带有自己的包管理器“npm”,它支持第三方库及其依赖项的分发和简单安装,以便扩展现有开发项目。

考虑到node.js的所有优势,来自不同行业的许多大型企业,如Uber,PayPal 或Netflix ,都已经将node.js用于自己的项目,这种现象在现在也不足为奇了。

但是,尽管许多现代web应用程序都是基于node.js架构构建的,但只有少数的科研成果,特别是从科学的角度发表了各自的架构方法的论文少之又少。现有的科学文献主要是处理node.js的性能相关问题或评估实际的软件项目,当涉及到node.js体系结构考虑时,它们通常只表现出比较低级的描述和抽象。

因此,在本文中,我们为实际的web应用程序提供了一个基于node.js的示例软件体系结构,然后通过概念验证,实施并且最终评估。

本文的其余部分安排如下:文章在第2节中详细分析了相关文献。在第3节中介绍该项的研究背景,在第4节中描述所提出的应用程序架构,通过第5节中说明的概念来评估整个体系结构。最后总结了我们的发现。

二、相关工作

近年来,客户关系管理(CRM)系统的研究已成为研究的热点。关于CRM应用程序的与业务无关但与技术相关的方面,尤其是对基于云的解决方案的兴趣和热度一直在增加。关于CRM系统的体系结构设计,存在许多基于web的方法,但他们都没有使用服务器端JavaScript或node.js。

web内容管理系统(CMS)的主要科学研究兴趣存在于20世纪90年代末期和2000年代早期。最近有关CMS的文献侧重于与绩效相关的和与安全相关的问题,以及架构设计的方法。然而,没有一个出版物提出基于node.js或 JavaScript的方法。

最近几年,有关node.js和服务器端JavaScript的同行评审出版物的数量有所增加。尽管如此,大多数研究都侧重于平台的技术方面,如性能和可扩展性或安全,而不是调查其在构建web应用程序方面的实际能力。

一些作者在实际项目中使用node.js ,但他们主要关注项目及其本身的影响力,而不是描述在node.js上构建的软件架构。实际上,在node.js内核级别上提出或讨论潜在的web应用程序架构的出版作品很少。在CRM或CMS应用程序环境中讨论架构node体系的提议更是尚不存在。

因此,本文讨论了如何设计一个具有CMS与CRM相结合功能的真实在线服务网络平台,利用最先进的服务器端JavaScript和node.js软件架构进行示例,例如所谓的C9X平台。

 三、项目环境和应用描述

C9X应用背后的主要思想是提供一个基于网络的平台,这个平台中,服务提供商和服务消费者(处于55-75岁的过渡年龄)的健康相关服务将被自动化匹配,这个背后的技术基于精确搜索(由服务消费者执行),或者基于服务 - 消费者的特定需求和自我改进机器学习,通过复杂的匹配算法自动执行。 

除了匹配算法之外,平台的第一个实际核心功能是充分展示服务提供商及其服务。C9X提供类似CMS的管理界面,允许提供商舒适地将他们的服务输入app并发布各种其他多媒体信息,这个媒体平台其实就是一个类似个人档案的地方。

 

当服务 - 消费者选择了适当的请求类型时,他可以分别向提供者发送请求,目的是利用相应的协议生成一个”复合”的服务。一旦所有人都接受了请求所涉及的各方,就生成了所谓的’案例’,这其中包含了服务消费者和服务提供者所有与服务相关的信息。该案例代表了所有参与者沟通,共享文件的”中心”,以及有关整体服务提供的子任务的信息和状态。这种基于案例的服务处理非常类似于CRM应用程序。为了实现C9X平台的目的,两者都是必不可少的: 不同的应用程序类型 -  CMS应用以及CRM应用 - 必须相互交织。

平台的实际架构设计:

•REQ1:希望能够适合过渡时期老年人的用户界面,可在桌面和移动设备上使用设备

•REQ2:面向服务提供商和专业网络协调员的更像企业环境的桌面UI

•REQ3:基于web的应用程序,可以轻松地,无处不在地访问平台,避免客户端软件安装

•REQ4:具有高级的安全性和数据完整性,以确保与健康相关的敏感客户数据被保护

四、软件架构设计

 由于C9X是如此高度定制化的混合应用程序,使用或调整现有的现成后端CMS/CRM解决方案,如Keystone.js3,Ghost.js4或Enduro.js5并不是一个很好的选择。

 

 

合适的框架要求包括灵活性,可扩展性,安全性,可扩展性和高度的流程自动化,如集成的对象关系映射(ORM)或基于命令行界面的API生成的框架。满足所有这些要求的一个框架是Sails.js。Sails.js是一个基于Express.js的轻量级服务器端MVC框架。它提供了一个名为“Waterline”的集成ORM模块,有几个不同的数据库接口,以及集成的“Blueprint API”,Sails.js为使用sails命令行创建的所有模型提供基本CRUD功能的路径,为控制器和控制器方法自动生成interface。

C9X应用程序构建在CentOS 7网络服务器[REQ3]上的MEAN-Stack上,该服务器还运行该平台的mongodb数据库。持久数据存储最好使用mongodb,也就是nosql,事实证明,nosql数据库具有更高的数据吞吐量,更高的性能和可扩展性,并且功能更加简单,更适合作为密钥值存储系统,mongodb与MySQL或MariaDB [REQ4] 等传统关系数据库相比有着更大的优势。

为了满足应用程序的安全性要求,Sails.js由Waterlock.js库进行扩展,后者是一种基于JSON Web令牌(JWT)概念的用户身份验证工具。如果未经身份验证的服务器端访问,它将限制用户和社交账户的单点登录(SSO)[REQ4]。此外,作为反向代理操作的Apache2 webserver7与应用程序相互重叠,同时作为所有传入和传出HTTP请求的过滤器。Apache具有高级的安全机制,如果Sails.js应用程序发生故障,它能够提供分离的静态HTML文件,从而增加了应用程序的安全性和性能。

由于架构方法需要支持高水平的应用灵活性和短反应 - 以及合适的反馈持续时间,创建前端平台的最佳方法是遵循基于JavaScript前端框架的单页面应用程序(SPA)架构,如Angular,React.js,Vue.js或Backbone.js [ REQ1] [REQ2]。其中Vue.js非常适合构建C9X应用程序,因为它具有模块化开发的方法,大量的外部库,比Angular或React.js更轻量级。vue由Vue-Resource扩展,后者是一个HTTP客户端,用于与应用程序后端的标准化通信。Vuex是一个应用程序的总体状态管理工具。前端身份验证由Vue-Auth处理,它在与Sails.js的Waterlock库的JWT同步中,另外提供基于角色的前端访问限制的功能,整个过程与Vue-Router组合。Vue-Router是Vue的SPA前端路由包,可以方便的启用应用程序。

然后我们应该在前端级别拦截和处理URL调用,而不是直接将它们重定向到应用程序后端。最后,Vue.js使用BootstrapVue库,它表示基于Vue从而达到替换jQuery的bootstrap自适应组件(例如模态,动画或前端验证)的目的。BootstrapVue提供了一个大型模块化框架,预先构建的前端组件,所以它非常有资格组装平台上基于CMS的前端优化及其CRM仪表板,以及针对服务提供商和网络协调员进行优化[REQ2]。

五、实施 —- 验证概念

为了演示我们的架构设计的实际功能,一个完整的前端到后端通信将利用“表单向导”实现,它提供快速输入表单和数据提交的功能。该向导由交互式表单输入组成,而且具有基于BootstrapVue的前端验证机制。

表单作为JSON对象传送到调用父元素中的向导模块。所以除了实际输入的定义及其验证规则,定义了使用VueResource进行数据提交的服务器端目标路由也在那个JSON数据中。由Waterlock保护的服务器端控制器仅允许接收和处理数据,如果有有效的JWT令牌,他们的模型会自动构建Blueprint CRUD函数或自定义控制器函数。最后,数据被传递给mongodb以保存。

尽管该应用程序仍处于开发阶段,对整体CRM / CMS混合概念的验证仍然悬而未决,但是这个工作表单向导组件已经证明了我们的架构方法的整体可行性以及所选组件的成功相互作用。

六、总结

总之,在本文中,一个基于JavaScript,node.js和服务器端的示例架构设计方法已经呈献给大家了,并且我们通过CMS / CRM混合C9X应用的方式对服务网络平台上的所有概念进行了评估。

我们所提出的体系结构给app提供了一个安全且高性能的基于Vue.js的SPA前端与一个轻量级且结构良好的基于Sails.js的应用程序后端。我们所选择的解决方案已被证明是非常有用的构建底层平台或开发其他类似应用程序的功能基础。

我们还需要进一步研究,以便对给定方法进行更全面的评估,特别是完整的C9X应用程序仍然需要全面实施和评估,比如还需要实验室和现场测试。

任何流行的软件技术背后都有严谨的数学理论作支撑,本文提出的MEAN全站架构也是如此,其中mongodb是最像SQL的数据库,在它背后有关系代数,集合论以及B-tree来提供数据结构和索引,node.js和Express.JS是基于单线程的非阻塞事件模型,同时利用restful-api设计模式来提供高效的web服务,最大程度的减少信息熵,前端的AngularJS框架背后则是MVVM分离模型提供的理论支持。整个MEAN全栈之所以能够挑战传统的全站架构正是依赖于每一个技术背后的理论研究,本文的web应用也将尽可能的遵守MEAN全栈,希望能够”站在巨人的肩膀上” 提供高可用,高性能的web服务。

除了全栈架构,从安全的角度考虑的话,我们还需要让app上ssl,也就是HTTPS。https的实现需要一个域名,还要向CA机构购买一个ssl证书并且需要node.js标准库的支持。我们要利用ssl证书建立一个绝对安全的点到点连接,给用户提供更安全的保障和体验: MEAN全栈结合HTTPS让整个网站(app)体系更加完整。

如果考虑到前端不止web这一个平台,我们还希望能够利用Electron,react native等框架实现移动端,桌面端,甚至嵌入到第三方流行平台的app服务,让我们的服务实现跨平台访问。当然,在非web平台,前端不再局限于angular框架,而要采用适用于不同平台的开发框架以及模型,这将对整个前后端架构产生一定的影响,本文就不展开研究了,还是主要设计以web为平台,node.js+mongodb作为后端的架构艺术。