在以往的很多项目中,我们都采用了Docker,而且效果都很不错(大多数时候都不错,只不过有时我们的生产系统中的红帽系统文件会出一些莫名的状况,但可能并不是Docker的问题)。但是,这一次我们并没有采用Docker,原因是没有必要。我们用golang编写了Web服务和静态的html,并且还是用了golang 1.16的新指令//embed,最终得到了一个可部署的二进制文件。
作为一个自强自立的创业公司,我们可以使用的资源非常有限。正是出于这个原因,我们才选择了Golang。我们也渴望能够花费几个星期来构建完善的CI / CD管道、优雅的部署流程以及漂亮的仪表板。但是,为了吸引用户订阅,我们需要交付软件。任何与这个目标没有直接关系的工作都要靠边站,Docker就是其中之一。Docker本身的代码量超过了900万,其自身的bug不可避免,而且还有其自身的特质。
使用Golang可以让我们构建速度非常快的Web服务(至少能够满足我们当前的增长水平),而且可伸缩性非常强(至少能够满足我们当前的需求)。我们的每台服务器每秒可以处理数千个事务。但实际的业务量每秒还不到一千。但是,可以肯定的是,我们用node或deno也可以达到相同的水平。V8引擎也非常快。如果你的最大流量每秒只有大概两个事务(我们有一个健身视频应用,但肯定没有推特那个水平的扩展性问题),那么实际上无论选择哪种编程语言都没有关系。如果容量不足,只需升级服务器就可以了。
我们选择Go的原因是,golang的打包比node、Java或C#好太多了。最终只有一个二进制文件。
构建时,只需运行:
- go build
测试时,只需运行:
- go test
部署时,只需运行:
- scp app user@host:
- ssh user@host “nohup ./app”
我们的实际工作的确比上述“稍微”复杂一些,我们创建了一个SystemD脚本在服务器启动时运行服务。我们还投入了一个专用的构建服务器,其上运行了一个10行代码的shell脚本,而这个脚本可以完成所有的构建工作(git clone、go build、go test、go lint、go vet)。但是,我们之中还有人认为这太复杂了。过几天,可能我们还会添加一个界面(比如https://www.rundeck.com)来控制部署。
我们花在建立构建和部署系统的总时长非常短,我们甚至都不知道如何衡量。
下面,我们来算一算学习Docker、部署Docker、还有故障排除等工作需要花费多少时间。即便你非常喜欢Docker,而它也改变了你的生活,但它是必不可少的吗?你真的认为Docker比我们使用golang内置功能建立的构建和部署还简单吗?我敢向你保证,并没有。