- 内容提要
- 译者序
- 前言
- 第 1 章 欢迎迈入云世界,Spring
- 第 2 章 使用 Spring Boot 构建微服务
- 第 3 章 使用 Spring Cloud 配置服务器控制配置
- 第 4 章 服务发现
- 第 5 章 使用 Spring Cloud 和 Netflix Hystrix 的客户端弹性模式
- 第 6 章 使用 Spring Cloud 和 Zuul 进行服务路由
- 第 7 章 保护微服务
- 第 8 章 使用 Spring Cloud Stream 的事件驱动架构
- 第 9 章 使用 Spring Cloud Sleuth 和 Zipkin 进行分布式跟踪
- 第 10 章 部署微服务
- 附录 A 在桌面运行云服务
- 附录 B OAuth2 授权类型
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] 。这本书的第 1 章是可免费下载的。这一章的最后包含一个详细教程,介绍如何注册和配置 AWS 账户。《Amazon Web Services in Action》是一本关于 AWS 的精心编写且全面的书。尽管我已经在 AWS 环境中工作多年了,但我发现它仍然很有用。
最后,在本章中,我尽可能尝试使用亚马逊提供的免费套餐服务,唯一一个例外是创建 ECS 集群。我使用了一台 t2.large 服务器,每小时运行成本大约是 10 美分。读者如果不想承担巨额的费用,要确保在完成本章内容之后关闭服务。
注意,如果读者想自己运行本章的代码,本书无法保证本章中使用的亚马逊资源(Postgres、Redis 和 ECS)可用。如果读者要运行本章的代码,读者需要建立自己的 GitHub 存储库(用于应用程序配置)、Travis CI 账户、Docker Hub(用于 Docker 镜像)和 AWS 账户,然后修改应用程序配置以指向自己的账号和凭据。
10.1.1 使用亚马逊的 RDS 创建 PostgreSQL 数据库
在开始本节之前,我们需要创建和配置 AWS 账户。完成之后,我们的第一项任务就是创建要用于 EagleEye 服务的 PostgreSQL 数据库。要做到这一点,我们将要登录到 AWS 控制台并执行以下操作。
(1)在第一次登录到控制台时,我们将看到一个亚马逊 Web 服务列表。找到 RDS 的链接并点击它,进入 RDS 仪表板。
(2)在仪表板上找到一个上面写着“Launch a DB Instance”的大按钮并点击它。
(3)RDS 支持不同的数据库引擎。此时,应该能看到一个数据库列表。选择 PostgreSQL,然后点击“Select”按钮。这将启动数据库创建向导。
亚马逊的数据库创建向导首先会询问这是生产数据库(Production)还是开发/测试(Dev/Test)数据库。我们将使用免费套餐创建开发/测试数据库。图 10-2 展示了这个界面。
图 10-2 选择数据库是生产数据库还是测试数据库
接下来,我们将创建有关 PostgreSQL 数据库的基本信息,并设置将要使用的主用户 ID 和密码来登录数据库。图 10-3 展示了这个界面。
图 10-3 设置基本数据库配置
该向导的最后一步是创建数据库安全组、端口信息和数据库备份信息。图 10-4 展示了这个界面的内容。
图 10-4 为 RDS 数据库创建安全组、端口和备份选项
此时,数据库创建过程将开始(可能需要几分钟)。完成之后,需要配置 EagleEye 服务来使用数据库。创建完数据库之后(这需要几分钟),返回到 RDS 仪表板并查看创建的数据库。图 10-5 展示了这个界面。
图 10-5 创建好的 RDS/PostgreSQL 数据库
对于本章,我为每个需要访问基于亚马逊的 PostgreSQL 数据库的微服务创建了一个名为 aws-dev
的新应用程序 profile。我在 Spring Cloud Config GitHub 存储库(https://github.com/ carnellj/config-repo)中添加了一个新的 Spring Cloud Config 服务器应用程序 profile,它包含亚马逊数据库连接信息。使用新数据库的每一个属性文件都遵循命名约定( 服务名 ) -aws-dev.yml
(许可证服务、组织服务和验证服务)。
此时,数据库已经准备好了(还不赖,只需要大约 5 次点击就能创建完成)。让我们转向下一个应用程序基础设施,看看如何创建 EagleEye 许可证服务将要使用的 Redis 集群。
10.1.2 在 AWS 中创建 Redis 集群
要创建 Redis 集群,我们将要使用亚马逊的 ElastiCache 服务。ElastiCache 允许开发人员使用 Redis 或 Memcached 构建内存中的数据缓存。对于 EagleEye 服务,我们将把在 Docker 中运行的 Redis 服务器迁移到 ElastiCache。
先回到 AWS 控制台的主页(点击页面左上角的橙色立方体),然后点击 ElastiCache 链接。
在 ElastiCache 控制台中,选择 Redis 链接(页面的左侧),然后点击页面顶部的蓝色创建按钮。这将启动 ElastiCache/Redis 创建向导。
图 10-6 展示了 Redis 创建界面。
图 10-6 只需通过几次点击就可以创建一个 Redis 集群,该集群的基础设施是由亚马逊管理的
在填完所有数据后,点击“Create”按钮。ElastiCache 将开始 Redis 集群创建过程(这将需要几分钟的时间)。ElastiCache 将在最小的亚马逊服务器实例上构建一个单节点的 Redis 服务器。一旦点击按钮,就会看到 Redis 集群正在创建。创建完集群之后,点击集群的名称,进入详情页面,该页面显示集群中使用的端点。图 10-7 展示了 Redis 集群创建后的细节。
图 10-7 Redis 端点是服务连接到 Redis 所需的关键信息
许可证服务是唯一一个使用 Redis 的服务,因此如果读者将本章中的代码示例部署到自己的亚马逊实例中,一定要确保适当地修改许可证服务的 Spring Cloud Config 文件。
10.1.3 创建 ECS 集群
部署 EagleEye 服务之前的最后一步是创建 ECS 集群。建立一个 ECS 集群以供应要用于托管 Docker 容器的 Amazon 机器。要做到这一点,我们将再次访问 AWS 控制台。在这里,我们将点击 Amazon EC2 Container Service 链接。
我们将进入主 EC2 容器服务页面,在这里,应该会看到一个“Getting Started”按钮。
点击“Start”按钮,进入如图 10-8 所示的“Select options to configure”页面。
图 10-8 ECS 提供了一个向导来引导一个新的服务容器(我们不会用到这个向导)
取消勾选屏幕上的两个复选框,然后点击“Cancel”按钮。ECS 提供了一个向导,它基于一组预定义模板来创建 ECS 容器。我们不打算使用这个向导。一旦取消了 ECS 创建向导,应该会看到 ECS 主页上的“Clusters”选项卡。图 10-9 展示了这个界面。点击“Create Cluster”按钮开始创建 ECS 集群的过程。
图 10-9 开始创建一个 ECS 集群的过程
现在,我们将看到一个名为“Create Cluster”的界面,它有 3 个主要部分。第一部分将定义基本的集群信息。在这里需要输入以下信息:
(1)ECS 集群的名称;
(2)运行该集群的 Amazon EC2 虚拟机的大小;
(3)集群中运行的实例数;
(4)分配给集群中的每个节点的弹性块存储(Elastic Block Storage,EBS)的磁盘空间量。
图 10-10 展示了我为本书中的测试示例填写的界面。
图 10-10 在“Create Cluster”界面设定用于托管 Docker
集群的 EC2 实例的大小
注意
在创建 Amazon 账户时,首先要做的一件事是定义一个密钥对,用于使用 SSH 进入启动的 EC2 服务器中。本章不会介绍创建密钥对,但是如果读者以前从未这样做过,建议读者看看亚马逊有关这方面的说明书。
接下来,我们将要为 ECS 集群创建网络配置。图 10-11 展示了 Networking 界面以及正在配置的值。
图 10-11 创建好服务器后配置网络/AWS 安全组来访问它们
首先要注意的是,选择 ECS 集群将运行的亚马逊的 Virtual Private Cloud(VPC)。默认情况下,ECS 设置向导将创建一个新的 VPC。我已经选择在我的默认 VPC 中运行 ECS 集群。默认的 VPC 包含数据库服务器和 Redis 集群。在亚马逊云中,亚马逊管理的 Redis 服务器只能由与 Redis 服务器处于同一个 VPC 的服务器访问。
接下来,我们必须在 VPC 中选择要为 ECS 集群提供访问权限的子网。因为每个子网对应于一个 AWS 可用区域,所以我通常选择 VPC 中的所有子网,以使集群可用。
最后,我们必须选择创建一个新的安全组,或者选择已创建的现有 Amazon 安全组,以应用于新的 ECS 集群。因为我们正在运行 Zuul,并且希望所有的通信都通过单一端口( 5555
)。我们将要配置由 ECS 向导创建的新安全组,以允许来自外界的入站通信(0.0.0.0/0 是整个因特网的网络掩码)。
在表单中必须填写的最后一步是,为在服务器上运行的 ECS 容器代理创建 Amazon IAM 角色。ECS 代理负责与 Amazon 就服务器上运行的容器的状态进行通信。我们将允许 ECS 向导创建一个名为 ecsInstanceRole
的 IAM 角色。图 10-12 展示了这个配置步骤。
图 10-12 配置容器 IAM 角色
此时,读者应该能看到一个集群创建跟踪状态的界面。创建完集群之后,应该在界面上看到一个蓝色的名为“View Cluster”按钮。点击这个“View Cluster”按钮。图 10-13 展示了点击这个“View Cluster”按钮后出现的界面。
图 10-13 ECS 集群正在运行
此时,我们已经具备了成功部署 EagleEye 微服务所需的所有基础设施。
关于基础设施的创建和自动化
读者现在正通过 AWS 控制台执行所有操作。在真实环境中,读者可以使用亚马逊的 CloudFormation 脚本 DSL(领域特定语言)或 HashCorp 的 Terraform 这样的云基础设施脚本工具创建所有这些基础设施。不过,这是一个完整的主题,它远远超出了本书的范围。如果读者使用亚马逊云,那么可能已经熟悉 CloudFormation。如果读者是亚马逊云的新手,那么我建议读者花一些时间去了解它,然后再通过 AWS 控制台创建核心基础设施。
我想向读者再次提及 Michael 和 Andreas Wittig 撰写的 Amazon Web Services in Action 。在这本书中,他们介绍了大多数亚马逊 Web 服务,并演示了如何使用 CloudFormation(通过示例)自动创建基础设施。
[1] 本书中文版书名《AWS 云计算实战》,由人民邮电出版社出版。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论