1、简介html
通过一个月+的开发,upopen.cn我的站点重构基本完成,本文先总结总体架构及主要技术点,后续再单独详解各技术点及开发过程。java
首先重构的目的在于系统化架构、理清分离开发及服务端开发思惟、尝试使用多的技术点,为提高公司项目的全栈应用作准备。node
本次共计三个服务[小部分技术点还在提交中],总体采用先后端分离(web服务端,数据服务端),以restful API通讯mysql
站点: !<www.upopen.cn>react
git: https://github.com/xiaolulu/upopenwebpack
QQ群: 435485569nginx
系统功能git
web: web服务端github
站点前台服务,属先后端分离中的前台,负责页面渲染、与客户端及server端的数据交互,使用http协议web
server: 数据服务端
站点后台服务,属先后端分离中的后台,与web服务端及数据库的数据交互,不直接与客户端通讯,实际项目中常会用java实现
check:
属工具类服务,用于记录、验证接口功能,在先后端分离过程当中,以方便并行开发
=============================================================================
2、系统架构
3、系统目录
docs:系统文档
log: 系统日志,独立成单独的服务
web/ check/ server/
check: 接口记录、验证系统,总体采用MVSC结构,server、web系统也采用相同结构
app.js package.json webpack.config.js assets/ 静态资源包 build/ react打包后文件 model/ 数据层 views/ 展现层 controls/ 控制层 server/ 业务层 lib/ 工具包 config/ 配置,运行前须要修改各config里的配置项 test/ 测试
server: 大体同check
web: 大体同check,多了gulp
static: 静态资源文件
upload: 上传资源文件
=============================================================================
4、技术点:
罗列本系统用到的一些有表明性的技术点,后续再分别详解。
一、nginx: 做为分发服务器,域名服务分发、缓存、GZIP压缩、负载等
二、nodejs: web、server、check系统,其中server在公司项目中经常使用更成熟的语言开发,如java
三、express: web、server系统使用,是目前最常使用的nodejs框架,我也一直在使用
四、koa: check系统使用,与express的主要区别在于异步回调的同步写法的实现,以解决回调金字塔的问题,回调金字塔很早就被问到过,不过当时认为这个不是问题,自身项目一般三层回调就能够解决了,而且函数分配合理,对易读性也不会有太大影响,不过本次开发过程当中尝试使用了KOA,其对代码的易读、精简、组织上仍是有很大的提高的,建议使用,须要必定的学习成本,另外其对一些已经开发第三方插件未全面支持,如redis、request等,须要再次包装同步调用机制,固然例举的这两个已经有了co-redis、koa-request。
五、ejs: web系统使用,作页面渲染引擎,html在程序的语法上支持有限,jade成本会更高些,ejs在语法上和html一致,额外又支持数据语法。昨天和朋友讨论过这个问题,这也是不少初次接触分离的人疑问,为何不直接使用html,数据所有用ajax,首先以我遇到的项目,所有走ajax是可行的,但有些页面变量据服务端配置动态获取会更好,而且在考虑SEO的时候数据更要直接渲染
六、redis: server、web系统使用,缓存服务器,用于暂存一些状态数据,以便快速读写,如登陆成功后由server将该用户数据写入到redis,并将对应的key经过web写入页面cookie,获取用户数据时,web都会先到redis里获取该用户是否登陆。在对数据读取效率要求很高的状况下,也能够将数据库数据所有同步到redis,从redis读取,增删改操做数据库后,同步到redis.
七、mongodb: check系统数据库,用于记录接口列表,简单易用,效率较高
八、mysql: server系统数据库,区别于mongo,其在实际项目应用更普遍。
九、reactJs: check系统页面,该系统是单页面,接口记录、验证抽象成组件,使用reactjs在开发及model维护上效率较高。
十、webpack: check系统页面模块化、打包工具,配合reactJs
十一、requireJs: web系统页面模块化。
十二、log4js: web、server、check系统日志管理,服务端开发日志记录是必须的,常规的数据收发、异常错误跟踪、性能优化(如当某请求返回超过3秒就须要记录了)
1三、shouldJs、supertest、jasmine、coverage、karma: 共同组成单元测试方案
1四、gulp: web集成jshint、unglify等的自动打包工具
1五、nodemailer: server系统使用,用户注册成功后发送邮件到对方邮箱。
写了一篇文章:http://www.upopen.cn/blog/info?id=10020
1六、pm2: Nodejs进程管理器
写了一篇文章:http://www.upopen.cn/blog/info?id=10021
1七、socket.io: web系统使用,在线用户所属数据改变时推送。
1八、其它,如http协议、加密、静态化等。
5、其它
系统在开发过程当中,本着实用、多用的原则,推迟了开发周期,也尽可能详细了解、记录了各软件、插件的使用。如mongodb的链接简单来说就是
mongoose.connect( 'mongodb://' + config.host + '/' + config.db );
这也是常见demo的写法,即没有负载备份也没有验证,但实际使用时其至比项目程序的负载更重要,因此是应该写成
var options = { db: { native_parser: false }, server: { poolSize: 15 }, replset: { rs_name: 'rename' }, user: 'username', pass: 'password' } mongoose.connect( 'mongodb://10.10.10.1:27017,10.10.10.2:27017,10.10.10.3:27017/updb', options );
对其它一些的插件也从实际使用过程当中多了一些本身的理解,后续更新,但愿会你们有所帮助