陈恺:灵雀云的架构演进

嗯, 好的。那么讲讲刚才您分享的内容。您的分享里头提到有一个点我觉得比较有意思,就是他介绍了三种,可以说是应用架构部署的不同的状态。比如说一开始,我们 把应用放在VM就是虚拟机里头。然后第二个状态,就是加了一层Docker在里头,第三个就是微服务的架构,那么你是觉得它是一个应用架构的演进过程吗? 后面的为什么就是Docker、微服务会比较好呢?

陈恺:刚才在演 讲的时候,围绕展开的一个话题就是容器在云里面到底应该怎么用,先简单的讲一下Docker的好处,这个其实大家都已经非常了解了。不过简单的说的话,可 以把整个开发运维的流程想象成有两段,当中由Docker作为开发和运维之间的一个标准的接口。这样子的好处是开发的人员可以去自由的选择使用各种语言、 框架、技术栈之类的,只要最后生成的是一个Docker的镜像。而运维这一边不再需要去关心开发到底用了什么,因为最后都是一个Docker,在不同的环 境里面部署和运行的方式是一模一样的。如果一个应用是部署在云端的话,在当前情况下比较常见的是这个应用可能采用的是一个分层架构,一个传统的单块架构, 他是直接部署在一个云主机里面。可能是有两个实例,每个实例各自部署在一个云主机里边,前面可能是一个负载均衡器,后边可能用到的是一个数据服务。那么第 一步最简单的把这个Docker化的方式,就是使用Docker来将这个应用做一个打包,把Docker作为这个应用的一个交付件。这样做完之后的好处, 首先从测试上面讲,应用放在Docker的镜像里面,可以做到多个环境下测试运行的一致性。比如开发的人在自己的laptop上面运行一个Docker的 容器,和最后跑在生产环境的云主机里面跑的效果是一模一样的。从部署的角度来讲,它的好处是我们可以得到repeatable deployment,什么意思?就是它对于应用环境的配置的过程,在构建的时候已经完成了,生成这个镜像之后,接下来在每一个环境,部署的效果是一模一 样的。最后在运维的角度来说的话,它可以得到的一个好处,就是所谓的immutable infrastructure,一旦生产环境里面云主机和它的环境生成之后,我们就不再去改它,可以保证整个基础设施的一致性和初始化环境的一致性。如果 需要去改动的话,我们可以生成一个新的主机。在Docker下面镜像本身就是immutable,而且你真的需要对它做改动的话,去生成一个新的镜像,然 后做一个部署也是非常方便的事情。其实我们灵雀云自己也是这么做的。一开始的时候我们有一些服务采用的是django这样的框架,也是单块的架构下的一个 服务,然后它直接跑在一个云主机里面。如果这样的服务要做部署的话,我们会比如说采用ansible脚本去写一下,一开始是调用底层IAAS的API来获 取云主机的资源,然后在上面做一些配置,把我们应用所需要的所有的环境都装在这个云主机上,最后再把应用Copy到这个云主机的环境里面,把这个应用跑起 来,是比较长的一个脚本。我们有几个这样的服务,每个服务部署的方式都不一样,我们也有不同的环境,比如说我们有中国区、有美国区,我们的测试环境,我们 的集成环境,每个环境部署的方式也不太一样,最后导致我们就有一大堆的非常复杂的部署的脚本需要去管理和维护,比较麻烦。到有一天我们把开发停下来,把所 有的服务做了一个Docker化以后,就感觉世界一下清净了,所有的服务我们是用jenkins做的持续集成,生成之后就是一个Docker的镜像,这个 镜像在不管什么样服务里面部署的方式非常简单,我们还是ansible脚本来做,这个脚本非常简单,就是获取一个主机装上Docker以后,直接 docker run,我的东西就跑起来,而且还能确保在每个环境里跑的方式一模一样。我觉得别的团队如果是要简单的做一下Docker化,就可以从这一步开始;另外一 个好处就是其实在生产环境里面,它和之前相比,它的改动非常小,只不过是在应用外面包了一层Docker,所以对生产环境的风险相对来说比较低。但是我后 来有提到微服务架构,那是因为像Docker这样一种革命性的技术,它其实一般有几个好处,第一个好处,就是用起来非常容易,所以它会受欢迎。但是它也绝 对不会停留在这样一个表面的使用的方法,会有一些其他的作用力,来让他可以对应用的架构设计,还有开发、运维的方式有些更深层次的影响。和它密切相关的微 服务架构就是其中的一个例子。微服务架构通常大家说起来觉得它是一个很美好的东西。其实真的使用起来要小心,我是觉得微服务是一个没有办法的办法。在一个 项目一开始的话,我绝对不会事先去考虑怎么样设计一个非常漂亮的微服务架构。单块架构比分布式的更容易理解,容易上手,又有很好的工具支持。可以从那里开 始生成一个原形,然后去不断的试错,但问题是如果这个应用成功的话,到了一定的时候,它的体积会变得很大。因为业务的不断扩展,还有功能的不断累积。到了 这个阶段之后,它的复杂度会变得非常高,它的可维护性会变得很低,就导致整个迭代的速度会变得很慢。现在互联网时代,我们知道市场需求变化又特别快,所以 就导致单块架构很难适应这样快速变化的市场需求。在这样的场景下,我们不得不把它拆分成一个个细小的服务,然后每一个服务可以独立的做构建、测试,还有发 布。总的来说是为了把迭代的速度加快,微服务是在这样的场景下诞生的。但是微服务架构也会带来一些它自己的挑战。比如说你把一个服务拆成很多个细小的服务 之后,运维的工作量就很大了。像刚才说的这样一个云环境的话,如果有很多个服务,然后要手动的把这些服务部署到你的VM或者云主机上去的话,其实是很大的 一个工作量。在这一点上其实也是灵雀云诞生的一个初衷,就是在使用微服务的时候,我们更希望的是可以把对于应用的管理和对于基础设施的管理完全的分离开 来,作为开发者的话,只去关注微服务架构下应用的管理。而底层的基础设施,就把它想象成一个虚拟的资源池,然后直接在上面部署应用就可以了。灵雀云其实做 的就是这一点,它把底层的云主机还有基础设施完全屏蔽起来,从开发者的角度来说,其实是做到了基础设施的免运维。

 

6. 像 您刚才介绍的说,如果只是做简单的Docker的话,好像开发的工作没有特别大的变化,而运维的工作变得简单了很多。之后到微服务,这个变化好像就比较复 杂一些,听起来。这个过程中,原来开发的人,还有运维的人,他们的工作会产生什么变化?这个过程有什么需要注意的地方呢?

陈恺:在真的实 践的时候,刚才我已经提到,不是很建议在一开始的时候,就花太多的时间去思考微服务或者是分布式架构的设计。一开始的时候,对于大多数的团队来说,先把服 务做出来上线是比较重要的事情。随后也不太会突然有一天,大家就把这整个单块架构的东西一下子变成一个微服务架构,这也是比较少见的。实际情况下比较可能 发生的是,到了一定时候我们意识到,之前的单块架构下的应用,它的体积变得太大了,复杂度太高了,团队可能跟不上,可能开始没有人可以了解整个应用全局性 的设计,然后开发的速度、测试的速度变得越来越慢,甚至于在生产环境会出现一些regression。到了这个时候开始,第一件可以做的事情就是新的一些 服务的组件,就可以不再往这单块架构里面放,而是独立的做成一个微服务的样子。然后如果在对现有的组件需要做一些改动的时候,可以找机会把现有的组件逐步 的分离出来,变成一个微服务的架构。从开发团队的角度来说,我会建议这样一个做法。从运维的角度来说的话,如果运维的工具链和平台不产生变化的话,当然需 要部署和运维管理的组件越多,运维的工作量就越大,这是没办法的事情。所以在这个时候可以考虑使用一些工具,像Mysos之类的,或者使用像灵雀云这样的 平台来完全的把基础设施,包括云主机的集群管理起来。然后运维唯一需要做的事情就是专注于上层的应用,把它部署在下面被管理的集群上。

 

7. 最后想请您介绍一下接下来的一些工作计划也好,目标也好?

陈恺:接下来我 们,特别是在A轮融资做完之后比较大的要做的一件事,就是开始开拓海外的市场,也想尽快的把我们在美国的团队,发挥我们这方面的优势,包括在那边有一些本 土的团队,可以去做美国那边的市场,这是一个方面;另外一方面的话,还是更多的和我们实际的用户接触,因为在一开始的阶段,我们做得是一样非常新的东西。 在这种情况下,需求都是不可能有客户来告诉你的,就好像是在18世纪的时候,如果你问一个骑马的人说,你想要什么样的交通工具?他不可能想出来说:我要一 辆车子,他会说我要快一点的马,对吧。一开始的时候可以根据我们自己的想象,往一个方向走一些。但到现在的话,就需要去和这些用户更加紧密的接触,然后寻 找真实的痛点,看一下我们的产品需要做什么样的调整。还有是下一个阶段哪一些服务可以更好的服务于这些用户。

This entry was posted in 未分类. Bookmark the permalink.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s