PPT:http://qiniuppt.qiniudn.com/xiemengjun.pdf
視頻(謝孟軍&響馬): http://qiniu-opensource.qiniudn.com/ecug-2014-xiemengjun.mp4
下面是文字版:
謝孟軍:大家好袱耽,我是謝孟軍锌杀,我是beego作者覆享。今天我來(lái)講一下beego的設(shè)計(jì)理念和API開(kāi)發(fā)爆惧,大家有聽(tīng)過(guò)beego的嗎臊旭?有用beego在自己項(xiàng)目里面做嗎落恼?OK,今天的大綱就大概講一下是這樣离熏,首先我要講一下什么是beego佳谦,然后講一下beego的設(shè)計(jì)理念,里面有很多的模塊滋戳,每一個(gè)模塊怎么樣設(shè)計(jì)的钻蔑,可能會(huì)牽涉到一些GO設(shè)計(jì)的東西,然后講一下插件化的東西胧瓜,最后講一下API的開(kāi)發(fā)矢棚。我個(gè)人比較看好Go在API方面應(yīng)用的開(kāi)發(fā),當(dāng)然Go用來(lái)開(kāi)發(fā)Web也是OK的府喳,但是沒(méi)有用PHP開(kāi)發(fā)那么方便蒲肋,但是開(kāi)發(fā)API的話(huà)GO是有很多天生的優(yōu)勢(shì),所以到時(shí)候我會(huì)講一下,最后我會(huì)用一個(gè)最近開(kāi)發(fā)的一鍵式的開(kāi)發(fā)工具兜粘,大家現(xiàn)在有很多的數(shù)據(jù)庫(kù)申窘,老板說(shuō)要基于這個(gè)數(shù)據(jù)庫(kù)做一個(gè)API,文檔什么都要有孔轴,我先前因?yàn)樵谏弦患夜咀鲞@個(gè)東西剃法,因?yàn)楣緮?shù)據(jù)庫(kù)表有200多個(gè),讓我做我就要寫(xiě)的瘋掉了路鹰,所以我就寫(xiě)了這個(gè)自動(dòng)化的工具贷洲,可以從數(shù)據(jù)庫(kù)自動(dòng)的生成所有的API加文檔,而且你還可以自動(dòng)的生成對(duì)應(yīng)的SDK晋柱。比如說(shuō)PHP應(yīng)該怎么調(diào)用你的API优构,因?yàn)樗且徽椎纳鷳B(tài)系統(tǒng)已經(jīng)全部有了,這就是選擇swagger的原因雁竞,所以就可以一鍵式的全部生成基于你數(shù)據(jù)庫(kù)表的API應(yīng)用加文檔钦椭。
什么是beego?beego是我進(jìn)盛大的時(shí)候開(kāi)始做的碑诉。當(dāng)初我最主要的想法是要用Go做一個(gè)類(lèi)似Python的框架彪腔,當(dāng)開(kāi)始的時(shí)候你會(huì)發(fā)現(xiàn)所有的方法其實(shí)跟Python是一樣的,當(dāng)初差不多就5個(gè)文件进栽,然后我說(shuō)一個(gè)框架也寫(xiě)好了很方便德挣。剛開(kāi)始我就是很簡(jiǎn)單核心的東西,后面隨著我做的東西越來(lái)越多泪幌、越來(lái)越多盲厌,所以我就做了很多的模塊,是有很多豐富模塊的框架祸泪,但是現(xiàn)在還是保持著很少的核心吗浩,通過(guò)不斷的增加模塊、不斷的增加一些庫(kù)没隘。
第二個(gè)因?yàn)榛谶@樣的設(shè)計(jì)所以是很松偶合的框架懂扼,很多的東西都是模塊化、插件右蒲,都是很容易去組裝起來(lái)的阀湿。第三個(gè)是文檔比較豐富,因?yàn)槲抑篮芏嗳碎_(kāi)源都是扔一個(gè)東西出來(lái)瑰妄,但是后面都是很多文檔都沒(méi)跟上陷嘴。因?yàn)檫@個(gè)是我以前做PHP的時(shí)候,那個(gè)時(shí)候就有很大的經(jīng)驗(yàn)间坐,就是說(shuō)你文檔跟不上你的用戶(hù)就會(huì)有很多的抱怨問(wèn)題灾挨、很多的反饋邑退,你就不能跟用戶(hù)很好的互動(dòng),而且又會(huì)遇到很多問(wèn)題劳澄,如果文檔跟不上你的框架地技、你的開(kāi)源產(chǎn)品就沒(méi)辦法很快獲得用戶(hù)的認(rèn)同,第四個(gè)是RESTFUL的設(shè)計(jì)秒拔,后來(lái)我看了很多路由的方式莫矗,最近又自己寫(xiě)了一個(gè)基于多叉樹(shù)的路由,我是覺(jué)得現(xiàn)在市場(chǎng)上有很多路由庫(kù)砂缩,例如httprouter號(hào)稱(chēng)性能最好作谚,但是你去用它的功能就是一般的功能,我是覺(jué)得beego的路由是現(xiàn)在市場(chǎng)上路由支持最好的庵芭,同時(shí)性能也是佼佼者食磕。接下來(lái)就是強(qiáng)大的Namespace,它可以實(shí)現(xiàn)你所有獨(dú)立的東西喳挑,可以把你的代碼全部獨(dú)立成一個(gè)模塊,把模塊里面的路由命名成一個(gè)Namespace滔悉,這樣你想什么時(shí)候增加前綴都很容易伊诵,很方便的進(jìn)行擴(kuò)展。接著是自動(dòng)化的API文檔回官,這是我最近才開(kāi)發(fā)曹宴,最后就是beego框架除了一個(gè)框架之外還有另外一個(gè)工具叫Bee工具,Bee能夠迅速的幫你創(chuàng)建一個(gè)項(xiàng)目的結(jié)構(gòu)歉提,現(xiàn)在我又增加了一個(gè)功能笛坦,而且可以基于數(shù)據(jù)庫(kù)自動(dòng)的給你生成所有的東西,你只要命名好輸入就可以了苔巨,基本上80%的邏輯代碼都會(huì)幫你完成版扩,你只要核心的邏輯稍微自己再修改一下就OK。
beego現(xiàn)在已經(jīng)有很多的用戶(hù)在用侄泽,這邊是很多的廠商礁芦,最近騰訊穿越火線的游戲現(xiàn)在后端有一部分也是用beego在做。淘寶和游戲公司都有悼尾,他們內(nèi)部用的東西還是挺多柿扣,盛大我以前用beego做了很多開(kāi)發(fā)的東西,zalora是我在新加坡的公司闺魏,beego就是用來(lái)開(kāi)發(fā)mobile API應(yīng)用的未状。
接下來(lái)開(kāi)始講一下beego的設(shè)計(jì)理念,主要是參考了Unix的設(shè)計(jì)理念析桥,它有幾個(gè)點(diǎn):第一個(gè)是模塊化司草、第二個(gè)是分離艰垂、第三個(gè)是組合。Unix的思想是你要把所有的事情都弄成一件簡(jiǎn)單的事情翻伺,把這件簡(jiǎn)單的事情做好材泄,同時(shí)分離是引擎的分離,這個(gè)在Go里面特別重要吨岭,我后面會(huì)講到拉宗。我們?cè)O(shè)計(jì)的時(shí)候GO里面最好的功能就是interface,而且對(duì)你測(cè)試案例的時(shí)候特別有用辣辫,最近就是不斷在迭代開(kāi)發(fā)當(dāng)中旦事,我越來(lái)越覺(jué)得interface設(shè)計(jì)的重要性。當(dāng)一個(gè)應(yīng)用開(kāi)發(fā)完成的時(shí)候急灭,但是整個(gè)程序會(huì)依賴(lài)很多的東西姐浮,例如數(shù)據(jù)庫(kù)、搜索引擎等各種系統(tǒng)葬馋,如果你設(shè)計(jì)好了interface卖鲤,那么就很容易的mock數(shù)據(jù),這樣對(duì)于整個(gè)的應(yīng)用的測(cè)試用例特別有用畴嘶。第三個(gè)是組合蛋逾,把這些簡(jiǎn)單的事情組合成一個(gè)東西,到了重要的是less is more窗悯,Go可能更極致一點(diǎn)区匣,少即是指數(shù)級(jí)的多。
beego的設(shè)計(jì)理念就是樂(lè)高的概念蒋院,大家有玩過(guò)樂(lè)高嗎亏钩?樂(lè)高是很簡(jiǎn)單的小小片,可以組成一些部件欺旧,這個(gè)部件就是所謂beego里面會(huì)弄成一個(gè)一個(gè)的模塊姑丑,最后大家可以把它做成一個(gè)很大型的系統(tǒng),基于這些小的模塊做一個(gè)大的系統(tǒng)辞友,這就是我所有的理念彻坛,就是組合、分離踏枣。beego設(shè)計(jì)的理念跟前面一樣昌屉,就是簡(jiǎn)單的內(nèi)核,我還是一直保持了先前的設(shè)計(jì)風(fēng)格茵瀑,就是很簡(jiǎn)單的內(nèi)核然后豐富的模塊就是做了很多的模塊间驮,當(dāng)然我學(xué)習(xí)其他很多成功的框架,F(xiàn)lask马昨、Rails竞帽、sinatra扛施,我們會(huì)參考它的ORM系統(tǒng),rails里面我會(huì)參考他的I18N的庫(kù)屹篓,只要是好的東西像PHP里面一些框架的設(shè)計(jì), 只要好的系統(tǒng)我們就去學(xué)習(xí)他疙渣。然后就是提供強(qiáng)大的開(kāi)發(fā)工具,Bee工具是我自己在實(shí)戰(zhàn)當(dāng)中總結(jié)出來(lái)的工具堆巧,開(kāi)發(fā)中有可能就會(huì)碰到很多的問(wèn)題妄荔,所以我很想自動(dòng)化這些越到的問(wèn)題,所以開(kāi)發(fā)了這個(gè)工具谍肤。插件化設(shè)計(jì)是能夠讓我們的程序動(dòng)態(tài)的擴(kuò)展啦租,最后是Fast、Fast荒揣、Fast第一個(gè)是我們要做的東西一定要讓用戶(hù)學(xué)習(xí)的快篷角、開(kāi)發(fā)效率快、運(yùn)行效率快系任,所以這邊寫(xiě)了三個(gè)恳蹲。
接下來(lái)我簡(jiǎn)單的演示一下beego的快速入門(mén)。這個(gè)命令是安裝Bee工具俩滥,裝好之后Bee new mygo阱缓。這是我所在gopath的目錄,如果要?jiǎng)?chuàng)建一個(gè)目錄就ECUG就可以了举农,這樣的話(huà)會(huì)幫你生成一個(gè)目錄,我們就可以進(jìn)入到ECUG了敞嗡,已經(jīng)幫你自動(dòng)的生成了很多東西颁糟,如果要運(yùn)行的話(huà)就Bee Run就可以了,就自動(dòng)幫你監(jiān)控所有目錄下的文件喉悴,只要一修改就可以幫你編譯棱貌,你就可以在瀏覽器里面看到這個(gè)東西。這個(gè)是beego的默認(rèn)應(yīng)用的頁(yè)面箕肃,這個(gè)beego的默認(rèn)頁(yè)面是一個(gè)用戶(hù)最近貢獻(xiàn)給我們婚脱,人家前端寫(xiě)的比較好幫我們改成這樣,很漂亮勺像。
beego主要的模塊現(xiàn)在有這些模塊障贸,就是cache、config吟宦、Context篮洁、httplib,Logs殃姓、Orm袁波,sessions瓦阐,toolbox,validation這些模塊都是獨(dú)立的篷牌,就是說(shuō)不管你做什么應(yīng)用假如說(shuō)拿這個(gè)來(lái)說(shuō)睡蟋,你可以直接拿這個(gè)Logs去應(yīng)用,beego框架不強(qiáng)制你用什么東西枷颊。Go里面有一個(gè)庫(kù)有很多獨(dú)立的庫(kù)戳杀,beego我為什么沒(méi)有把這些東西全部分離出去,因?yàn)楹芏嘟o我提建議偷卧,我應(yīng)該創(chuàng)建一個(gè)新的repo豺瘤,這樣大家可以重新用,但是這樣的話(huà)我就沒(méi)辦法保證每一個(gè)版本出去的時(shí)候系統(tǒng)的穩(wěn)定性和兼容性听诸,我要保證每一個(gè)版本的穩(wěn)定性坐求,假如說(shuō)我現(xiàn)在光光升級(jí)了Httplibs,假如說(shuō)我現(xiàn)在依賴(lài)于Context的晌梨,那我升級(jí)了這個(gè)桥嗤,那我還要不要升級(jí)beego呢?所以我要保證每一個(gè)整體的東西都是穩(wěn)定的仔蝌,但是獨(dú)立的模塊用戶(hù)可以直接去用泛领。
Cache設(shè)計(jì)這就是我參考了Go里面的database/sql設(shè)計(jì),就是interface的分離敛惊。我現(xiàn)在支持Get渊鞋、Put、Delete瞧挤、Incr锡宋,這些所有的東西我定義了一個(gè)interface有這些方法,然后Memcache也一樣特恬,這樣就保證網(wǎng)友來(lái)不斷的貢獻(xiàn)执俩。這個(gè)是獨(dú)立的應(yīng)用,就是說(shuō)我beego的其他東西都不用癌刽,那就是可以Cache.NewCache役首,然后這些都可以用了。Config的設(shè)計(jì)現(xiàn)在支持Ini显拜、json衡奥、Xml、yaml远荠,Config的應(yīng)用也是這樣杰赛,假如說(shuō)你用Config的包,那我簡(jiǎn)單的就可以Config.NewConfig矮台,然后就是你配置的文件乏屯,你就可以獲取一個(gè)對(duì)象根时,這個(gè)對(duì)象返回的是一個(gè)interface,你就可以用它的方法來(lái)進(jìn)行操作辰晕。Context的設(shè)計(jì)是這樣蛤迎,在request和response的基礎(chǔ)之上寫(xiě)了一些很方便的函數(shù),把它變成了Input含友、Output替裆,我只是寫(xiě)了一些好的方法。Output也是一樣窘问,我直接輸入一個(gè)Json就可以省去了很多的方法辆童,因?yàn)檫@邊沒(méi)有多引擎的說(shuō)法,用的話(huà)就直接這樣用惠赫,就是分的很清把鉴。一個(gè)是Input進(jìn)來(lái)的數(shù)據(jù)流,另外一個(gè)是我要輸出的數(shù)據(jù)流儿咱。你說(shuō)Input里面要獲取用戶(hù)輸入的IP這些東西就去Input里面找庭砍,那就有很多的方式和方法讓你獲得這些數(shù)據(jù),Output就是我要輸出的東西混埠。
Httpliibs是用來(lái)模擬客戶(hù)端請(qǐng)求怠缸,現(xiàn)在支持Https、Debug還有超時(shí)支持文件的上傳钳宪,這些就很方便揭北。這個(gè)是簡(jiǎn)單的例子,假如說(shuō)我要請(qǐng)求這個(gè)get的請(qǐng)求吏颖,那就是HttpBin.ORG搔体,我要Post的數(shù)據(jù)就先Httpliibs.Post。Logs和前面的設(shè)計(jì)是一樣的侦高,就是支持interface引擎的分離,Logs現(xiàn)在支持四種引擎厌杜,我支持Cosole奉呛、CONN就是網(wǎng)絡(luò),還有File和Smtp夯尽,比如說(shuō)我碰到一個(gè)紅色警報(bào)我就需要發(fā)到我的郵箱里面報(bào)警給我瞧壮,因?yàn)槲疫@個(gè)設(shè)計(jì)的時(shí)候除了interface和引擎的分離之外,同時(shí)支持輸出到這四個(gè)里面匙握,因?yàn)槲矣昧薱hannel的方式咆槽。每個(gè)引擎就訂閱日志信息,每個(gè)引擎可以收到相應(yīng)的日志信息圈纺,每個(gè)引擎又有不同的等級(jí)秦忿,我要搜到什么樣的等級(jí)就是類(lèi)似這樣的麦射。File就是支持你按天分、按大小分灯谣、保存多少天潜秋、保存多少條數(shù)這些東西都可以,就是很容易應(yīng)用的東西性能也很高胎许,因?yàn)槟憧梢宰约焊鶕?jù)應(yīng)用來(lái)自定義峻呛。
類(lèi)似這樣用就是Logs.NewLogger,然后Setlogger就是說(shuō)我要Set哪些引擎進(jìn)去棕洋,這個(gè)是我可以把你調(diào)用Logger文件的行數(shù)給輸出來(lái)崭闲,這樣我就可以分析到你調(diào)的Logger的行數(shù)和文件彩库,這樣的話(huà)就有利于你定位那個(gè)是哪個(gè)文件包出來(lái)的,這些是基本的操作牙勘,就是Logger不同等級(jí)的操作。
大家可以看到惨远,我這邊最后寫(xiě)一個(gè)Time Sleep谜悟,如果我直接結(jié)束掉了可能這一條就沒(méi)有輸出,你實(shí)際應(yīng)用的時(shí)候需要考慮安全的關(guān)閉北秽,我在beego里面已經(jīng)幫你考慮了葡幸,我會(huì)去判斷那里面是不是已經(jīng)等于零了,如果不等于零還會(huì)輸出贺氓,直到你的Logs全部輸出為止蔚叨,當(dāng)然你獨(dú)立應(yīng)用的時(shí)候還要注意一下這個(gè)問(wèn)題。
ORM的設(shè)計(jì)辙培,目前支持的數(shù)據(jù)庫(kù)是MySQL蔑水、POstgreSQL和Shlite3。ORM的特性第一是支持鏈?zhǔn)降腁PI扬蕊、支持?jǐn)?shù)據(jù)關(guān)系搀别,這是我們最引以為豪的,因?yàn)槲覀儎傞_(kāi)始做的時(shí)候是beedb尾抑,其實(shí)支持了很多的數(shù)據(jù)庫(kù)和引擎歇父,基本上是MSSQL、Oracle這些引擎全都支持了再愈,但是有一個(gè)問(wèn)題是只是支持單表的榜苫,如果關(guān)聯(lián)了另一個(gè)表那是不支持的。所以我那時(shí)候就開(kāi)始考慮翎冲,因?yàn)槲乙郧白鯬HP的時(shí)候垂睬,我們寫(xiě)的應(yīng)用就是關(guān)聯(lián)數(shù)據(jù)庫(kù)很簡(jiǎn)單,我覺(jué)得關(guān)聯(lián)這個(gè)是很大的需求,所以我一定要重新寫(xiě)驹饺、重新搞钳枕,所以我們開(kāi)始設(shè)計(jì)ORM的東西,劉鵬幫我們寫(xiě)了很多ORM的代碼逻淌,他現(xiàn)在應(yīng)該去七牛了 么伯。
Struct我們就支持和Table一對(duì)一,簡(jiǎn)單的Crud的類(lèi)型卡儒,你定義好直接在里面幫你把東西創(chuàng)建到你的數(shù)據(jù)庫(kù)表田柔,自動(dòng)的關(guān)聯(lián)創(chuàng)建,可以直接使用Rawsql骨望,有時(shí)候你很復(fù)雜關(guān)聯(lián)的東西就可以自己去寫(xiě)硬爆、自己去運(yùn)行,但是返回來(lái)我們有很多的函數(shù)可以用到Struct擎鸠,這些代碼都是有完整的測(cè)試代碼缀磕,就是我們只要github一遞交,在drone那邊全部的CI就會(huì)自動(dòng)運(yùn)行劣光。
CRUD我們看一個(gè)例子袜蚕,我們這邊定義了一個(gè)User的結(jié)構(gòu)體,ID绢涡、Birthday牲剃、Age、Name雄可,我們首先要把它注冊(cè)好凿傅,因?yàn)槲覀兊谝徊骄褪钦f(shuō)我們會(huì)掃描整個(gè)的Struct把它緩存起來(lái),本身Go里面也不允許這你個(gè)結(jié)構(gòu)體動(dòng)態(tài)創(chuàng)建数苫,所以我們就讓你注冊(cè)一下聪舒,我們就知道你這個(gè)結(jié)構(gòu)體是在哪里的,你的字段都已經(jīng)OK了虐急,先前我們有做過(guò)一個(gè)ORM的測(cè)試箱残,beegoORM測(cè)試的性能最好,我覺(jué)得最大的原因就是我們用了緩存的機(jī)制止吁。第二個(gè)是RegisterDataBase被辑,假如說(shuō)你有三個(gè)數(shù)據(jù)連接你就可以注冊(cè)三個(gè),你需要哪一個(gè)的時(shí)候就切換到哪一個(gè)去用赏殃。默認(rèn)是一個(gè)default敷待,這個(gè)就是你數(shù)據(jù)庫(kù)的連接地址间涵。
這是我們簡(jiǎn)單的連接應(yīng)用仁热,User就是先建一個(gè),然后你再更新就讀取然后再接著就是刪除,很多例子我們的文檔里面都有抗蠢,我可以說(shuō)這個(gè)文檔是有但是不夠詳細(xì)举哟,很多人都反饋這個(gè)問(wèn)題,我們下一步很多的文檔都會(huì)更詳細(xì)迅矛、說(shuō)的更明白一點(diǎn)妨猩,當(dāng)然我新加坡有一個(gè)同事現(xiàn)在也在寫(xiě)一本書(shū),因?yàn)橐郧笆亲銮岸说臇|西秽褒,現(xiàn)在也想學(xué)beego壶硅,他現(xiàn)在把很多學(xué)習(xí)的步驟給記錄下來(lái),但是我也會(huì)指導(dǎo)他一些销斟,這本書(shū)里面什么都會(huì)介紹庐椒,因?yàn)橛幸徽椎姆桨福褪茿PI怎么設(shè)計(jì)蚂踊、JS怎么調(diào)API约谈、用戶(hù)權(quán)限怎么弄、數(shù)據(jù)設(shè)計(jì)的時(shí)候怎么弄犁钟,因?yàn)樗潜容^有典型性的例子棱诱,他現(xiàn)在對(duì)beego文檔屬于知道了的級(jí)別,但是真正做出項(xiàng)目來(lái)整個(gè)過(guò)程要記錄下來(lái)涝动,這樣的話(huà)希望對(duì)很多的用戶(hù)是有用的迈勋。
Sessios的設(shè)計(jì)跟前面的設(shè)計(jì)是一樣,就是interface和引擎的分離捧存。我剛開(kāi)始其實(shí)只是Cookie粪躬、File,后面的引擎是網(wǎng)友貢獻(xiàn)的昔穴。如果你要獨(dú)立使用的話(huà)镰官,有很多人經(jīng)常會(huì)搞混,就是說(shuō)beego里面用其實(shí)你不需要這樣用吗货,因?yàn)閎eego里面這些已經(jīng)會(huì)幫你定義泳唠,如果你不用beego的邏輯,因?yàn)楝F(xiàn)在Go沒(méi)有session模塊宙搬,那beego的模塊很多人就拿去獨(dú)立用笨腥,比如說(shuō)你有一個(gè)應(yīng)用但是你想用beego的模塊,那你獨(dú)立應(yīng)用的話(huà)就初始化一個(gè)讓他操作就可以了勇垛,后面是你要用的引擎和配置文件脖母。簡(jiǎn)單應(yīng)用的話(huà)就是你每個(gè)request進(jìn)來(lái)然后就SessionStart,我剛開(kāi)始做的時(shí)候我是讀了PHP的原碼闲孤,所以我就是用Go重新寫(xiě)了一遍C谆级。一個(gè)老外說(shuō)你這個(gè)是多此一舉,說(shuō)PHP本身不是很安全,因?yàn)镚o里面已經(jīng)是很隨機(jī)的數(shù)肥照,我又在隨機(jī)數(shù)上加上了時(shí)間進(jìn)行了加密的操作脚仔,他覺(jué)得這樣反而會(huì)增加不安全性,但是我又不能說(shuō)服他這個(gè)為什么沒(méi)有安全性舆绎,他也不能說(shuō)服我這個(gè)是不安全的鲤脏,后來(lái)我又把這個(gè)問(wèn)題發(fā)到Go的群組里面,有一個(gè)安全專(zhuān)家說(shuō)你這樣的話(huà)不一定有安全性吕朵,但是會(huì)有潛在的安全性猎醇,你增加了穩(wěn)定參數(shù),所以你還不如直接用rand努溃,代碼就變得很簡(jiǎn)單姑食,因?yàn)镚o里面已經(jīng)實(shí)現(xiàn)了所有隨機(jī)的功能,如果用的話(huà)就是GetSession(key)茅坛,然后就可以操作這個(gè)東西音半。beego里面還有一個(gè)強(qiáng)大的工具叫Toolbox,toolbox是一個(gè)網(wǎng)友給我提的一個(gè)建議贡蓖,說(shuō)你在beego里面是不是能夠加入一些管理工具曹鸠,healthcheck就是我一個(gè)應(yīng)用起來(lái)之后我應(yīng)用里面的數(shù)據(jù)庫(kù)連接是不是正常,其他應(yīng)用的程序和邏輯是不是符合我的需求斥铺,然后一個(gè)Profile就是當(dāng)我運(yùn)行的時(shí)候我可以在線的時(shí)候看我的CPUprofile彻桃,還有一些東西我在線的看,Statistics是達(dá)達(dá)晾蜘,他是廈門(mén)那邊做神仙道的主程邻眷,他統(tǒng)計(jì)的時(shí)候就跟我說(shuō)你可以把這個(gè)東西加到你的里面,我看了一下設(shè)計(jì)的東西我覺(jué)得不錯(cuò)剔交,用戶(hù)請(qǐng)求的每一條數(shù)據(jù)最小的花費(fèi)時(shí)間肆饶、最大的花費(fèi)時(shí)間、每個(gè)人的平均時(shí)間岖常,特別是你設(shè)計(jì)API的時(shí)候驯镊,我今天請(qǐng)求了1萬(wàn)次,平均我最小的一次是100毫秒竭鞍,最大的一次300毫秒板惑,平均可能是150,那300為什么會(huì)高偎快,那你就可以對(duì)你的性能有一個(gè)分析冯乘。
這個(gè)是Toolbox的后臺(tái),我剛開(kāi)始做只是做了命令行的東西晒夹,出來(lái)的時(shí)候是文本Txt類(lèi)型裆馒。后來(lái)說(shuō)新加坡的同事是做前端的妖异,他幫我把所有的東西都做了美化,你就可以看得到請(qǐng)求了哪些東西领追,然后最小時(shí)間是花費(fèi)了多少這樣∠旆辏可以在線運(yùn)行的時(shí)候直接進(jìn)行這些性能的分析绒窑,這些特別有用,當(dāng)你一個(gè)程序遇到性能問(wèn)題的時(shí)候舔亭,你的Cpuprofile對(duì)你調(diào)優(yōu)特別有效些膨,建議大家都去用一下。這里可以看得到你現(xiàn)在程序里面路由的設(shè)置钦铺,你的配置文件怎么設(shè)的是設(shè)了多少订雾,這些都可以在這里看得到。這個(gè)模塊雖然集成到beego里面了矛洞,你也可以用到你自己的程序里面去洼哎,因?yàn)槔锩娴暮芏嗪瘮?shù)都是很方便的,因?yàn)檫@些都是模塊化設(shè)計(jì)沼本。
最后就是validation的設(shè)計(jì)噩峦,我們定義一個(gè)結(jié)構(gòu)體然后V,然后Required這些配置的規(guī)則你就可以進(jìn)行判斷抽兆。這是其中一種方式识补,還有一種方式是把配置文件寫(xiě)在tag里面,然后模塊開(kāi)發(fā)計(jì)劃辫红,接下來(lái)要做三個(gè)東西凭涂,第一個(gè)是Testing,其實(shí)我一直在思考怎么樣更好的做好這個(gè)事贴妻,因?yàn)門(mén)esting分兩塊切油,一種是白盒測(cè)試還有一種是黑盒測(cè)試,還有一種是基于函數(shù)的測(cè)試名惩,那我接下來(lái)第一步可能做的是基于結(jié)果的測(cè)試白翻,我只是根據(jù)你應(yīng)用里面的路由可以幫你自動(dòng)的生成所有邏輯化的的東西。第二個(gè)是blueprint绢片,因?yàn)镚o里面的RPC的功能很強(qiáng)大了滤馍,我就想我在模塊化和模塊化之間通過(guò)RPC的方式來(lái)做。Zero-downtime我打算獨(dú)立做成一個(gè)模塊底循。
beego里面有很多的插件巢株,最近做了這三個(gè),后面兩個(gè)是用戶(hù)做的熙涤。一個(gè)是Apiauth阁苞,亞馬遜里面有一個(gè)驗(yàn)證困檩,就是你有一個(gè)AppID然后再你本機(jī)把要請(qǐng)求的東西進(jìn)行加密,這個(gè)是你做之前引入怎么用Plugins的東西那槽,然后就插件化插入一個(gè)東西悼沿。這個(gè)是BeforeRouter就是在路由之前進(jìn)行驗(yàn)證,大家可以看到這邊的文檔骚灸,這個(gè)就是ippid糟趾,你要允許用戶(hù)用的appid和appkey,如果我開(kāi)發(fā)一個(gè)app是提供給很多的商家用甚牲。還有另外一個(gè)函數(shù)义郑,它里面就是你可以自己去指定APPid和appkey的映射關(guān)系,你可以來(lái)源于你的數(shù)據(jù)庫(kù)丈钙、來(lái)源于你其他的配置文件非驮,你就有很多個(gè)都可以支持,因?yàn)槔锩嬷皇且粋€(gè)驗(yàn)證的過(guò)程雏赦。這個(gè)是AUTH的插件劫笙,你可以簡(jiǎn)單的加上這一句就可以實(shí)現(xiàn)你的Basicauth的功能了,用戶(hù)只有輸入用戶(hù)名才能登陸這個(gè)網(wǎng)頁(yè)星岗。你可以用cors的插件邀摆,你在beforeRouter前面設(shè)定哪些域名可以訪問(wèn)這是很容易的測(cè)試,這些文檔都可以看得到伍茄,我就寫(xiě)的很詳細(xì)栋盹。gorelic是國(guó)外的應(yīng)用,我在新加坡的時(shí)候我們用的很多敷矫,國(guó)外人有一個(gè)思路例获,就是人家一個(gè)產(chǎn)品做的好他們就拼命去用,而且就即使收錢(qián)也會(huì)用曹仗,就是相互之間的依靠關(guān)系很好榨汤。假如說(shuō)你公司產(chǎn)品做的很好我用你產(chǎn)品,假如說(shuō)我公司產(chǎn)品用的很好你用我的產(chǎn)品怎茫,他們的生態(tài)環(huán)境我覺(jué)得比國(guó)內(nèi)好很多收壕。這是一個(gè)性能監(jiān)控的軟件,你可以在這個(gè)里面去監(jiān)控你的內(nèi)存使用量有多少轨蛤、CPU使用量有多少它可以全部的幫你接入進(jìn)去蜜宪。那Pongo是一個(gè)模板引擎,現(xiàn)在用的人挺多祥山,有一個(gè)用戶(hù)貢獻(xiàn)了一個(gè)插件就可以在beego里面實(shí)現(xiàn)去調(diào)用支持這個(gè)Pongo的模板引擎圃验。
我接下來(lái)要做這三個(gè)事情,第一個(gè)是auth2缝呕,是auth的插件澳窑。第二個(gè)是RBAC斧散、第三個(gè)是ACL。Utils庫(kù)現(xiàn)在除了這些剛才所謂的模塊化和插件的功能之外摊聋,我還有一個(gè)庫(kù)鸡捐,就是方便其他開(kāi)發(fā)的庫(kù),包括驗(yàn)證碼麻裁、發(fā)送郵件箍镜、測(cè)試、Slice悲立,比如說(shuō)交集和比較都有,然后File判斷文件是不是存在和文件的屬性新博,Pagination就是分頁(yè)操作應(yīng)用薪夕。總結(jié)一下赫悄,beego的設(shè)計(jì)理念就是一個(gè)組合框架原献,就是我有很多的設(shè)計(jì)模塊,然后beego的核心應(yīng)用就是基于這些之上埂淮,其實(shí)beego有一個(gè)很好的設(shè)計(jì)是你裝beego的時(shí)候姑隅,其他的組件是一個(gè)都不會(huì)依賴(lài)的,就是你用什么你裝什么倔撞。第二個(gè)是高度的松耦合讲仰,第三個(gè)是Interface和negine的分離,我現(xiàn)在寫(xiě)代碼都是先定Interface然后再寫(xiě)其他的代碼痪蝇,因?yàn)镮nterface實(shí)在太好用了鄙陡,Interface定義完之后你很容易的去實(shí)現(xiàn)擴(kuò)展這些東西,太方便了躏啰。第四是模塊豐富趁矾,beego已經(jīng)很多的產(chǎn)品在線上跑,而且都是很高性能的應(yīng)用给僵。第四個(gè)是插件設(shè)計(jì)毫捣,可以很容易的動(dòng)態(tài)擴(kuò)展系統(tǒng)。
接下來(lái)是講一下API開(kāi)發(fā)帝际,我們API開(kāi)發(fā)因?yàn)橐苿?dòng)互聯(lián)網(wǎng)大家知道發(fā)展的非常迅速蔓同,但是你看到移動(dòng)互聯(lián)網(wǎng)企業(yè)里面,他們基本上是API的模式蹲诀,所以說(shuō)我們后端程序員為什么吃香牌柄?因?yàn)槲覀內(nèi)魏我粋€(gè)時(shí)代我們后端的程序員,都是不管前端怎么變侧甫,我們后端應(yīng)用的東西都得我們來(lái)做珊佣。API現(xiàn)在也變得越來(lái)越重要了蹋宦,就是很多人都是先開(kāi)發(fā)API再開(kāi)發(fā)別的,像我如果開(kāi)發(fā)一個(gè)app的話(huà)那我首先是先開(kāi)發(fā)API咒锻,然后先定一個(gè)文檔再基于這個(gè)東西來(lái)做冷冗,即使在網(wǎng)頁(yè)端用這些東西來(lái)渲染后端定義一個(gè)API,這樣就很容易擴(kuò)展惑艇。API開(kāi)發(fā)我覺(jué)得需要關(guān)注幾個(gè)點(diǎn)蒿辙,第一個(gè)是RestFul的方式,然后文檔太重要了滨巴,特別是你人多了之后大家協(xié)同合作的時(shí)候思灌,你如果沒(méi)有文檔那簡(jiǎn)直是效率極低,如果你找不到一個(gè)東西但是我又不知道返回是什么恭取、請(qǐng)求參數(shù)是什么這些東西都是一個(gè)問(wèn)題泰偿。第三個(gè)是效率,我們都希望自己開(kāi)發(fā)的API可以抗高并發(fā)蜈垮,能夠輕松達(dá)到2-3w的并發(fā)耗跛。第四個(gè)是維護(hù),假如說(shuō)公司我走了公司的人是不是有人能夠維護(hù)攒发,第五個(gè)是部署调塌,我覺(jué)得應(yīng)用方便部署很重要,當(dāng)然現(xiàn)在有了docker之后部署就更方便了惠猿。這些我覺(jué)得beego和Go的結(jié)合都很好的解決了這幾個(gè)問(wèn)題羔砾,第一因?yàn)閎eego就是支持天然支持的,第二個(gè)是文檔我會(huì)給大家演示如何自動(dòng)化的文檔偶妖,第三個(gè)是效率蜒茄,因?yàn)閎eego就是可以秒殺很多的動(dòng)態(tài)語(yǔ)言。第四個(gè)因?yàn)閎eego的結(jié)構(gòu)化很清晰就很容易維護(hù)餐屎,beego為什么會(huì)有自動(dòng)化文檔檀葛?因?yàn)橛泻芏嘧⑨專(zhuān)缓蠡谶@些注釋我來(lái)自動(dòng)的生成文檔,為什么有了注釋就容易維護(hù)呢腹缩?我們都知道有注釋的代碼大家看了這個(gè)東西邏輯就很清楚屿聋,我函數(shù)的處理邏輯是怎么樣子的。最后部署的話(huà)Go編譯之后就是一個(gè)二進(jìn)制文件藏鹊,扔到系統(tǒng)就部署完畢了润讥。
下面是DemoTime,我給大家看一下盘寡,我現(xiàn)在的數(shù)據(jù)庫(kù)里面有兩張表楚殿,一張是Customers表,一張是Orders表竿痰,現(xiàn)在我要做一個(gè)API的應(yīng)用脆粥,我怎么做呢砌溺?大家看到,我現(xiàn)在只要做一個(gè)命名就OK变隔,Bee這個(gè)是工具规伐,API就是要?jiǎng)?chuàng)建一個(gè)API,這個(gè)Bcloud是我創(chuàng)建的應(yīng)用名字匣缘,你可以換任何的名字但是這兩個(gè)是固定的猖闪,Conn是我要去連接的數(shù)據(jù)庫(kù),現(xiàn)在我要連接數(shù)據(jù)庫(kù)就是本機(jī)的肌厨,這個(gè)連接的地址就是Go里面一個(gè)連接的格式培慌。這個(gè)是我要去連接的點(diǎn),本機(jī)是3306然后Test這個(gè)數(shù)據(jù)庫(kù)我點(diǎn)一下他就給我生成了這個(gè)就是自動(dòng)化生成所有的代碼柑爸,它所有的代碼都生成了吵护,然后我剛剛輸入的連接地址它也會(huì)幫我自動(dòng)生成,還有路由竖配、ORM的東西都會(huì)引入何址,這個(gè)我們可以看一下這邊生成了兩個(gè)Model里逆,數(shù)據(jù)我們數(shù)據(jù)庫(kù)里面的資料是一一對(duì)應(yīng)的进胯,就是會(huì)把你數(shù)據(jù)庫(kù)里面所有的東西都反射過(guò)來(lái),Order也是一一對(duì)應(yīng)原押,然后這些東西都是會(huì)自動(dòng)引入胁镐,你看Add、get诸衔、getall這些方法是全部寫(xiě)好了的盯漂,大家可以看一下所有的函數(shù),我們可以看一下這些方法全部已經(jīng)幫你寫(xiě)好了笨农,我們看一下運(yùn)行的效果就缆。大家可以看看我就運(yùn)行了一條命令我就完成了所有API的工作,從數(shù)據(jù)庫(kù)到API所有的東西都有谒亦,這里網(wǎng)絡(luò)有問(wèn)題我沒(méi)辦法下載包竭宰,所以我先前已經(jīng)下好了我這邊直接拷過(guò)來(lái),不然會(huì)自動(dòng)去下份招,Swagger是HTML的東西切揭,這樣的話(huà)我就把它拷過(guò)來(lái),我們可以看一下锁摔,當(dāng)大家不知道命令怎么用的時(shí)候廓旬,大家可以用一下Bee Help,如果我自己下的話(huà)他就會(huì)自己去下谐腰,我昨天試了一下孕豹,在這邊它不能下涩盾,我不知道為什么。大家可以看到剛才在這個(gè)里面大家可以看到有很多的注釋?zhuān)@些beego會(huì)分析所有的東西來(lái)生成文檔巩步,然后會(huì)自動(dòng)生成文檔旁赊,我們看一下,它已經(jīng)運(yùn)行起來(lái)了椅野,大家可以看到這個(gè)就是我們生成的文檔终畅,beego Test API,這是API的描述竟闪,再下面就是Customed离福,然后你可以再點(diǎn)一下可以看到這可以傳一個(gè)Body,然后返回的信息是什么炼蛤,我可以創(chuàng)建一個(gè)東西過(guò)去妖爷,這邊是獲取,我放一個(gè)1這樣大家可以看得到理朋,就可以直接進(jìn)你就測(cè)試你所有的API絮识,可以把這個(gè)東西丟給你調(diào)用API的人,說(shuō)我的API就是這樣子的嗽上,他就可以完全知道應(yīng)該怎么樣操作次舌。這個(gè)是獲取,我可以拷過(guò)來(lái)這個(gè)兽愤,我把它改一下彼念,ID其實(shí)可以刪掉,因?yàn)樗鼤?huì)自動(dòng)搜索浅萧,因?yàn)镻OST相當(dāng)于創(chuàng)建一個(gè)逐沙,我放過(guò)去他給我的返回是會(huì)返回2,我們來(lái)看一下數(shù)據(jù)庫(kù)里是不是已經(jīng)有了洼畅,在這邊就已經(jīng)插入進(jìn)去了吩案,然后我可以修改 也可以獲取,我就不一一演示了帝簇。這是GET所有的東西徘郭,PUT是去修改,Delete這個(gè)你點(diǎn)一下其實(shí)也是所有的類(lèi)似的操作己儒,這樣就一個(gè)命令可以把我數(shù)據(jù)庫(kù)兩張表全部生成了一個(gè)應(yīng)用崎岂,調(diào)我的API文檔,我所有的東西都做好了闪湾,但是還有很多個(gè)性化的應(yīng)用東西我沒(méi)有所有的數(shù)據(jù)庫(kù)類(lèi)型都測(cè)試過(guò)冲甘,但是我在我們公司200、300張表上面都測(cè)試過(guò),所以那些上面的性能和功能上我都測(cè)試過(guò)江醇,很多的類(lèi)型我也都測(cè)試上濒憋。基本上就是這樣陶夜,這是我們社區(qū)凛驮,大家可以有問(wèn)題可以在上面提問(wèn),有Golang的条辟、有beego的大家都可以去上面交流黔夭,這是我們的QQ群、這是我們的微信群大家有興趣可以去溝通一下羽嫡。