正文
创业,要有“无论什么技术我们都可以实现而且比其他人做的更好”的信念,这是创业赋予你最大的自由,抓住这个自由。
我们选择的技术
下图是我们后台系统选择的一部分技术栈:
一、Go 语言
我经历过的两家公司, Google 主要用 C++,阿里用 Java。前者是一种存在天生设计缺陷的语言,而且 C++ 的开发效率真不算高,即使是对 Google 这样的工程团队,也做了 Style Guild 来规避 C++ 存在的雷区。 而 Java 过于臃肿,缺乏原生的多线程支持,运行环境庞大不适合容器化微服务,如果你给 Java 程序打过 docker 包就知道了,动辄上百兆的运行时。
从创业的第一天,我们选择 Go 作为后台系统开发语言,现在看来是我们做过的最好的决定之一。Go 的优点包括:原生支持多线程编程,可编译为 standalone binary 无需运行时环境(docker 镜像一般 10 几兆就搞定了),自带格式化工具能够统一团队的编程风格,极适合写微服务,而且学习上手快,Java 或者 C++ 程序员只要一个星期就可以达到熟练运用的水平。
创业以来我们用 Go 从头实现了整套后台系统,包括 RTMP 直播服务器、用户体系、交易、IM、搜索、监控、小二后台,我们甚至用 Go 写机器学习代码和机械臂控制程序(我们在用的 Google 的tensorflow 最近也加入了 Go 语言支持) … 实践证明 Go 完全可以胜任所有的后台开发工作,而且有极高的效率和工程实现质量。
二、Kubernetes
我们是微服务的坚定践行者,微服务技术的核心是容器编排系统,现在最流行的三个容器编排系统是 Kubernetes,Mesos,Swarm。
通过比较我们选择了 Kubernetes(简称 k8s),因为 Kubernetes 的设计最吸引我们,有 Google 支持,社区活跃度和发展前景俱佳。我们整个后台系统基于 Kubernetes,并且已经完全微服务化,有 80 多个微服务数百个容器在运行。
我们在实战中使用 Kubernetes 的几点经验如下。
1、二进制版本和配置版本要做分离,且代码化
微服务的配置 yaml 文件 checkin 到 git 代码库,而且做 binary/config 分离,分别控制二进制和配置环境的版本,所有的线上部署的改动都在代码中反映出来。举个 k8s 中微服务配置的例子,如下图。
这是我们一个微服务的 deployment 文件,我们用 git 的版本号做 docker 镜像的 tag(jenkins 自动打包后加上去的),docker 镜像里只包含 binary 文件,配置文件通过 configmap 的 volume mount 为容器内的一个目录,而且配置文件也做了版本号控制,数据库密码等不走代码,而是由集群管理员手工输入为 kubernetes 的 secret,不留任何记录,从而避免了敏感信息的泄露。