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社区的人。


分享这是很小的一件事情,你只要能做坚持下来做你就可以成功。我负责整个GO社区的过程中会更GO官方有很多交互。比如GO官方很多的活动,不是都能够在国内访问的。像下载链接这些东西,我都会跟GO官方私底下交流。国内的一些开发者有时候会向我吐槽GO的一些麻烦的地方,我也会向GO官方去沟通。我们私底下有交互,他们有社区的人跟我们一起来交互,这是我作为GO官方中国区社区负责人的责任。


每次Gopher chain大会,他们都会派官方的人来到这个GO大会里面来。今天大家听老外分享说,非常看不惯中国人用微信、QQ。他觉得没办法跟国内的人去沟通。但这就是我们中国人的风格,你看国外ISCQ来交互,现在又要迁移到即时交互。其实我们已经跟他们领先一步了,我们已经用微信,QQ。他们还用很老的思维在做,我们现在用的这种即时交互其实有更好的体验,就像我做Beego的过程当中有建谷歌的帐号,但是我主要的精力还是放在微信和QQ上面。




今天分享的是四个东西,一个是Beego的设计初衷,第二个我的设计思路,第三个我开源之路怎么走过来的。最后总结一下。

beego开源之路_第1张图片

设计初衷

因为PHP世界上最好的语言就是伤的我比较深一点,最早做的PHP,那时候做PHP3.0版本。开始是我一个师兄开始带我,最早读大学的时候是ASP做应用,后来我一个师兄不知道怎么了,捣鼓一些黑糊糊的终端里面的东西,不让我搞图形化。我就开始转,但是为什么会做Beego,就是因为我们在盛大做CBA性能压力都非常大,很多时候PHP是没办法覆盖所有的。

beego开源之路_第2张图片


我印象深刻的是,在第一家公司做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也是这样的一个请求设计思路。

beego开源之路_第3张图片

首先,就是请求一步过来把路由解析,之后有几种类型。一种就是静态文件的处理,还有一种是业务逻辑的,业务逻辑前面有一个过滤器,动态注册的结构体,结构体根据这些不同的方法调用不同的HTTP的方法。比如get的请求就用get方法,调用完成之后开始渲染,渲染之后就完成。

beego开源之路_第4张图片

比如说Beego.Router,当你请求这个get请求的时候,他就会调用MainController下面的这个get方法,所以整个的设计思路就是把HTTP的消息映射到你这个Controller里面的消息,是一一对应的方法。

beego开源之路_第5张图片

第二GO的其中一个作者就是Unix的作者,也是C语言的作者。所以参照很多Unix的思想,第一个就是模块化,很多东西尽量的能够把它做模块化。第二个是分离,所谓的分离等会儿可以给大家举一个例子,一个interface的定义和你实现的这个分离,这样你可以很容易的扩展他。

beego开源之路_第6张图片

第三个是组合,在GO里面虽然看到大家有其他方式,其实看上去有点类似。但实际上是一个组合的方式,他不是类基层的方式,这是他和其他语言的区别,但是最重要的就是少即是多,这是GO里面讲的最多的。所以我最初设计的时候有点类似想要设计成乐高的设计模式,有很多小的模块。通过这些小的模块我也可以拼装出各种奇形怪状大型项目的东西。有一个简单的内核但是我有丰富的模块,同时也学习了很多其他成熟的框架,很多成熟的框架里面已经有很多成熟的应用习惯其他的一些用这些框架的使用者,发现用Beego天生的很熟悉

beego开源之路_第7张图片

提供强大的开发工具,这是我带做FreePHP的时候深有的体会,很多我们写代码70%是一模一样的代码。很多时候可以用自动化生成的方式来支持这些工作。


还有一个插件化的设计,当然最主要的意思是开发要快,运行的要素也是要快,部署也要快。所有的东西都是为了这三个去实现的。在Beego里面我现在经过那么多年,我是2012年左右的时候开始写Beego的,写到现在已经有十分多的模块了。

beego开源之路_第8张图片

例如说缓冲模块等等,基本上都是你去看其他的一些框架,设计思路是一样的。因为我是最早做这个框架的,所以很多人家新的框架出来的时候都会参考我的框架,这是我们比较自豪的一个语言。


这里说一个设计和引擎的分离,在GO里面应用最多的叫interface。比如Logger这些接口,我在这里面有一个注册的东西,我只要实现这个接口就可以注入进来。这个是实现了文件日志的实现,调logger的时候写到文件里面去了。如果说我要把日志写到阿里的日志里面去,或者写到网络上面去,或者写到多个文件上面去都可以,你只要实现这些接口就可以,注册一下就可以用。同时将五个注册到一个到网络,一个到文件这些东西都是可以的,这个就是方便你只要清晰的定义好你的这个接口,你只要实现这个接口就完成了。

beego开源之路_第9张图片

beego开源之路_第10张图片

Beego还有一个过滤器的概念,刚刚给大家看的整个执行过程里面,在开始执行get之前很多地方都可以插入post,这个过滤器就相当于在你的执行逻辑过程当中post,比如说你要验证用户,所有的请求里面都要有先进行验证用户这样一个方式。一个简单的例子我在所有的请求里面,开始路由解析之前进行所有的验证。在logger里面已经实现了非常多的思路设计。这些都是后面都是网友来贡献的。

beego开源之路_第11张图片

还有一个思路开发,就是要这是Beego相对所有现在市场上目前存在的所有框架最大的一个优点,Beego有一个bee的工具,可以帮你自动化的生成所有的代码现在已经有一个存在的数据库我要基于这个数据库立马生成一个RESTfulAPI加上文档只要一个链接他就会链接你的数据库,把你数据库里面所有的结构分析出来。自动化生成所有的模块这些东西,再加上你所有的文档全部会帮你生出来,为什么会开发这个功能。因为我在新加坡的时候差不多有200多张表,要写RESTful天在写这个东西我觉得人生就浪费在这个上面了,所以我就开始设计这个东西。

beego开源之路_第12张图片

我们一定要让我们的工作变得有价值,我基本上一分钟就可以写两百多个RESTful所有的API代码的自动生成。Bee里面还有很多的东西,调试这些工作的东西。这是Bee相对所有其他框架来说是最贴心的,工程师思想。所以GO也是这种工程师思想的东西,我本身自己是一个工程师,为了我要方便我自己所以我就开发了这个东西。


还有一个最重要,文档做的特别好。这也是Beego做的很成功的一个原因,我以前做Free PHP的时候,发现因为缺少文档的情况下很多新手来问你问题。但是基本上文档可以解释清楚很多东西。所以我写完Beggo之后开始写文档,每一步,新手应该怎么做,每一块的东西应该怎么设计,英文最早有一个新加坡的朋友帮我翻译的,很多老外会帮我做很多贡献,你开源的时候所有的东西很多人会帮你一起改进。

beego开源之路_第13张图片


开源之路

接下来讲一下我的开源之路,其实我之前讲一些心得。

beego开源之路_第14张图片

我觉得最主要是这几个点,第一个持之以恒,你做任何一件事情就是坚持。坚持是很不容易的,很多人在Beego做开源,因为工作的原因或者其他的原因会逐步的放弃这些东西我做开源真的是内心喜欢这件事情,从2012年开始到现在为止还是做这个事情。我即使现在装也非常忙,即使晚上很晚12点钟我还会去看一下微博能回答的还是要回答还会看一些pr领域。我内心有一个责任感在里面,我已经开源出来这个东西,那么多人在用你的东西,你肯定要把这个做好

我内心有一个坚持,我是觉得很多事情你看上去很简单,但是你只要持之以恒的去做,就像我说的每天早上去做新闻整理,这个很多人都会做,但是你如果能坚持一个星期,一月到半年到一年,如果你一直坚持下来,你会发现这个渐渐的就会成为你的一个习惯。我一直信仰人生的格言,成功的习惯比成功更重要。

第二个要持续的付出,在做这个开源的过程当中你不一定有激情怀抱,你只是从自己内心我是对得起我自己,我持续做这个事情,我自己喜欢这个事情你会持续付出。

第三个,是在国内你要做这个开源要有一个强大的内心,攻击你的人很多。你承得住各种的咒骂,对我来说我有些时候不在乎你这个。我觉得我要服务好的是,能够信任我的那批所有的人,对我的咒骂好的我吸收,不好的我就觉得人生路上的陌生人不需要去理会太多。

第四个,心态开展一点,很多人会纠结某一个点。我心态比较开放,什么都无所谓。很多时间去拥抱这个变化,这些心态,Beego已经应用到了非常多的企业。华为云里面有很多Beego的东西,乐视云,360,有道,京东,微博很多公司开始用Beego的东西。

beego开源之路_第15张图片

总结一下Beego

总体而言Beego是一个综合框架,高度松耦合,现在很多人会说Beego是非常臃肿的一个框架。我为什么放到一个里面,是因为我希望所有每一个版本发出来之后都是稳定的可用的。像Beego如果更新了1.8版本,如果cash是1.7版本那会有冲突,所以我要保持整体的是稳定的。这也是为什么我在Beego把所有的放在一起作为一个版本发布的原因。即使我现在把所有的模块放在里面,你要用Logger引入就好了。

在Beego里面有非常多的interface和engine分离,这样设计的原因是为了更加容易扩展。

Beego里面是所有现在框架里模块最丰富的,你做一个产品用到了很多模块都是有的框架。

最后,插件设计,可以很动态的扩展系统。




由 Asta Xie 发起的 Gopher China 大会第四届,将于今年4月在上海举办,今年也是第一次增加了会前的 workshop 。本届的大会无论从规模,内容都将有更多值得大家期待的!


点击阅读原文报名2018 Gopher China 大会

你可能感兴趣的:(beego开源之路)