之前开发了一个包括多端(PC端,移动端,微信端,API)的B2B系统,分享一下系统的架构设计演进。
playframework
无状态
全栈(Hibernate,Netty,Groovy,Cache)
Python运维支持,开发热加载
AngularJS
对象操作
双向绑定
模版
这样的技术选型是基于低成本/小规模团队快速上线应用的需要。
选择playframework是它让我们从开发到运维都能省去很多成本,对于开发人员只要掌握一定的语法就可以直接关注业务逻辑,不用所有的人都特别升入的学习框架。
自动编译和重载:当编辑Java文件并保存后,刷新浏览器就能立即查看结果。使用Play开发不需要手动编译、部署以及重新启动Web服务器等操作。
无状态模型:Play是真正的无共享框架,为REST而准备。它可以将同一个应用的多个实例分别部署在多台服务器上,因而扩展性非常强。
高效的模板引擎:基于表达式语言Groovy的清晰模板引擎,提供了模板的继承、导入以及标签自定义等功能。
快速解决错误:当错误发生时,Play会在浏览器中显示出错代码块并提示问题发生的确切位置。
Full Stack:提供创建Web应用所需的全部功能,集成了Hibernate、OpenID、Memcached等第三方类库。
纯Java:Play采用Java编写代码,可以方便地使用任何Java类库,并且能够非常好地和Eclipse、Netbeans等IDE集成,只需通过命令生成匹配的项目文件即可。
基于非阻塞的IO模型:允许创建基于长轮询和WebSocket的主流Web应用。
有趣并且高效:省去了Java应用重启的时间,提高了应用的开发效率。
选择AngularJS是我们的应用更多的是后台应用,在2014年轻量级可选择的还只有knockout和angular,考虑到谷歌以及丰富的控件组件,mvvm的便捷实用我们选择了它,现在它仍然在很好的发挥着作用,在前端开发人手不足时能让后台开发也能介入前台开发,以便应用快速上线。
我们并不是只用playframework提供的功能而已,在playframework的基础上考虑整体的性能和扩展自定义开发等方面我们在playfamework上做了一些改进
强制使用上下文(控制边界/业务隔离)
实体缓存(提高效率)
引入元数据(规范操作,公共问题公共处理)
回调机制(解耦/二开)
playframework服务化(前后端分离/代码复用/更丰富的API)
Swagger:API量化(测试深入参与后端服务接口测试)
大量使用多线程编程来提升系统运行效率
同时我们使用阿里云的OSS来做静态资源(JS/CSS的存储),使用七牛云存储来存储站点的大量图片和附件信息。
解决前端页面加载效率因地区而异
节省带宽资源
专注业务处理
为集群服务铺路
在运维上我们做了一些优化提升
全站HTTPS
避免单点积压
提高处理效率(相对部分HTTPS)
提升系统安全性
负载均衡
提升系统稳定性
提升访问性能
分布式memcached服务
避免单点雪崩效应
单实体强制缓存化(有效利用缓存分担数据库压力)
ELK
提供集群部署下快速分析解决问题的入口和渠道
Swagger-API文档
方便前后台分离协同开发及第三方开发者社区规范开发