运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)

【恭弘=叶 恭弘峰】:本日的这个分享,这个题目是应用12个理念去疾速建立高可保护性的应用。假如人人能很好的应用12条轨则的话,我们可以越发的匹敌 software erosion。这个12条比则是Adam Winggins提出来的12条理念。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

然则如今许多团队在本身的探索中,已发明了这12条个中的一部份。然后我也跟许多朋侪聊过这个话题,假如是来自大公司的话,他们许多会以为这12条应当是一样平常应当做的事变。假如来自创业公司或许小团队来讲,这12条理念会让开辟速率变慢。但实在这12条理念实在可以非常好的匹敌software erosion。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

它的本意是跟着时刻的流逝被消磨或许侵蚀掉了。前面几个礼拜前写的代码,如今已看不太懂,或许说公司有一个体系,你如今有一个新的需求,你要满足这个需求,就是要满足这12条例子最快地完成这个需求。假如如今运转得很好的一个产物,可以一两年以后操纵体系更新了,底层的依靠已变了,这时刻你重启体系,发明已不能运动了,不晓得怎么回事。如许的版本由于体系资源不够了,必须要举行清算。我们讲一下Heroku这个公司,有很厉害的iOS开锁的作者。这家公司并非非常胜利的,由于它在10年被收买的时刻,我看了一下它线上只需也许一万个应用,他们的现金流应当是比较有限的。然则他们有非常壮大的工程才能,他们照样在10年的时刻被两亿美金收买掉了。人人可以都回用git去治理代码,日常平凡布置会很贫苦,然则你只需用git push就可以完成代码的版本了。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

我只需fork一下就可以了,假如我的生活环境有什么变化,我可以直接fork一份。我们为何不直接用Heroku去开辟呢?由于Heroku比一切的EPS都要贵一点,另有一个最大的题目,实际上是很强的题目,部份AT是被墙掉的,所以没有方法。实在Heroku有许多的开源可以去用,然则我们发明这些克隆的版本都有许多的限定,我们并非一定要造一个Heroku出来,去做我们的开辟。我只须要在Heroku这个创始人他们在建立Heroku的这个过程当中,进修会了这套理念,把这套理念用到我们的开辟中就可以了。这边是详细的12条,依据我们的实践下来,就是这12条。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

我们并不须要悉数都去应用出来。然则个中的部份,实在照样挺有代价的。第一条实际上它的原文讲的是每一个代码都要用自力的代码堆栈去治理,到如今就是microservices的架构。我们晓得Twitter每次大众的API挪用都发生凌驾100次的内部API挪用。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

有利于开辟团队举行合作、下降布置本钱,非常疾速回滚。这个就是我们用到的内部的一些私有的堆栈,恪守这条发生发火的话会有一些优点,比如说一份代码我只需修正一下定制就可以了。假如说一个体系没有方法用一份代码存储的话,说明它必需切分红多个代码堆栈。这边我们用到三个比较基本的东西,这个模子层,实际上是私有的Ruby的代码库。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

它封装了一些对数据库的操纵,它是自力成一个代码堆栈,我们可以经由过程环境变量注入只读的数据库,如许可以确保它是很清洁的。另有一个只写的对外供应APT的接口。在这里把它分红差别的子体系,我们可以用X-Rate-Limit。如许的优点在于不论是客户端的题目照样内部的其他子体系的题目,或许说是来自外界的歹意进击,我们都可以有方法把进击降到最低。第二点跟方才一开始提到的,假如你须要体系迁徙或许体系升级,这类状态下如何保证体系很轻易的举行迁徙。须要对依靠做声明。这边的话是Gemfile的示例,这个文件会详细的说明用到哪个库的数据。你可以保证用到的都是如出一辙的版本。如许照样有点笼统,这里举个例子,Sidekg和体系默许的版本不一致,假如我用Bundle exec,未来万一他们是不兼容的,或许代码迁徙到其他体系,这个体系默许的库就是不兼容的。

固然现在迥殊盛行的docker是可以很轻易地满足这个需求,本日就不讲这个事变。另有第三点的话,我们首倡把设置放到Unix的环境变量中。一开始是放在代码常量内里,然则代码常量有个不好的处所,你要修正的话要往返地修改代码。如许会影响你在代码堆栈的一个状态。假如你在比如说上线前的版本和上线后的版本设置不一样的话,你要在代码堆栈保持两个分支,一定如许是不合理的。照样举个例子,假如是ruby的话他有一个比较推重的.ENB。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

第四点和第三点关联很大的,我们对外部体系的依靠,比如说我们要接见七牛的API,我们发起放在稳固变量,包含其他的子体系。方才我们提到了就是我们的模子层,我们会有对外暴露的两个接口,这两个接口会注入进来。这边有个简朴的测试,你永久不应当把不应当提交的代码堆栈提交出去。这边是个简朴的示例,这个剧本是很简朴的实行环境敕令。假如我们用dot enb的话,不论用什么语音都是很轻易完成的。然则它对全部体系的稳固性的协助是非常大的。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

第五点的话实在关于我们实践下来,实在以为并非迥殊的主要,人人看一下就好。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

第六是如许的,就是应用应当作为没有状态的历程去运转。除了和耐久化相干的效劳,其他效劳都是应当无状态的。这么做有什么不好的处所?你没有方法确保同一个客户一样的历程保留在内里,而且下一次这个客户的要求也会到其他的机械上。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

我们方才提到了可以经由过程环境变量的注入依靠,我们首倡把每一个自力的应用绑定,就是内嵌HTTP的库。他们直接对外绑定端口,对外供应效劳,而不是依靠外部的效劳容器运转。这个绑定的端口它未必以HTTP的协定举行运转。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

而且我们方才提到以如许的体式格局去说明的话,这些效劳就可以作为其他的效劳的依靠。高层次的API就可以基于低层次的API实行了。以如许的一种体式格局去做的话,接下去有非常好的应用,就是说我们在最前端可以用layer awore tcp proxy举行。假如它get某一个途径的话,我们可以转化到对应的m point上面。另有相似的做法,以相似的这类TCP的代办体式格局,我们可以很简朴地复制一份流量。我假如要举行体系的机能测试,我一定不能在一般环境下测,然则我假如布置两份如出一辙的流量,如许子一是可以做机能的压力测试,别的在线假如线上有什么bug的话,新体系假如要上线,我一样可以用如许的体式格局测试。雷同的流量下来,它会有什么样的回响反映。这类体式格局在GitHub的应用,它不可以许可DNS的这类体式格局随机给你指定某一个机械去相应你的要求。由于每一个推的,每一个往上面push的代码都是跟个人相干的。然则以这类体式格局去做的话,就可以捕捉到Git协定内里的一段,然后我们可以抓出你的用户名,可以定向到对应的机械上去。如许可以做到很轻易的扩容。

第八点,扩容的体式格局我们首倡是以多历程的模子举行扩容。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

虽然是以多历程的形式扩容的话,并不代表每一个历程是单历程的。由于我们方才提到了,我们首倡效劳都是无状态的。每一个效劳都是无状态,扩容就很轻易。可以把一样的历程布置到差别的效劳器上。背面两点实际上报告多历程的形式,我们供应的效劳就不应当把本身变成体系的daemon。罕见的把一个顺序绑在背景的一种体式格局,但这几种体式格局实在都不太好的。第二个是把代码放在阿帕奇的容器内里运转,如许两份代码相互会有争执,你应用阿帕奇如许的容器。别的的话像ruby的unicon,如许子也是不够好的。都邑碰到许多新鲜的题目,假如历程挂掉了怎么办?历程非常退出,会飘到其他的PID上面。假如我们没有做好好的环境断绝的话,会有不纯洁的环境,分外的环境变量会对体系形成非常的影响。这边照样以Ruby为例子,我们以procfile示例,对外供应FTTP的效劳,这两个剧本随时会由于种种缘由退出,假如以如许的体式格局导出到upstyle。

第九点是疾速启动,文雅封闭。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

第十点的话,我们照样愿望开辟、测试、布置的环境要只管靠近。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

许多公司由于分工很明白,代码是开辟写的,临盆环境和运转是运维的事变。作为担任开辟,要从需求的正确性到今后,全部代码的正确性都是应当担任的。第二条机械太慢的状态已比较少见了,所以我们只管保证开辟的环境和运转的环境是一样的。延续集成很主要,实在许多人,迥殊是小团队可以会以为延续集成,搞测试是一件很烦的事变。实在不是的,你要很浅易的搭一个不断地跑测试的效劳器是很主要的。它会往这个效劳发一个HTTP的包,不论胜利、失利会发出来一份文件。全部环境的搭载是很轻易的,也许一两个小时就可以搭起来了。我一直是写Ruby的,关于创业公司来讲如许可以会有点过了,由于许多时刻你们不晓得会做成什么模样。这类状态回归测试是很主要的,碰到一个bug,写一个测试可以重现它。下一次这个测试会直接通知你如何做的,如许也是回到方才的一个主题,未来这个代码不可保护了。任何的修改损坏到本来的东西,测试都邑跑不过。第十点,我以为是迥殊主要的一点。假如每一个体系都往文件内里写的话,每一个日记都邑分摊在差别的处所,一旦出了题目,你都不晓得该去看那里的日记了。

据我个人得履历,效劳器满了,都是日记把磁盘写满了。抱负的状态下,应当是把一切的日记直接规范输出,再从印象到效劳器上,这是抱负的状态。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

一切的日记一致剖析和处置惩罚。我一个朋侪他跟我讲说这12点实在对他们公司来讲都是很一般的做法,然则小团队的话假如搭如许一套环境比较难题,我们如今现在还没有搭本身的日记效劳,如今用的是一个外洋的paper trail的效劳。

《运用12-factor的理念疾速建立高可维护性的运用—恭弘=叶 恭弘峰 (1213开发者实践日)》

如许做的别的的优点就在于我可以做日记报警,假如涌现如许的一个状态的话,我必需收到一封邮件。不论内里多少个子体系,任何一个子体系涌现题目,我都可以收到一封邮件。好的,感谢人人,本日的分享就到这里。

PS:开辟者最好实践日·第8期-互联网产物从设想到上线 北京站
报名地点:http://qiniu-8.eventdove.com

    原文作者:七牛云
    原文地址: https://segmentfault.com/a/1190000002428730
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞