當前位置:
首頁 > 最新 > beego開源之路

beego開源之路

前言

beego,是一個使用 Go 的思維來幫助您構建並開發 Go 應用程序的開源框架。beego可以用來快速開發API、Web、後端服務等各種應用,是一個RESTFul的框架,主要設計靈感來源於tornado、sinatra、flask這三個框架,但是結合了Go本身的一些特性(interface、struct繼承等)而設計的一個框架。越來越多的開發者和公司開始選擇beego作為他們的應用程序基礎框架,而beego在github上也有了超過13k的stars。

演講的過程中推薦大家重點聽這幾個方向:開源項目是怎麼推廣起來的;到底要怎麼樣運營一個真正的開源項目;從這些開源項目當中獲得了什麼。在整個的馬斯洛需求階梯當中,其實開源是違反這個需求的,我們一開始沒有錢但是有巨大的心理滿足感和我們的成就,這已經超過了生理需求和向上的其他需求,已經直接到了精神追求的階段。這是整個開源社區裡面最難得也是最讓人覺得很神奇的一個部分。

開場

大家下午好,我叫謝孟軍,我一直在做這個Beego,所以做GO社區的一般都認識我。我是很早之前就開始做Beego的,我是最早在盛大開始接觸GO語言,接觸GO語言的時候我以前是一個世界上最好的語言的開發者---PHP的開發者,後來我又去了盛大,盛大一直在做PHP,但是PHP做著遇到很多新的問題,我們也沒辦法後來也有做PHP的人,確實很多時候維護成本、開發效率都沒辦法達到我們的要求。就開始轉GO,那個時候正好是GO語言出來沒多久,看了那個語言之後正好可以符合我們又要開發效率,又要運行效率的語言,所我就開始從事GO開發。

關於《GO Web編程》

我在很早的時候參加了PHP的開源社區,我那個時候最早就做PHP的框架,叫FreePHP,那時候我們做國內作FreePHP的時候很多還沒有什麼框架,但是後面因為我研究生的研究方向後來逐漸的放棄那個東西沒去維護他。但是這整個過程當中也是讓我學會了要將我學到的東西要分享出去。所以在我學GO的過程當中我就開始寫我自己的這本書,我把整個學習經歷寫下來。所以我就有了整個的《GO Web編程》。《GO Web編程》實際上比我的Beego的Star還要多。

很多人寫書可能找出版社出版,但我的初衷就是是要把這個經驗分享出去。所以我就把我寫的書放在Github上。有人問我說,你在Github上很流行,為什麼不出版。我一直是拒絕的,不想去出版。後來出版社找我說,你為什麼不多一個渠道宣傳讓更多的人去看,比如有些人上廁所可能想拿本書看,也是一個理由。所以我將《GO Web編程》出版了。還有另外一個原因,寫這個書的時候我在盛大,在盛大有做很多項目。大家都知道,很多的項目做著做著就會有自己的一些庫,這些庫就會有一個小框架,每個人都有一個框架夢。你即使用別人的框架拿過來之後,先學習別人的,然後覺得人家的沒有我自己的那一套好。因為是符合你自己性格的,所以很多時候寫著寫著就有了要做一個開源框架的想法。這也是我寫Beego的初衷。

在盛大的那個時候,我記得是2014年上海污染非常嚴重,PM2.5達到了500多。我就開始逃離上海去了新加坡。我是一個很願意參加開源社區的人,去了新加坡之後就組織了新加坡Gophers meeting,現在新加坡也在繼續舉行,但第一屆應該就是我開始組織起來的,現在新加坡很多做GO開發的人我都認識。因為我寫了Beego和《GO Web編程》,所以我在Github上面的GO排名裡面我排第一。通過這個第一,蘋果找到了我,所以我就去了蘋果。蘋果也是用GO寫很多面向製造業的應用。之後我上個月剛自己出來創業,也是面向做工業大數據這方面的,覺得中國的未來側重製造業,而不在互聯網了。

GO社區

互聯網已經是很小的一條路,工業互聯網是很大的一條路。大家也知道國家的響應,我是一個共產黨員我就響應國家號召,所以去給工業互聯網鋪路,所以我出來創業就做工業互聯網的東西。剛創業的時候就回到上海,我體驗了很多國外的不一樣的風格,回來之後就開始組織Gopher china,第一屆就找到小梁,她來給我們做主持人。找到老徐我們一起組織這個大會,今年已經是第三屆了。大家可以看到,這個GO流行度最高的是在中國,為什麼?因為我在。

GO為什麼在中國能夠流行起來,因為有人來帶動這個社區。很多的社區很零散,我為什麼能夠把GO組織起來,因為我對這個東西是熱愛的,對這個事情是很熱情的。大家在GO社區裡面應該都知道,我每天早上都會發GO新聞。我覺得沒有哪一個社區人能夠堅持做到這一點。我是從今年4月份開始到現在為止,差不多半年多每天都發。我自己有一個習慣,喜歡看技術類的新聞,還有GO相關的。如果覺得這是一個很好的內容,我會把這些東西自己記下來,大家分享出去一起看,所以我每天都會組織五條左右的內容,分享給整個GO社區的人。

每次Gopher chain大會,他們都會派官方的人來到這個GO大會裡面來。今天大家聽老外分享說,非常看不慣中國人用微信、QQ。他覺得沒辦法跟國內的人去溝通。但這就是我們中國人的風格,你看國外ISCQ來交互,現在又要遷移到即時交互。其實我們已經跟他們領先一步了,我們已經用微信,QQ。他們還用很老的思維在做,我們現在用的這種即時交互其實有更好的體驗,就像我做Beego的過程當中有建谷歌的帳號,但是我主要的精力還是放在微信和QQ上面。

今天分享的是四個東西,一個是Beego的設計初衷,第二個我的設計思路,第三個我開源之路怎麼走過來的。最後總結一下。

設計初衷

因為PHP世界上最好的語言就是傷的我比較深一點,最早做的PHP,那時候做PHP3.0版本。開始是我一個師兄開始帶我,最早讀大學的時候是ASP做應用,後來我一個師兄不知道怎麼了,搗鼓一些黑糊糊的終端裡面的東西,不讓我搞圖形化。我就開始轉,但是為什麼會做Beego,就是因為我們在盛大做CBA性能壓力都非常大,很多時候PHP是沒辦法覆蓋所有的。

我印象深刻的是,在第一家公司做PHP為了提高它的並發率,從300提高到350,熬夜四五個晚上才提高一點。但是你用GO,感覺300到3000的是很輕鬆的,就是因為PHP沒辦法解決一些性能的問題,雖然PHP能夠提高開發效率。所以我需要有一個強大的引擎,能夠幫我來解決我們現在系統當中遇到的這些問題。

設計思路

我就開始設計Beego,我所有的原版來自於Tornado,它最早是FriendFeed做的一個框架,後來被facebook收購,Facebook把這個東西給開源出來了。Tornado是通過非同步的方式,他的性能在剛出來的時候非常高,運用於即時聊天這塊。後來我就開始參照Tornado的設計特徵來開發,Tornado的特徵非常簡單,有非同步,code base非常少,還有一些handle。比如說一個路徑請求到一個handle,大家知道get請求,post請求,所以他的handle裡面,是用get的方法和post的方法,來對應RESTful的這些請求。所以我整個的Beego也是這樣的一個請求設計思路。

首先,就是請求一步過來把路由解析,之後有幾種類型。一種就是靜態文件的處理,還有一種是業務邏輯的,業務邏輯前面有一個過濾器,動態註冊的結構體,結構體根據這些不同的方法調用不同的HTTP的方法。比如get的請求就用get方法,調用完成之後開始渲染,渲染之後就完成。

比如說Beego.Router,當你請求這個get請求的時候,他就會調用MainController下面的這個get方法,所以整個的設計思路就是把HTTP的消息映射到你這個Controller裡面的消息,是一一對應的方法。

第二,GO的其中一個作者就是Unix的作者,也是C語言的作者。所以參照很多Unix的思想,第一個就是模塊化,很多東西盡量的能夠把它做模塊化。第二個是分離,所謂的分離等會兒可以給大家舉一個例子,一個interface的定義和你實現的這個分離,這樣你可以很容易的擴展他。

第三個是組合,在GO裡面雖然看到大家有其他方式,其實看上去有點類似。但實際上是一個組合的方式,他不是類基層的方式,這是他和其他語言的區別,但是最重要的就是少即是多,這是GO裡面講的最多的。所以我最初設計的時候有點類似想要設計成樂高的設計模式,有很多小的模塊。通過這些小的模塊我也可以拼裝出各種奇形怪狀大型項目的東西。有一個簡單的內核但是我有豐富的模塊,同時也學習了很多其他成熟的框架,很多成熟的框架裡面已經有很多成熟的應用習慣。其他的一些用這些框架的使用者,發現用Beego天生的很熟悉。

第四個是提供強大的開發工具,這是我帶做FreePHP的時候深有的體會,很多我們寫代碼70%是一模一樣的代碼。很多時候可以用自動化生成的方式來支持這些工作。

還有一個插件化的設計,當然最主要的意思是開發要快,運行的要素也是要快,部署也要快。所有的東西都是為了這三個去實現的。在Beego裡面我現在經過那麼多年,我是2012年左右的時候開始寫Beego的,寫到現在已經有十分多的模塊了。

例如說緩衝模塊等等,基本上都是你去看其他的一些框架,設計思路是一樣的。因為我是最早做這個框架的,所以很多人家新的框架出來的時候都會參考我的框架,這是我們比較自豪的一個語言。

這裡說一個設計和引擎的分離,在GO裡面應用最多的叫interface。比如Logger這些介面,我在這裡面有一個註冊的東西,我只要實現這個介面就可以注入進來。這個是實現了文件日誌的實現,調logger的時候寫到文件裡面去了。如果說我要把日誌寫到阿里的日誌裡面去,或者寫到網路上面去,或者寫到多個文件上面去都可以,你只要實現這些介面就可以,註冊一下就可以用。同時將五個註冊到一個到網路,一個到文件這些東西都是可以的,這個就是方便你只要清晰的定義好你的這個介面,你只要實現這個介面就完成了。

Beego還有一個過濾器的概念,剛剛給大家看的整個執行過程裡面,在開始執行get之前很多地方都可以插入post,這個過濾器就相當於在你的執行邏輯過程當中post,比如說你要驗證用戶,所有的請求裡面都要有先進行驗證用戶這樣一個方式。一個簡單的例子我在所有的請求裡面,開始路由解析之前進行所有的驗證。在logger裡面已經實現了非常多的思路設計。這些都是後面都是網友來貢獻的。

還有一個思路開發,就是要快。這是Beego相對所有現在市場上目前存在的所有框架最大的一個優點,Beego有一個bee的工具,可以幫你自動化的生成所有的代碼。現在已經有一個存在的資料庫,我要基於這個資料庫立馬生成一個RESTful的API加上文檔。只要給一個鏈接,他就會鏈接你的資料庫,把你資料庫裡面所有的結構分析出來。自動化生成所有的模塊這些東西,再加上你所有的文檔全部會幫你生出來,為什麼會開發這個功能。因為我在新加坡的時候差不多有200多張表,要寫RESTful。天天在寫這個東西,我覺得人生就浪費在這個上面了,所以我就開始設計這個東西。

我們一定要讓我們的工作變得有價值,我基本上一分鐘就可以寫兩百多個RESTful,所有的API代碼的自動生成。Bee裡面還有很多的東西,調試這些工作的東西。這是Bee相對所有其他框架來說是最貼心的,工程師思想。所以GO也是這種工程師思想的東西,我本身自己是一個工程師,為了我要方便我自己所以我就開發了這個東西。

還有一個最重要,文檔做的特別好。這也是Beego做的很成功的一個原因,我以前做Free PHP的時候,發現因為缺少文檔的情況下很多新手來問你問題。但是基本上文檔可以解釋清楚很多東西。所以我寫完Beggo之後開始寫文檔,每一步,新手應該怎麼做,每一塊的東西應該怎麼設計,英文最早有一個新加坡的朋友幫我翻譯的,很多老外會幫我做很多貢獻,你開源的時候所有的東西很多人會幫你一起改進。

開源之路

接下來講一下我的開源之路,其實我之前講一些心得。

我覺得最主要是這幾個點,第一個持之以恆,你做任何一件事情就是堅持。堅持是很不容易的,很多人在Beego做開源,因為工作的原因或者其他的原因,會逐步的放棄這些東西。我做開源真的是內心喜歡這件事情,從2012年開始到現在為止還是做這個事情。我即使現在裝也非常忙,即使晚上很晚12點鐘我還會去看一下微博能回答的還是要回答,還會看一些pr領域。我內心有一個責任感在裡面,我已經開源出來這個東西,那麼多人在用你的東西,你肯定要把這個做好。

我內心有一個堅持,我是覺得很多事情你看上去很簡單,但是你只要持之以恆的去做,就像我說的每天早上去做新聞整理,這個很多人都會做,但是你如果能堅持一個星期,一月到半年到一年,如果你一直堅持下來,你會發現這個漸漸的就會成為你的一個習慣。我一直信仰人生的格言,成功的習慣比成功更重要。

第二個要持續的付出,在做這個開源的過程當中你不一定有激情懷抱,你只是從自己內心我是對得起我自己,我持續做這個事情,我自己喜歡這個事情你會持續付出。

第三個,是在國內你要做這個開源要有一個強大的內心,攻擊你的人很多。你承得住各種的咒罵,對我來說我有些時候不在乎你這個。我覺得我要服務好的是,能夠信任我的那批所有的人,對我的咒罵好的我吸收,不好的我就覺得人生路上的陌生人不需要去理會太多。

第四個,心態開展一點,很多人會糾結某一個點。我心態比較開放,什麼都無所謂。很多時間去擁抱這個變化,這些心態,Beego已經應用到了非常多的企業。華為雲裡面有很多Beego的東西,樂視雲,360,有道,京東,微博很多公司開始用Beego的東西。

總結一下Beego

總體而言Beego是一個綜合框架,高度松耦合,現在很多人會說Beego是非常臃腫的一個框架。我為什麼放到一個裡面,是因為我希望所有每一個版本發出來之後都是穩定的可用的。像Beego如果更新了1.8版本,如果cash是1.7版本那會有衝突,所以我要保持整體的是穩定的。這也是為什麼我在Beego把所有的放在一起作為一個版本發布的原因。即使我現在把所有的模塊放在裡面,你要用Logger引入就好了。

在Beego裡面有非常多的interface和engine分離,這樣設計的原因是為了更加容易擴展。

Beego裡面是所有現在框架里模塊最豐富的,你做一個產品用到了很多模塊都是有的框架。

最後,插件設計,可以很動態的擴展系統。

由 Asta Xie 發起的 Gopher China 大會第四屆,將於今年4月在上海舉辦,今年也是第一次增加了會前的 workshop 。本屆的大會無論從規模,內容都將有更多值得大家期待的!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Go中國 的精彩文章:

TAG:Go中國 |