20、云服务开发与部署:从API拆分到持续集成

云服务开发与部署:从API拆分到持续集成

一、使用代理将大型API拆分为较小子集

1.1 准备工作

假设我们为一个电商门户工作,该门户有三个模块:男装、女装和童装。我们的目标是采用微服务架构构建后端API,每个微服务相互独立。为此,我们将创建以下函数应用:
- 一个网关组件(函数应用),负责根据路由(/men、/women或/kids)将流量引导至正确的微服务。在这个函数应用中,我们将创建Azure函数代理,通过路由配置重定向流量。
- 三个新的函数应用,每个都作为一个独立的微服务。

1.2 操作步骤

1.2.1 创建微服务
  • 创建三个函数应用,分别对应三个微服务,同时创建网关函数应用。
  • 在每个函数应用中创建匿名HTTP触发器,具体信息如下表:
    | HTTP触发器名称 | 输出消息 |
    | — | — |
    | Men - HttpTrigger | Hello < > - Welcome to the Men Microservice |
    | Women - HttpTrigger | Hello < > - Welcome to the Women Microservice |
    | Kids - HttpTrigger | Hello < > - Welcome to the Kids Microservice |
1.2.2 创建网关代理
  • 导航到网关函数应用,创建一个新的代理。
  • 进入详细信息面板。
  • 创建女装和童装的代理,三个代理的详细信息如下:
    | 代理名称 | 路由模板 | 后端URL(上一步创建的HTTP触发器的URL) |
    | — | — | — |
    | Men | /men | https://azurefunctioncookbook - men.azurewebsites.net/api/Men - HttpTrigger |
    | Women | /women | https://azurefunctioncookbook - women.azurewebsites.netapi/Women - HttpTrigger |
    | Kids | /kids | https://azurefunctioncookbook - kids.azurewebsites.netapi/Kids - HttpTrigger |
    创建完成后,可在Proxies选项卡中查看代理URL:
  • https://azurefunctioncookbook - gateway.azurewebsites.net/Men
  • https://azurefunctioncookbook - gateway.azurewebsites.net/Women
  • https://azurefunctioncookbook - gateway.azurewebsites.net/Kids
1.2.3 测试代理URL

由于HTTP触发器需要一个必需的name参数,因此需要将name查询字符串传递给代理URL。在浏览器中访问以下URL进行测试:
- Men: 对应特定输出
- Women: 对应特定输出
- Kids: 对应特定输出

1.3 注意事项

  • 本示例中创建的所有微服务都是匿名的,即公开可访问。为了确保安全,需要采取相应的安全措施。
  • Azure函数代理允许拦截原始请求,并可根据需要添加新参数传递给后端API,也可添加额外参数将响应返回给客户端应用。更多信息可查看官方文档:https://docs.microsoft.com/azure/azure - functions/functions - proxies 。

1.4 流程总结

graph LR
    A[创建微服务] --> B[创建网关代理]
    B --> C[测试代理URL]

二、将配置项从一个环境迁移到另一个环境

2.1 背景介绍

在开发应用程序时,会有许多配置项(如应用程序设置和连接字符串)存储在Web.Config文件中。在传统的本地环境中,Web.Config文件位于服务器上,所有有权限访问服务器的人都可以访问该文件。虽然可以对Web.Config的所有配置项进行加密,但存在局限性,且每次查看或更新时解密并不容易。在Azure PaaS环境中,Azure应用服务提供了应用程序设置的额外功能,可以手动或通过ARM模板配置这些设置,并且这些设置以加密格式存储,但在有访问权限的情况下可以在门户中以普通文本形式查看。

2.2 准备工作

  • 如果尚未创建函数应用,创建一个名为MyApp - Dev的函数应用。
  • 在MyApp - Dev函数应用中创建一些应用程序设置。
  • 创建另一个函数应用,名为MyApp - Prod。

2.3 操作步骤

  • 导航到MyApp - Dev函数应用的“平台功能”选项卡,点击“资源资源管理器”。
  • 打开资源资源管理器,确保以读写模式打开设置。
  • 点击“config”元素,打开所有与配置相关的项。
  • 在右侧窗口中,可通过点击“编辑”按钮编辑应用程序设置,也可复制从AppSetting0到AppSetting9的所有应用程序设置。
  • 导航到MyApp - Prod函数应用,点击“资源资源管理器”,然后点击“config | appsettings”元素打开现有应用程序设置。
  • 点击“编辑”按钮,粘贴之前复制的内容。审核设置后,点击“PUT”。
  • 导航到MyApp - Prod函数应用的应用程序设置面板,应能看到在资源资源管理器中创建的所有应用程序设置。

2.4 流程总结

graph LR
    A[准备函数应用] --> B[打开MyApp - Dev资源管理器]
    B --> C[复制应用设置]
    C --> D[打开MyApp - Prod资源管理器]
    D --> E[粘贴并更新应用设置]
    E --> F[查看MyApp - Prod应用设置面板]

三、使用Azure DevOps实现和部署持续集成

3.1 引言

软件开发生命周期通常涉及多个环境,如开发、测试和生产环境。对于软件的每次更改,都需要在多个环境中构建和部署应用程序,不同团队可能负责将构建发布到不同环境。为了简化和自动化这些步骤,我们将讨论一些行业中常用的技术,以快速交付软件并减少基础设施需求。

3.2 先决条件

  • 在https://dev.azure.com创建一个Azure DevOps组织,并在该账户中创建一个新项目。创建项目时,选择Git作为版本控制存储库。
  • 将之前开发的Visual Studio项目配置到Azure DevOps。具体步骤可参考:https://docs.microsoft.com/azure/devops/organizations/accounts/set - up - vs?view = azure - devops 。

3.3 连续集成 - 创建构建定义

3.3.1 准备工作
  • 创建一个Azure DevOps账户。
  • 创建一个使用Git的项目。
3.3.2 操作步骤
  • 导航到Azure DevOps账户的“Pipelines”选项卡,点击“Pipelines”,选择“Create Pipeline”开始创建新的构建定义。
  • 点击“Use the classic editor”链接。
  • 在“Select a source”屏幕中,选择Azure Repos Git作为存储库,确保选择正确的项目和存储库。
  • 在“Select a template”步骤中,选择“Azure Functions for .NET”模板,点击“Apply”。
  • 在创建构建步骤中,为管道步骤提供有意义的名称,并在“Agent Specification”下拉列表中选择“vs2017 - win2016”。
  • 在“Get sources”步骤中,根据项目需求选择版本控制系统,选择要构建的存储库。
  • 审核所有字段的值后,点击“Save”,并在弹出窗口中再次点击“Save”。
3.3.3 工作原理

构建定义是构建软件应用程序所需任务的蓝图。在本示例中,我们使用了默认模板创建构建定义,也可以选择空白模板并通过Azure DevOps提供的任务创建定义。运行构建定义时,每个任务将按配置的顺序执行,步骤也可以在管道部分通过拖放进行重新排列。构建过程从从选定的存储库获取源代码、下载所需的NuGet包开始,然后开始构建包。构建完成后,将创建一个包并存储在为build.artifactstagingdirectory目录配置的文件夹中。

3.3.4 额外信息

Azure DevOps提供了许多任务。可以通过点击“Add Task (+)”按钮为模板选择新任务。如果找不到满足需求的任务,可以点击“Marketplace”按钮在市场中搜索合适的任务。

3.4 连续集成 - 手动排队和触发构建

3.4.1 准备工作
  • 按照之前的步骤配置好构建定义。
  • 将所有源代码提交到Azure DevOps团队项目。
3.4.2 操作步骤
  • 导航到名为AzureFunctions - CI的构建定义,点击“Edit”按钮,然后点击右侧的“Queue”按钮。
  • 在弹出窗口中,确保在“Agent Specification”下拉列表中选择“vs2017 - win2016”,然后点击“Queue”按钮。
  • 片刻后,构建将排队并显示消息。
  • 几分钟后构建过程将开始,构建完成后,可通过点击“Agent job 1”查看构建步骤的日志,查看所有任务的状态。

3.5 流程总结

graph LR
    A[创建构建定义] --> B[手动触发构建]
    B --> C[查看构建进度和结果]

四、持续集成中的自动化构建配置与触发

4.1 自动化构建的重要性

在软件开发生命周期中,自动化构建能够显著提高效率,减少人为错误。通过自动化构建,每次代码变更都能及时触发构建过程,确保代码的质量和稳定性。同时,自动化构建还能与后续的测试、部署流程无缝衔接,实现软件的快速交付。

4.2 配置自动化构建

4.2.1 准备工作
  • 确保已经完成构建定义的创建,并且所有源代码都已提交到Azure DevOps团队项目。
  • 确认构建定义中的各项参数和任务配置正确。
4.2.2 操作步骤
  1. 导航到Azure DevOps账户的“Pipelines”选项卡,找到之前创建的构建定义(如AzureFunctions - CI)。
  2. 点击构建定义的名称,进入构建定义的详细页面。
  3. 点击页面右上角的“Edit”按钮,进入编辑模式。
  4. 在左侧的任务列表中,找到“Triggers”任务,点击进入配置页面。
  5. 在“Triggers”页面中,启用“Continuous integration”选项,表示开启持续集成功能。
  6. 可以根据需要配置触发条件,例如选择特定的分支、文件路径等。例如,如果希望只有在主分支有代码变更时才触发构建,可以选择主分支作为触发条件。
  7. 配置完成后,点击“Save”按钮保存配置。

4.3 触发自动化构建

当满足配置的触发条件时,Azure DevOps会自动触发构建过程。例如,当有新的代码提交到指定的分支时,Azure DevOps会立即启动构建任务。以下是自动化构建触发后的执行流程:
1. 获取源代码 :从指定的存储库中获取最新的代码。
2. 下载依赖项 :下载项目所需的NuGet包等依赖项。
3. 构建项目 :编译代码,生成可执行文件或部署包。
4. 执行测试 :如果配置了测试任务,会执行相应的单元测试、集成测试等。
5. 发布构建结果 :将构建生成的包存储到指定的位置,供后续的部署使用。

4.4 流程总结

graph LR
    A[配置自动化构建触发条件] --> B[代码提交满足条件]
    B --> C[自动触发构建]
    C --> D[获取源代码]
    D --> E[下载依赖项]
    E --> F[构建项目]
    F --> G[执行测试]
    G --> H[发布构建结果]

五、在管道中执行单元测试用例

5.1 单元测试的意义

单元测试是软件开发过程中的重要环节,它可以帮助开发人员及时发现代码中的错误和缺陷,提高代码的质量和可维护性。在持续集成的流程中,单元测试能够在每次代码变更后快速验证代码的正确性,确保新的变更不会引入新的问题。

5.2 配置单元测试任务

5.2.1 准备工作
  • 项目中已经编写了单元测试用例,并且使用了支持的测试框架(如NUnit、xUnit等)。
  • 确保构建定义中已经包含了获取源代码和构建项目的任务。
5.2.2 操作步骤
  1. 导航到Azure DevOps账户的“Pipelines”选项卡,找到之前创建的构建定义。
  2. 点击构建定义的名称,进入构建定义的详细页面。
  3. 点击页面右上角的“Edit”按钮,进入编辑模式。
  4. 在左侧的任务列表中,点击“Add Task (+)”按钮,搜索并选择适合项目测试框架的测试任务,例如“Visual Studio Test”。
  5. 配置测试任务的参数,例如指定测试项目的路径、测试框架的版本等。
  6. 可以根据需要配置测试任务的其他选项,如测试结果的输出格式、是否忽略某些测试用例等。
  7. 配置完成后,点击“Save”按钮保存配置。

5.3 执行单元测试

当构建过程启动时,单元测试任务会自动执行。以下是单元测试执行的流程:
1. 构建项目 :首先完成项目的构建,生成可执行的测试程序。
2. 执行测试用例 :运行项目中的所有单元测试用例。
3. 收集测试结果 :收集每个测试用例的执行结果,包括通过、失败或跳过。
4. 生成测试报告 :根据测试结果生成详细的测试报告,方便开发人员查看和分析。

5.4 测试结果分析

如果单元测试中出现失败的用例,开发人员需要及时查看测试报告,定位问题所在,并进行修复。测试报告通常会提供详细的错误信息,包括失败的测试用例名称、错误堆栈跟踪等,帮助开发人员快速找到问题的根源。

5.5 流程总结

graph LR
    A[构建项目] --> B[执行单元测试用例]
    B --> C[收集测试结果]
    C --> D[生成测试报告]
    D --> E{测试是否通过?}
    E -- 是 --> F[继续后续流程]
    E -- 否 --> G[修复代码]
    G --> A

六、创建发布定义

6.1 发布定义的作用

发布定义用于将构建生成的包部署到目标环境(如开发、测试、生产环境等)。通过创建发布定义,可以实现软件的自动化部署,确保每次部署的一致性和可靠性。

6.2 准备工作

  • 已经完成构建定义的创建,并且构建过程能够成功生成部署包。
  • 确定目标环境的相关信息,如目标服务器的地址、部署目录等。

6.3 操作步骤

  1. 导航到Azure DevOps账户的“Pipelines”选项卡,点击“Releases”。
  2. 点击“New release pipeline”按钮,开始创建新的发布定义。
  3. 在“Select a template”步骤中,选择适合项目的模板,例如“Azure Functions Deployment”。
  4. 配置发布定义的基本信息,如名称、描述等。
  5. 在“Artifacts”部分,选择之前创建的构建定义作为发布的源。
  6. 配置部署任务,例如选择目标环境、指定部署的目标服务器、配置部署脚本等。
  7. 可以根据需要添加其他任务,如环境检查、数据迁移等。
  8. 配置完成后,点击“Save”按钮保存发布定义。

6.4 流程总结

graph LR
    A[创建发布定义] --> B[选择构建定义作为源]
    B --> C[配置部署任务]
    C --> D[保存发布定义]

七、自动触发发布

7.1 自动发布的优势

自动触发发布可以实现软件的快速交付,减少人工干预,提高部署的效率和准确性。当构建过程完成并且通过了所有的测试后,自动触发发布可以立即将新的版本部署到目标环境。

7.2 配置自动触发

7.2.1 准备工作
  • 已经完成发布定义的创建,并且相关的部署任务配置正确。
  • 构建定义中已经配置了自动化构建和单元测试任务。
7.2.2 操作步骤
  1. 导航到Azure DevOps账户的“Pipelines”选项卡,找到之前创建的发布定义。
  2. 点击发布定义的名称,进入发布定义的详细页面。
  3. 点击页面右上角的“Edit”按钮,进入编辑模式。
  4. 在左侧的任务列表中,找到“Triggers”任务,点击进入配置页面。
  5. 启用“Continuous deployment trigger”选项,表示开启持续部署功能。
  6. 选择触发条件,例如当构建完成并且通过所有测试后触发发布。
  7. 配置完成后,点击“Save”按钮保存配置。

7.3 发布流程

当满足自动触发条件时,Azure DevOps会自动启动发布过程。以下是发布过程的主要步骤:
1. 获取构建包 :从构建定义的输出中获取最新的部署包。
2. 部署到目标环境 :将部署包部署到指定的目标环境。
3. 验证部署结果 :检查部署是否成功,例如验证应用程序是否能够正常运行。
4. 记录发布信息 :记录发布的相关信息,如发布时间、发布版本等。

7.4 流程总结

graph LR
    A[构建完成且测试通过] --> B[自动触发发布]
    B --> C[获取构建包]
    C --> D[部署到目标环境]
    D --> E[验证部署结果]
    E --> F[记录发布信息]

八、集成Azure Key Vault以配置应用程序机密

8.1 应用程序机密管理的挑战

在软件开发过程中,应用程序通常需要使用一些机密信息,如数据库连接字符串、API密钥等。这些机密信息如果直接存储在代码或配置文件中,会存在安全风险。Azure Key Vault提供了一种安全的方式来存储和管理这些机密信息。

8.2 集成步骤

8.2.1 准备工作
  • 已经创建了Azure Key Vault实例,并在其中存储了所需的机密信息。
  • 应用程序已经部署到Azure环境,并且具有访问Azure Key Vault的权限。
8.2.2 操作步骤
  1. 在应用程序中引用Azure Key Vault :在应用程序的配置文件中,使用特定的语法引用Azure Key Vault中的机密信息。例如,在.NET应用程序中,可以使用以下代码获取机密信息:
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;

var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var secret = await keyVaultClient.GetSecretAsync("https://your-key-vault.vault.azure.net/secrets/your-secret-name");
var secretValue = secret.Value;
  1. 配置访问权限 :确保应用程序具有访问Azure Key Vault的权限。可以通过Azure Active Directory来管理访问权限,为应用程序分配相应的角色和权限。
  2. 更新应用程序配置 :在应用程序的配置文件中,将原来的明文机密信息替换为对Azure Key Vault中机密信息的引用。

8.3 优势总结

  • 安全性 :机密信息存储在Azure Key Vault中,受到严格的访问控制和加密保护,降低了信息泄露的风险。
  • 可管理性 :可以集中管理所有的机密信息,方便进行更新和维护。
  • 灵活性 :应用程序可以动态获取最新的机密信息,无需重新部署。

8.4 流程总结

graph LR
    A[创建Azure Key Vault并存储机密信息] --> B[应用程序引用Key Vault]
    B --> C[配置访问权限]
    C --> D[更新应用程序配置]

通过以上一系列的操作和配置,我们可以实现从API拆分到持续集成和部署的完整流程,提高软件开发和部署的效率和质量,确保软件能够快速、稳定地交付到生产环境。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值