微服务设计第六章: 部署

部署一个单块系统的流程非常简单。然而在众多依赖的微服务中,部署却是完全不同的情况。如果部署的方法不合适,那么其带来的复杂程度会让你痛苦。

1.持续集成简介

CI(Continue Integration, 持续集成)能够保证新提交的代码与已有代码集成,从而让所有人保持同步。CI服务器会检测到代码已提交并签出,然后花些时间来验证代码是否通过编译以及测试是否能通过。
作为这个流程的一部分,我们经常会生成一些构建物已供后续验证使用,比如启动一个服务并对其运行测试。理想情况下,这些构建物应该只生成一次,然后在本次提交所对应的所有部署环节中使用。这不仅可以避免多次重复做一件事情,还可以保证部署上线的构建物与测试通过的是同一个。为了重用构建物,需要把他们放在某个仓库中。CI本身会提供这样的一个仓库,你也可以使用独立系统来做这件事情。

2.把持续集成映射到微服务

当持续集成遇上微服务时,需要考虑如何把CI的构建和每个微服务映射起来。前面我们已经提到过多次,每个服务应该能够独立于其他服务进行部署。所以如何在微服务、CI构建及源码三者之间,建立起合适的映射呢?
如果从最简单的做法开始,我们可以先把所有东西放一起。现在我们有一个巨大的代码库,其中包括所有的代码,并且只有一次构建。向该代码库任何一次的代码提交都会触发构建,在这个构建中我们会运行所有微服务相关的验证,然后产生多个构建物,所有这些都在同一个构建中完成。这种构建方法比较简单。一般来讲,我们应该绝对避免这个模式,但是在项目初期是个例外。这种模式有明显的缺点,比如一行代码的修改,所有的服务都需要构建和验证,这里花费了不必要的时间。也会影响单个修改从开发到上线的速度。
这种方法的另外一个变体是保留一个代码库,但是存在多个CI映射到代码库的不同部分。
作者比较喜欢的方法是,每个服务都有自己的CI,每个微服务都有自己的代码库,分别与相应的CI绑定。当对代码库进行修改时,可以只运行相关的构建以及其中的测试。

3.构建流水线和持续交付

在早些年使用持续集成的时候,我们意识到把一个构建分成多个阶段是很有价值的。比方说在测试中可能有很多运行快、涉及范围很小的测试;还有一些很耗时、涉及范围较大的测试。如果所有测试一起运行的话,有可能一个快速测试已经失败了,但是因为需要等待那些耗时测试的完成,所以还是无法得到快速反馈。
构建流水线可以很好的跟踪软件构建进度:每完成一个阶段,就离终点更近一步。流水线也能够可视化本次构建物的软件质量。

4.平台特定的构建物

大多数技术栈都有相应的构建物类型,同时也有相关的工具来创建和安装这些构建物。Ruby中有gem,Java中有JAR包和WAR包,Python终有egg。
从微服务部署的角度看,在有些技术栈中只有构建物本身是不够的。不同的技术栈生成的构建物各不相同,所以混合不同构建物进行部署就会很复杂。

5.操作系统构建物

有一种方法可以避免多种技术栈下的构建物所带来的问题,那就是使用操作系统支持的构建物,举个例子,对基于Redhat或者Centos的系统来说,可以使用RPM,对于Ubuntu来说,可以使用deb包,对windows来说,可以使用MSI。使用os特定构建物的好处时,做部署时不需要考虑底层使用的是什么技术。只需要简单使用内置的工具就可以完成软件的安装。

6.定制化镜像(虚拟机镜像)

你只需要构建一次镜像,然后根据这些镜像启动虚拟机,不需要在花费时间来安装相应的依赖,因为它们已经在镜像中安装好了,这样可以节省很多时间。如果你的核心依赖没有改变,那么新版本的服务就可以使用相同的基础镜像。

7.Docker

Docker是构建在轻量级容器上的平台。它帮你处理了大多数与容器管理相关的事情。你可以在容器中创建和部署应用,这些基于容器的应用与VM世界中的镜像很类似。Docker也能管理容器的配置,并帮你处理一些网络问题,甚至还提供了自己的registry概念,允许你存储Docker应用程序的版本。
Docker本身并不能解决所有问题,它只是一个在单机上运行的简单的Paas。你还需要一些工具,来帮助你跨多台机器管理Docker实例上的服务。调度层的一个关键需求是,当你向其请求一个容器时会帮助你找到相应的容器并运行它。在这个领域,Google的开源工具Kubernetes和CoreOS集群技术能够提供一定的帮助,而且似乎每个月都有新的竞争者出现。

8.小结

首先,专注于保持服务能够独立于其他服务进行部署的能力,无论使用什么技术,请确保它能够提供这个能力。我倾向于一个服务一个代码库,对于每个服务一个CI这件事情,我不仅仅是倾向,并且非常坚持,因为只有这样才能实现独立部署。
接下来,如果可能的话,将每个服务放到单独的主机/容器中。看看类似LXC或者Docker这样替代的技术,如何简化对多个服务的管理。但是要记住的一点是,无论你采用什么技术,自动化的文化对一切管理来说都非常重要。
最后,如果你想深入了解这些话题,我强烈推荐你读一读《持续交付》这本书,这本书对流水线设计和构建物管理有更深入的讨论。

推荐阅读更多精彩内容