简述从开发机到云服务的进化

由于最近在负责公司内部的一个平台服务(前端 + 后端),所以不可避免的接触到了服务上线的过程。

因为自己之前也搭建过博客后台,在我这个后端小白的眼里,搭建后端服务的流程应该是这样的:

  1. 申请域名,然后去域名商那里设置域名解析,通常是添加一条 A 记录指向自己的服务器地址
  2. 配置 nginx,主要是设置静态资源的位置,以及指定 80 端口由哪个进程负责处理
  3. 本地测试代码通过后上传到 git 仓库,再从服务器拷贝下来代码运行

传统开发模式的问题

这种开发模式一两个人玩还好,但涉及到公司层面的多人开发时,就必然出问题,我随便列出了一些:

  1. 因为公司内部服务非常多,可能有几百上千个,如果所有人都去改 nginx 代码肯定不现实,搞不好会把线上服务弄坏。
  2. 真实开发过程中可能使用的是服务器集群,如果手动管理,集群的扩容和缩容都不太方便,至少现阶段没有那么多简单易使用的工具。
  3. 我们需要更加自动化的服务,比如在服务器宕机、CPU/内存 等占用过高时自动通过内部交流工具或者电话、短信等方式报警,并且自动扩容。这套流程涉及到监控、报警和自动处理,如果都交给开发者来负责,必然出现大量重复的劳动。
  4. 由于本机大多是使用 Mac OS 系统开发,但服务器往往是 Linux 系统。环境的不一致必然会导致问题,比如我们会发现本地明明没有问题,但是在服务端就不好使,这类问题排查起来通常还非常麻烦。
  5. 业务庞大以后,会涉及到更多的流程,比如小流量实验, 线上回滚等等。这些都是真实的、可抽象封装的需求,没有必要再通过代码去控制,而是可以提供更简单的服务。

作为一个还算不上后端开发者的菜鸟,我尚且能一下子提出这些棘手的问题,可见刀耕火种的初级开发模式确实在大规模开发时是行不通的。

云服务的开发模式

至于解决上述问题的原理,我不是内行,就不献丑了,只能简单介绍一下目前的开发模式,就当是抛砖引玉吧。

实际上目前公司提供的服务可以被看作 PaaS(平台即服务:Platform as a Service),类似的名词还有 IaaS 和 Saas。可以这么简单来理解他们:

  1. 我们自己买了一台服务器,这是最原始的做法,啥都不算
  2. 我们去腾讯云买了一台服务器,IP 地址已经分配好了,系统也装好了,甚至还有防 DDOS 的服务,这个叫 IaaS,可以理解为买了硬件。
  3. 腾讯云提供了软件开发的镜像,我们只要上传 node/golang 代码就能跑服务,这个叫 PaaS,可以理解为买了开发平台(Platform)。
  4. 腾讯云提供了一套论坛代码,我们编辑编辑配置和权限就能直接运营一个论坛,这个叫 SaaS,可以理解为买了一套服务(Service)。

SCM

要使用 PaaS,一般来说还需要建立一套 SCM 服务。听起来很复杂,其实 SCM 就是简化版的 Jenkins,它只专注于打包,没有 Jenkins 那么多的配置和任务的上下游关系。要创建一个 SCM 服务,我们只要做两件事:

  1. 绑定你的 git 地址
  2. 按照指定的格式,比如创建一个名为 scm.sh 的脚本用于执行打包任务,然后把打包结果放到指定目录内作为产出

之所以需要执行打包这个过程,是因为不同类型的项目有不同的特点,同样以源码为例:

  1. node 后端代码是动态语言,不需要编译,源码拿来就能用
top Created with Sketch.