本人博客:http://chen-shang.github.io
在公司有幸自己搭建了一套項(xiàng)目,牛刀小試。挺感謝組長(zhǎng),在搭建的過(guò)程中他跟我分享了許多他以前的經(jīng)驗(yàn)和教訓(xùn)。
** 搭建一個(gè)好項(xiàng)目的終極奧義是為了別人寫(xiě)代碼的時(shí)候爽?。?**
你搭建的項(xiàng)目最終還是由其他人來(lái)開(kāi)發(fā)業(yè)相關(guān)務(wù)代碼的,所以要讓別人在你框架上寫(xiě)的開(kāi)心才行。
搭建項(xiàng)目這種事,在牛人眼里是最最基礎(chǔ)和最最簡(jiǎn)單的事情了。對(duì)于我這樣的初學(xué)者,搭建項(xiàng)目需要考慮的問(wèn)題還是蠻多的,我第一次搭建項(xiàng)目也不是很熟悉,現(xiàn)在這次實(shí)戰(zhàn)的經(jīng)驗(yàn)做出以下總結(jié)。
如今 saas 項(xiàng)目已初具規(guī)模了,大家在這套框架上寫(xiě)代還是比較愉快的。
這篇文章只是搭建項(xiàng)目中需要考慮的情況和遇到的問(wèn)題的總結(jié),重在思想的概括,不涉及具體技術(shù)的使用。
主旨
- 項(xiàng)目的定位
- 使用技術(shù)的選擇
- 搭建過(guò)程中考慮到的問(wèn)題
項(xiàng)目定位
首先是項(xiàng)目的定位,也就是這個(gè)項(xiàng)目是為什么服務(wù)的?
你是給前端喂接口呢,還是與供應(yīng)商對(duì)接呢?你是內(nèi)網(wǎng)訪問(wèn)呢還是要把服務(wù)對(duì)外公開(kāi)呢?
你首先要有一個(gè)清醒的認(rèn)識(shí)那就是你做的是個(gè)什么東西。
我需要做的 saas 項(xiàng)目就屬于一個(gè)給前端為接口的一個(gè)項(xiàng)目, vendor[我公司的其他項(xiàng)目組的項(xiàng)目,其主要職責(zé)則是與供應(yīng)商對(duì)接然后對(duì)內(nèi)提供基礎(chǔ)服務(wù)的]則是屬于與供應(yīng)商對(duì)接的項(xiàng)目, HL(Hyperloop)[我公司的另一個(gè)項(xiàng)目組的項(xiàng)目,我也在里面呆過(guò),也是里面的元老級(jí)人物了] 則隱藏在內(nèi)網(wǎng)中不準(zhǔn)備對(duì)外暴露接口的項(xiàng)目
清楚了我是要做一個(gè)喂接口項(xiàng)目,不是 web 項(xiàng)目,所以沒(méi)有必要非得給應(yīng)用加上 web 頁(yè)面的功能,但要考慮到以后有可能會(huì)做擴(kuò)展,未雨綢繆總是好的,開(kāi)發(fā)過(guò)程中唯一不變的就是變化!
使用技術(shù)選擇
做開(kāi)發(fā),用什么技術(shù)都能實(shí)現(xiàn), 選擇 scala 或者是 java 都行,選擇 play框架或是 spring 框架也都行,關(guān)鍵在于你所處的大環(huán)境。往往有些時(shí)候,你學(xué)的和你用的技術(shù)往往都不大相關(guān),就像我學(xué)匯編出身(因?yàn)槲覀儗?zhuān)業(yè)就教這個(gè)),我工作后用 java(因?yàn)楣镜那拜吶际莏ava兒),我來(lái)北京分貝通后用 scala(因?yàn)橹暗膯T工非常之討厭 java 和非常之喜歡 scala 這門(mén)語(yǔ)言)。
我們最后討論選擇了
spring + spring mvc + mybatis + postgres
軟件開(kāi)發(fā)語(yǔ)言最終還是放棄使用 scala了(scala 的 slick 框架對(duì)事物的支持并不太友好,這個(gè)其他同事很是反感) 轉(zhuǎn)而是用 java(畢竟好招人啊)
最終還是沒(méi)有沿用 play 框架, 轉(zhuǎn)而使用了 spring 那一套(還是大家之前都是 java兒,想都沒(méi)想都想用 spring 了)
既然使用了 spring 那持久層自然選用呼聲較高的 mybatis了
項(xiàng)目管理工具使用 gradle(因?yàn)槲疑弦患夜揪陀眠@個(gè),我還是比較熟悉,而且比較新,在我的強(qiáng)力要求下使用--其實(shí)是努力爭(zhēng)取下)
數(shù)據(jù)庫(kù)沿用公司其他項(xiàng)目使用的數(shù)據(jù)庫(kù) postgres 考慮到與其他項(xiàng)目兼容問(wèn)題吧
搭建過(guò)程中思考的問(wèn)題
鑒于其他項(xiàng)目組暴露出來(lái)的問(wèn)題,爭(zhēng)取在 saas 項(xiàng)目中避免
抽象的重要性就提現(xiàn)出來(lái)了
提供統(tǒng)一的接口來(lái)處理一些共性的問(wèn)題,這樣大家寫(xiě)的代碼也比較整齊,不會(huì)對(duì)同一功能,你寫(xiě)一套,他寫(xiě)一套
1、既然是提供接口,那就得記得打印輸出日志吧,日志系統(tǒng)需要健壯并完善
2、日志的requestid
3、http交互
4、測(cè)試框架
5、發(fā)版系統(tǒng)
6、全局參數(shù),全局屬性,配置文件讀取
7、與其他系統(tǒng)交互是的鑒權(quán)
8、命名和編程風(fēng)格
9、統(tǒng)一的異常處理體系
首先是日志這一塊兒,一個(gè)良好的日志可以快速定位問(wèn)題所在。選用 logback 來(lái)輔助, MDC 來(lái)生成全局唯一的 requestid,考慮到并打的時(shí)候,日志的打印是無(wú)序的,需要一個(gè)全局的 requstid 來(lái)將請(qǐng)求串聯(lián)起來(lái)。
再就是這個(gè)系統(tǒng)肯定會(huì)于其他系統(tǒng)或后臺(tái)交互,所以需要提供一套與網(wǎng)絡(luò)交互的 api 方便其他同事使用
開(kāi)發(fā)過(guò)程中,隨手寫(xiě)測(cè)試是很重要的,mock 的技巧會(huì)使你輕松很多。
寫(xiě)代碼中免不了會(huì)用到配置文件,提供一個(gè)公共的類(lèi)來(lái)使用。
最后寫(xiě)好開(kāi)發(fā)文檔,像這些功能最好有一個(gè)詳細(xì)的文檔,當(dāng)新同事來(lái)的時(shí)候可以快速入手,避免重復(fù)制造輪子,因?yàn)樾峦聛?lái)的時(shí)候項(xiàng)目已經(jīng)很龐大了,沒(méi)有人會(huì)一個(gè)一個(gè)類(lèi)的去看你是做什么的,當(dāng)他也需要讀配置文件或者使用網(wǎng)絡(luò)請(qǐng)求的時(shí)候很有可能就會(huì)按照自己的習(xí)慣和風(fēng)格開(kāi)始另起爐灶,導(dǎo)致系統(tǒng)越來(lái)越龐大。
總結(jié)
最后在在說(shuō)一遍, 變化是唯一不變的事情??!盡量考慮到變化和擴(kuò)展,我也只能盡力了??!加油