微服务部署:从基础设施搭建到自动化流水线构建
在当今的软件开发领域,微服务架构因其灵活性和可扩展性而备受青睐。要成功部署微服务,需要搭建合适的基础设施,并建立有效的构建和部署流水线。本文将详细介绍如何在亚马逊云(AWS)上部署微服务,包括数据库、缓存集群和容器集群的创建,以及手动和自动化部署的方法。
1. 基础设施搭建
1.1 创建 Amazon RDS/PostgreSQL 数据库
首先,我们需要创建一个 Amazon RDS/PostgreSQL 数据库。创建过程可能需要几分钟时间,完成后,需要配置 Eagle Eye 服务以使用该数据库。为每个需要访问 Amazon 基础 PostgreSQL 数据库的微服务创建一个名为 aws - dev 的新应用程序配置文件,并在 Spring Cloud Config GitHub 存储库中添加包含 Amazon 数据库连接信息的新配置文件。
1.2 创建 Redis 集群
使用 Amazon ElastiCache 服务来创建 Redis 集群,步骤如下:
1. 导航回 AWS 控制台主页,点击 ElastiCache 链接。
2. 从 ElastiCache 控制台中选择 Redis 链接,然后点击屏幕顶部的蓝色“Create”按钮,弹出创建向导。
3. 填写相关数据后点击“Create”按钮,Amazon 将开始创建 Redis 集群,此过程需要几分钟。创建完成后,点击集群名称可查看集群使用的端点。
由于只有许可服务使用 Redis,因此在将代码示例部署到自己的 Amazon 实例时,需适当修改许可服务的 Spring Cloud Config 文件。
1.3 创建 ECS 集群
在部署 EagleEye 服务之前,需要设置一个 Amazon ECS 集群,步骤如下:
1. 进入 Amazon AWS 控制台,点击 Amazon EC2 Container Service 链接。
2. 在主 EC2 容器服务页面点击“Getting Started”按钮,进入“Select options to Configure”屏幕,取消勾选两个复选框并点击“Cancel”按钮,不使用 ECS 提供的预定义模板向导。
3. 在 ECS 主页点击“Clusters”选项卡,然后点击“Create Cluster”按钮。
4. 在“Create Cluster”屏幕中,定义基本集群信息,包括集群名称、运行集群的 Amazon EC2 虚拟机大小、运行的实例数量以及为集群中每个节点分配的弹性块存储(EBS)磁盘空间。
5. 设置网络配置,选择 Amazon 虚拟专用云(VPC),通常选择默认 VPC,因为它包含数据库服务器和 Redis 集群。同时,选择 VPC 中的子网以允许 ECS 集群访问。
6. 选择创建新的安全组或选择现有的 Amazon 安全组应用于新的 ECS 集群。由于运行 Zuul,配置新安全组允许所有来自端口 5555 的入站流量。
7. 让 ECS 向导为运行在服务器上的 ECS 容器代理创建一个 IAM 角色,名为 ecsInstanceRole。
创建完成后,点击“View Cluster”按钮查看集群状态。此时,你已拥有成功部署 EagleEye 微服务所需的所有基础设施。
2. 手动部署 EagleEye 服务
使用 Amazon ECS 命令行客户端(https://github.com/aws/amazon - ecs - cli)手动部署 EagleEye 服务,步骤如下:
1.
配置 ecs - cli 运行时环境
:
- 配置 ECS 客户端的 Amazon 凭证。
- 选择客户端工作的区域。
- 定义 ECS 客户端将使用的默认 ECS 集群。
执行以下命令进行配置:
ecs - cli configure --region us - west - 1 \
--access - key $AWS_ACCESS_KEY \
--secret - key $AWS_SECRET_KEY \
--cluster spmia - tmx - dev
这里使用环境变量
$AWS_ACCESS_KEY
和
$AWS_SECRET_KEY
来保存 Amazon 访问和秘密密钥。
-
构建服务
:
设置环境变量$BUILD_NAME来标记构建脚本创建的 Docker 镜像,然后执行 Maven 构建:
export BUILD_NAME = TestManualBuild
mvn clean package docker:build
-
部署 Docker 镜像
:
执行以下命令将 Docker 镜像部署到之前设置的 ECS 实例:
ecs - cli compose --file docker/common/docker - compose.yml up
-
验证服务运行状态
:
执行ecs - cli ps命令验证服务是否运行,并发现服务器的 IP 地址。输出中可以看到部署的 Docker 容器数量、ECS 集群的 IP 地址,虽然显示有其他端口映射,但实际上只有端口 5555 对外部开放。
3. 构建和部署流水线架构
构建和部署流水线的目标是提供可定制的工作流程,实现代码编译、打包和部署的自动化。其架构基于持续集成(CI)和持续交付(CD)模式,主要步骤如下:
1. 开发者将服务代码提交到源代码仓库。
2. 构建/部署引擎监控源代码仓库的更改,检测到更改后签出代码并运行构建脚本。
3. 编译代码,运行单元和集成测试,将服务编译为可执行工件(如 JAR 文件)。
4. 构建虚拟机镜像(容器),将微服务和运行时引擎安装到镜像中。
5. 在正式部署到新环境之前,启动机器镜像并运行一系列平台测试,以确保一切正常。如果测试通过,将机器镜像提升到新环境。
6. 在服务提升到下一个环境之前,必须运行该环境的平台测试,并且始终使用相同的机器镜像进行部署,以保证服务器的不可变性。
以下是构建和部署流水线的主要步骤流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke - width:2px;
A(开发者提交代码):::process --> B(构建/部署引擎监控):::process
B --> C(编译代码、运行测试):::process
C --> D(创建可执行工件):::process
D --> E(构建机器镜像):::process
E --> F(运行平台测试):::process
F -->|通过| G(部署到新环境):::process
G --> H(提升到下一个环境):::process
H --> I(运行下一个环境的平台测试):::process
I -->|通过| J(最终部署):::process
4. 测试类型
在构建和部署过程中,通常有三种类型的测试:
| 测试类型 | 测试时机 | 测试目的 | 特点 |
| ---- | ---- | ---- | ---- |
| 单元测试 | 服务代码编译之前 | 独立测试单个方法或函数,无第三方依赖 | 小而聚焦 |
| 集成测试 | 服务代码打包之后 | 测试整个工作流,模拟第三方服务调用 | 模拟第三方依赖 |
| 平台测试 | 服务部署到环境之前 | 测试整个业务流程,调用生产系统中的所有第三方依赖 | 真实环境测试 |
5. 核心模式
构建/部署过程基于以下四个核心模式:
-
持续集成/持续交付(CI/CD)
:应用程序代码不仅在提交时进行构建和测试,还会持续部署。如果代码通过单元、集成和平台测试,应立即提升到下一个环境,大多数组织的唯一停止点是推送到生产环境。
-
基础设施即代码
:最终推送到开发及后续环境的软件工件是机器镜像,通过一系列脚本在每次构建时进行配置,构建后不再有人为干预,脚本像其他代码一样进行版本控制。
-
不可变服务器
:服务器镜像构建后,配置不再更改,避免“配置漂移”问题。如果需要更改,修改配置脚本并启动新的构建。
-
Phoenix 服务器
:基于不可变服务器的概念,服务器可以从机器镜像中杀死并重新启动,而不会改变服务或微服务的行为。
通过以上步骤和模式,我们可以在 Amazon 云上成功部署微服务,并建立高效的构建和部署流水线,实现代码的快速迭代和稳定交付。
微服务部署:从基础设施搭建到自动化流水线构建
6. 调试 ECS 容器问题
ECS 调试容器启动或运行问题的工具较为有限。若遇到 ECS 部署的服务无法启动或持续运行的问题,需要通过 SSH 登录到 ECS 集群查看 Docker 日志,具体操作步骤如下:
1. 在 ECS 集群运行的安全组中添加端口 22。
2. 使用在集群设置时定义的 Amazon 密钥对,以
ec2-user
身份 SSH 登录到服务器。
3. 在服务器上运行
docker ps
命令,获取所有正在运行的 Docker 容器列表。
4. 定位需要调试的容器镜像后,运行
docker logs –f <<container id>>
命令,查看目标 Docker 容器的日志。
虽然这是一种较为原始的调试方法,但有时直接查看服务器的控制台输出就能发现问题所在。
7. 自动化部署的重要性及实现思路
手动部署虽然能帮助我们理解服务部署的机制,但不具有可持续性,因此自动化部署是最终目标。自动化部署可以将人类从繁琐的部署工作中解放出来,真正实现微服务的设计、构建和部署到云端的全流程自动化。
要实现自动化部署,可借助 Amazon 的 CloudFormation 脚本 DSL 或 HashiCorp 的 Terraform 等云基础设施脚本工具。这些工具能将基础设施的创建过程脚本化,避免手动操作带来的错误和不一致性。
8. 自动化部署的实践步骤
若要使用 Amazon ECS 命令行客户端实现自动化部署,可参考以下步骤:
1.
环境配置自动化
:
将配置 ECS 客户端的命令集成到自动化脚本中,例如:
ecs-cli configure --region us-west-1 \
--access-key $AWS_ACCESS_KEY \
--secret-key $AWS_SECRET_KEY \
--cluster spmia-tmx-dev
可将环境变量
$AWS_ACCESS_KEY
和
$AWS_SECRET_KEY
存储在安全的配置文件或密钥管理系统中,在脚本运行时动态获取。
-
构建过程自动化
:
使用自动化工具(如 Jenkins、GitLab CI/CD 等)触发 Maven 构建命令,例如:
export BUILD_NAME=TestAutomatedBuild
mvn clean package docker:build
将这些命令配置到自动化任务中,当代码仓库有新的提交时,自动执行构建操作。
-
部署过程自动化
:
将部署 Docker 镜像到 ECS 实例的命令集成到自动化脚本中:
ecs-cli compose --file docker/common/docker-compose.yml up
在构建完成后,自动化工具自动执行该命令完成部署。
9. 自动化部署的优势
自动化部署具有以下显著优势:
-
提高效率
:减少手动操作的时间和错误,加快代码的部署速度,实现快速迭代。
-
保证一致性
:每次部署都使用相同的脚本和配置,确保不同环境的部署结果一致。
-
增强可靠性
:减少人为因素的干扰,降低因人为错误导致的部署失败风险。
-
便于监控和回滚
:自动化部署可以集成监控工具,实时监测部署状态,并且在出现问题时能够快速回滚到上一个稳定版本。
以下是自动化部署的主要步骤流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(代码提交):::process --> B(自动化工具触发):::process
B --> C(环境配置):::process
C --> D(代码构建):::process
D --> E(镜像创建):::process
E --> F(部署到 ECS):::process
F --> G(监控与验证):::process
G -->|成功| H(完成部署):::process
G -->|失败| I(回滚操作):::process
I --> D(重新构建):::process
10. 总结
通过本文的介绍,我们了解了在 Amazon 云上部署微服务的完整流程,包括基础设施搭建、手动部署、构建和部署流水线架构、测试类型以及核心模式等内容。同时,也强调了自动化部署的重要性和实现思路。
在实际应用中,我们应根据自身需求和团队技术栈选择合适的工具和方法,逐步实现微服务部署的自动化和标准化。通过持续集成和持续交付的实践,提高软件开发的效率和质量,确保微服务系统的稳定运行和快速迭代。
希望本文能为你在微服务部署方面提供有益的参考和指导,帮助你更好地应对云环境下的软件开发挑战。
超级会员免费看
685

被折叠的 条评论
为什么被折叠?



