Worktile 技术架构概要
其實早就該寫這篇博客了,一直說忙于工作沒有時間,其實時間擠擠總會有的,可能就是因為懶吧!從2013年11月一直拖到現(xiàn)在,今天就簡單談?wù)?Worktile 的技術(shù)架構(gòu)吧 。
Worktile 自上線到現(xiàn)在收到了很多用戶的喜歡,我們倍感欣慰,自己做的產(chǎn)品得到了用戶的認(rèn)可是件幸福的事情,其中有很多來自IT的用戶,經(jīng)常在官方群或者知乎上問一些關(guān)于Worktile的技術(shù)問題:
Worktile 采用的是怎么樣的架構(gòu)?
Wortile 前后端采用了哪些技術(shù)?
...
Worktile整體架構(gòu)一覽
Worktile 是企業(yè)協(xié)同辦公軟件,所以一開始注定就應(yīng)該是單頁應(yīng)用(SPA),因為使用SPA后,用戶在瀏覽器端可以像操作原生客戶端程序一樣的體驗(速度和流暢度),對于開發(fā)者來說,前后端分離,服務(wù)端只提供RESTful API服務(wù),移動端集成也非常的方便,具體可以看下面這張草圖。
?
?
前端
Worktile的服務(wù)端基本上只是提供API數(shù)據(jù)服務(wù)的,不會渲染HTML,前端的代碼在發(fā)布之前會使用 Grunt 工具打包合并壓縮成一個js文件。
Angular.js
既然是SPA程序,前端必然要選擇一個MVC(或者M(jìn)VVM)框架,關(guān)于前端MVC框架有很多,當(dāng)時面臨選擇的時候也是比較猶豫,因為在此之前我們只初略的使用過?Knockoutjs?。
其實我們當(dāng)時就是急切的希望一個框架能做到:
最終我們選擇了 Angular.js,具體其中選擇的細(xì)節(jié)就不一一描述了(之前在知乎上也回答過關(guān)于Angular.js 的問題:Angular.js 在實際應(yīng)用中有哪些優(yōu)缺點?),從開始使用到現(xiàn)在已經(jīng)快2年了,事實證明當(dāng)初的選擇還是沒有錯的, Angular.js的確很適合 Worktile。
Bootstrap 和 jQuery
選擇Bootstrap主要是為了使用它的基礎(chǔ)CSS功能,在它的基礎(chǔ)之上很容寫出規(guī)范的樣式代碼,當(dāng)然我們也需要使用其中的部分Javascrip組件功能,因為原生的 Bootstrap是基于 jQuery的,為了在Angular.js中也能很好的使用它,我們引入了 UI Bootstrap、關(guān)于jQuery大家再熟悉不過了,我們使用的很多第三方插件是jQuery的,所以也一并引入了。
上面只是列出了 Worktile 主要使用的幾個Javascript框架和類庫,真正使用的類庫遠(yuǎn)不止上面列出的這些。比如日歷庫?ui-calendar、underscorejs?等等...
服務(wù)端
Node.js
服務(wù)端是構(gòu)建在Node.js之上的,我們的服務(wù)端MVC框架采用的是?Expressjs,剛開始是 Express 3.x版本,現(xiàn)在已經(jīng)升級到 4.x,Expressjs提供了 Route和模板引擎的功能,由于我們的服務(wù)端基本只提供數(shù)據(jù)服務(wù),所以關(guān)于服務(wù)端模板引擎這塊基本不使用(只有布局和一些配置項輸出到界面時需要用到)。
選擇 Node.js 是因為它簡單,適合高并發(fā)的Web服務(wù),而且我們的開發(fā)人員能夠熟練使用它,關(guān)于Node.js的優(yōu)缺點我在知乎上也曾經(jīng)回答過:使用 Node.js 的優(yōu)勢和劣勢都有哪些?。
Redis
Worktile 用戶的登錄狀態(tài),一些臨時使用的數(shù)據(jù)、部分業(yè)務(wù)數(shù)據(jù)緩存 都是放在 Redis 里面的,關(guān)于Node.js怎么和 Redis 連接采用?Node Redis?模塊。
MongoDB
Worktile 并不是那種高度事物性的系統(tǒng)或者傳統(tǒng)的商業(yè)智能應(yīng)用,所以MongoDB非常適合,性能非常高,集群方便,而且以BSON結(jié)構(gòu)存儲,和Node.js完美集成。
Worktile 的數(shù)據(jù)層和MongoDB之間并不是使用?原生的驅(qū)動?,而采用了?mongoosejs,類似Java或者C#上的ORM框架,使用 mongoose 可以很方面的定義數(shù)據(jù) Schema,讀取操作 MongoDB。
推送服務(wù)
前面也說了 Worktile 是 SPA程序,用戶登錄到系統(tǒng)之后,基本上所有的操作都不需要刷新瀏覽器,因為是一個協(xié)同辦公軟件,其他用戶多數(shù)據(jù)進(jìn)行操作需要實時更新,所以客戶端必然要和服務(wù)端保持一種長連接,方面進(jìn)行數(shù)據(jù)交互,我們的實時推送服務(wù)是采用 Erlang 語言編寫的,感興趣的可以查看:https://worktile.com/tech/basic/worktile-real-time-notice
采用 Erlang 是因為我們的開發(fā)人員有這方面的經(jīng)驗,并且Erlang非常適合做這個高并發(fā)實時推送服務(wù)。
如果你熟悉 Node.js 肯定知道?Sockiet.IO,我們最初的實時推送其實是采用 Sockiet.IO的,后來由于訪問量的增張,原有的Sockiet.IO 是基于Worktile Web站點的,沒有獨立成單獨的服務(wù),重構(gòu)的時候徹底采用Erlang重寫了。
其實這2種技術(shù)都非常優(yōu)秀,選擇哪種主要取決于你擅長什么。
文件預(yù)覽服務(wù)
使用過 Worktile 的人肯定都知道,在系統(tǒng)中上傳一些文件,比如:word、excel、txt、pdf、ppt等等,都是可以在線預(yù)覽的,關(guān)于 txt、pdf這些文件的預(yù)覽其實好辦,txt直接讀取文件內(nèi)容即可,pdf采用瀏覽器自帶的預(yù)覽或者使用一些Js類庫都很方便的做到,但是對于 Ofiice 文件,是不可以直接讀取的,所以我們自己搭建了一套 Ofiice的預(yù)覽服務(wù),這個服務(wù)主要是基于微軟的?Office Web App服務(wù)
Box 文件服務(wù)
Worktile 中所有的文件存儲在阿里云的OSS上,為了做一些權(quán)限的認(rèn)證和安全問題,我們通過一個Box服務(wù)做中轉(zhuǎn),所有文件的上傳下載都是走 Box 服務(wù)。這要感謝 5樓的Box之父 @Shaun Xu 寫出了這么好的Box 服務(wù)。
以上是Worktile用的所有技術(shù)和架構(gòu)簡單介紹。
Worktile 自上線以來用戶的增長也是非常迅速的,所以 Web服務(wù)器從原先的1臺變成多臺,數(shù)據(jù)庫從單實例到現(xiàn)在的集群,等等,關(guān)于目前Worktile的服務(wù)器結(jié)構(gòu)圖參考如下:
總結(jié)
以上是生活随笔為你收集整理的Worktile 技术架构概要的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用编码的 UI 测试来测试 Windo
- 下一篇: (转)所有iOS设备的屏幕分辨率