第10章 部署微服务

    本章主要内容
    理解为什么DevOps运动对微服务至关重要
    配置EagleEye服务使用的核心亚马逊基础设施
    手动将EagleEye服务部署到亚马逊的EC2容器服务中
    为服务设计构建和部署管道
    从持续集成转向持续部署
    将基础设施视为代码
    构建不可变的服务器
    在部署中测试
    将应用程序部署到云
    本书已经接近结尾,但我们的微服务旅程还没有走到终点。尽管本书的大部分内容都集中在使用Spring Cloud技术设计、构建和实施基于Spring的微服务上,但我们还没有谈到如何构建和部署微服务。创建构建和部署管道似乎是一项普通的任务,但实际上它是微服务架构中最重要的部分之一。
    为什么这么说呢?请记住,微服务架构的一个主要优点是,微服务是可以快速构建、修改和部署到独立生产环境中的小型代码单元。服务的小规模意味着新的特性(和关键的bug修复)可以以很高的速度交付。速度是这里的关键词,因为速度意味着新特性或修复bug与部署服务之间可以平滑过渡,致使部署的交付周期应该是几分钟而不是几天。
    为了实现这一点,用于构建和部署代码的机制应该是具有下列特征的。
    自动的——在构建代码时,构建和部署过程不应该有人为干预,特别是在级别较低的环境中。构建软件、配置机器镜像以及部署服务的过程应该是自动的,并且应该通过将代码提交到源代码存储库的行为来启动。
    可重复的——用来构建和部署软件的过程应该是可重复的,以便每次构建和部署启动时都会发生同样的事情。过程中的可变性常常是难以跟踪和解决的微小bug的根源。
 
     完整的——部署的软件制品的成果应该是一个完整的虚拟机或容器镜像(Docker),其中包含该服务的“完整的”运行时环境。这是开发人员对待基础设施的一个重要转变。机器镜像的供应需要通过脚本实现完全自动化,并且这个脚本与服务源代码一起处于源代码控制之下。
    在微服务环境中,这种职责通常从运维团队转移到拥有该服务的开发团队。请记住,微服务开发的核心原则之一是将服务的全部运维责任推给开发人员。
    不可变的——包含服务的机器镜像一旦构建,在镜像部署完后,镜像的运行时配置就不应该被触碰或更改。如果需要进行更改,则需要在源控制下的脚本中进行配置,并且服务和基础设施需要再次经历构建过程。
 
运行时配置(垃圾回收设置、使用的Spring profile)的更改应该作为环境变量传递给镜像,而应用程序配置应该与容器隔离(Spring Cloud Config)。
    构建一个健壮的、通用的构建部署管道是一项非常重要的工作,并且通常是针对服务将要运行的运行时环境专门设计的。这项工作通常涉及一个专门的DevOps(开发人员运维)工程师团队,他们的唯一工作就是使构建过程通用化,以便每个团队都可以构建自己的微服务,而不必为自己重复发明整个构建过程。但是,Spring是一个开发框架,它并没有为实现构建和部署管道提供大量功能。
    在本章中,我们将看到如何使用众多非Spring工具来实现构建和部署管道。我们将利用为本书所构建的一套微服务,完成以下几件事。
    (1)将一直使用的Maven构建脚本集成到一个名为Travis CI的持续集成/部署云工具中。
    (2)为每个服务构建不可变的Docker镜像,并将这些镜像推送到一个集中式存储库中。
    (3)使用亚马逊的EC2容器服务(EC2 Container Service,ECS)将整套微服务部署到亚马逊云上。
    (4)运行平台测试,测试服务是否正常工作。
 
我想以最终目标开始我们的讨论,那就是一组部署到 AWS 弹性容器服务(Elastic Container Service,ECS)上的服务。在深入了解如何实现构建和部署管道的所有细节之前,我们先了解一下EagleEye服务将如何在亚马逊云中运行。然后, 我们再讨论如何手动将EagleEye服务部署到AWS云。一旦完成这一步,我们将自动化整个过程。
    
10.1 EagleEye:在云中建立核心基础设施
    在本书的所有代码示例中,我们将所有应用程序运行在一个虚拟机镜像中,其中每个单独的服务都是作为Docker容器运行的。我们现在要做一些改变,通过将数据库服务器(PostgreSQL)和缓存服务器(Redis)从Docker分离到亚马逊云中。所有其他服务将作为在单节点Amazon ECS集群中运行的Docker容器继续运行。图10-1展示了如何将EagleEye服务部署到亚马逊云。
 
图10-1 通过使用Docker,所有的服务都可以部署到云服务提供商的环境中,如亚马逊的ECS
    让我们浏览一遍图10-1并深入了解更多细节。
    (1)所有的EagleEye服务(除了数据库和Redis集群)都将部署为Docker容器,这些Docker容器在单节点ECS集群内部运行。ECS配置并建立运行Docker集群所需的所有服务器。ECS还可以监视在Docker中运行的容器的健康状况,并在服务崩溃时重新启动服务。
    (2)在部署到亚马逊云之后,我们将不再使用自己的PostgreSQL数据库和Redis服务器,而是使用亚马逊的RDS和亚马逊的ElastiCache服务。读者可以继续在Docker中运行Postgres和Redis数据存储,但我想强调的是,从自己拥有和管理的基础设施转移到由云供应商(在本例中是亚马逊)完全管理的基础设施非常容易。在实际部署中,在Docker容器出现之前,通常会将数据库基础设施部署到虚拟机上。
    (3)与桌面部署不同,我们希望服务器的所有流量都通过Zuul API网关。我们将使用亚马逊安全组,仅允许已部署的ECS集群上的端口5555可供外界访问。
    (4)我们仍将使用Spring的OAuth2服务器来保护服务。在可以访问组织服务和许可证服务之前,用户需要使用验证服务进行验证(详细信息参见第7章),并在每个服务调用中提供一个有效的OAuth2令牌。
    (5)所有的服务器,包括Kafka服务器,外界都无法通过公开的Docker端口进行访问。
    实施前的必要准备
    要建立亚马逊基础设施,读者需要以下内容。
    (1)自己的Amazon Web Services(AWS)账户。读者应该对AWS控制台和在该环境中工作的概念有一个基本的了解。
    (2)一个Web浏览器。对于手动创建,读者将从控制台创建所有内容。
    (3)用于部署的亚马逊ECS 命令行客户端。
    如果读者没有使用过AWS,建议读者建立一个AWS账户,并安装上面列出的工具,然后再花一些时间熟悉这个平台。
    如果读者对AWS完全陌生,强烈建议读者去买一本Michael和Andreas Wittig撰写的《Amazon Web Services in Action》 。这本书的第1章是可免费下载的。这一章的最后包含一个详细教程,介绍如何注册和配置AWS账户。《Amazon Web Services in Action》是一本关于AWS的精心编写且全面的书。尽管我已经在AWS环境中工作多年了,但我发现它仍然很有用。
    最后,在本章中,我尽可能尝试使用亚马逊提供的免费套餐服务,唯一一个例外是创建ECS集群。我使用了一台t2.large服务器,每小时运行成本大约是10美分。读者如果不想承担巨额的费用,要确保在完成本章内容之后关闭服务。
    注意,如果读者想自己运行本章的代码,本书无法保证本章中使用的亚马逊资源(Postgres、Redis和ECS)可用。如果读者要运行本章的代码,读者需要建立自己的GitHub存储库(用于应用程序配置)、Travis CI账户、Docker Hub(用于Docker镜像)和AWS账户,然后修改应用程序配置以指向自己的账号和凭据。
 
 
posted @ 2019-12-03 11:00  mongotea  阅读(191)  评论(0编辑  收藏  举报