读书笔记《cloud-native-applications-in-java》设计您的云本地应用程序
第 9 章平台部署 - Azure
本章讨论 Microsoft 公共云平台 Azure 的应用程序设计和部署。云原生开发的本质是能够将您的应用程序与云提供商提供的 PaaS 平台集成。作为开发人员,您专注于创造价值(解决客户问题),并允许云提供商为您的应用程序的基础架构承担繁重的工作。
在本章中,我们将学习以下内容:
- Azure 提供的不同类别的 PaaS 服务。我们将更深入地研究我们的示例应用程序将使用的服务。
- 将我们的示例应用程序迁移到 Azure 并了解可用的各种选项。我们还将评估所有选项并了解每个选项的优缺点。
我们正在介绍 Azure 平台,目的是展示如何构建和部署应用程序。我们不会深入介绍 Azure,我们希望读者使用 Azure 文档(https://docs.microsoft.com/en-us/azure/) 到探索其他选项。
Azure 支持多种编程语言,但出于本书的目的,我们正在研究 Azure 中对 Java 应用程序的支持。
天青平台
Azure 在一系列技术领域提供不断增加的 PaaS 和 IaaS。出于我们的目的,我们将查看直接适用于我们的应用程序并使用的区域和服务的子集。
为了便于使用,我创建了这个跨与典型业务应用程序最相关的技术领域的服务分类模型:
这只是一个指示性列表,绝不是一个详尽的列表。有关完整列表,请参阅 Azure 门户。
在前面的分类模型中,我们将服务分为以下几个方面:
- 基础设施:这是 Azure 提供的用于部署和托管我们的应用程序的服务的包罗万象的列表。我们在此类别中结合了跨计算、存储和网络的服务。出于示例 Java 应用程序的目的,我们将查看以下一组服务。
- App Services:我们如何将现有的 Spring Boot 应用程序部署到我们的Azure 平台?这更像是一个提升和转移的场景。这里没有重构应用程序,而是将依赖项部署在 App Services 上。使用其中一种数据库服务,可以部署和托管应用程序。 Azure 提供 PostgreSQL 和 MySQL 作为托管数据库模型以及各种其他选项。
- 容器服务:对于打包成Docker容器的应用,我们可以探索一下如何部署Docker容器到平台。
- Functions:这是无服务器平台模型,您无需担心应用程序托管和部署。您创建一个函数并让平台为您完成繁重的工作。截至目前,基于 Java 的 Azure 云功能处于测试阶段。我们将探索如何在开发环境中创建一个并在本地进行测试。
- Service Fabric:Service Fabric 是一个分布式系统平台,用于部署和管理微服务和容器应用程序。我们将探索如何在 Service Fabric 中部署示例
product
API。
- Application:这是帮助构建分布式应用程序的服务列表。当我们转向分布式微服务模型时,我们需要解耦我们的应用程序组件和服务。 Queue、EventHub、EventGrid 和 API 管理等功能有助于构建一组强大的 API 和服务。
- 数据库:这是 Azure 平台提供的数据存储选项列表。这包括关系、键值、redis 缓存和数据仓库等。
- DevOps:为了在云中构建和部署应用程序,我们需要强大的 CI/CD 工具集的支持。 Visual Studio 团队服务用于托管代码、问题跟踪和自动构建。同样,开源工具仍然不是 Azure 门户中的一等公民。您始终可以使用所需软件的托管版本。
- 安全:云应用的另一个关键因素是安全服务。 Active Directory、权限管理、密钥保管库和多因素身份验证是该领域提供的一些关键服务。
- 移动:如果您正在构建移动应用程序,该平台提供关键服务,例如移动应用程序服务、媒体服务和移动参与服务等在这个领域。
- 分析:在分析领域,该平台通过 HDInsight 和 Data Lake 服务在 MapReduce、Storm、Spark 领域提供强大的服务,用于分析和一个数据存储库。
此外,还有multiple其他技术领域Azure 提供服务——物联网(物联网)、监控、管理、人工智能(AI< /span>),以及认知和企业集成领域。
Azure 平台部署选项
正如我们在上一节中看到的,Azure 提供了许多选项来在平台上构建和部署应用程序。我们将使用我们的 product
API REST 服务示例来检查 Azure 提供的各种选项来部署和运行我们的应用程序。
在开始之前,我假设您熟悉 Azure 平台并且已经在门户中注册。
Azure 支持多种 编程语言,并提供SDK 来支持各个领域的开发。出于我们的目的,我们主要探索 Azure 平台中对 Java 应用程序的支持。
我们将在以下四个方面探索应用托管服务:
- 应用服务
- 容器服务
- 服务结构
- 功能
请参阅以下链接了解 更多详情和getting 开始: https://azure.microsoft.com/en-in/downloads/。
将 Spring Boot API 部署到 Azure 应用服务
在本节中,我们将使用我们的 product
API 服务并将其迁移到 Azure 应用服务。我们将查看对应用程序所做的其他更改,以符合 Azure 应用服务的要求。
我采用了我们在 product API REST 服务9781787124349/3" linkend="ch03">第 3 章,设计您的云原生应用程序。在服务中,我们进行了以下更改:
在项目的根文件夹中添加一个文件 web.config
:
该文件添加了以下更改, product-0.0.1-SNAPSHOT.jar
,这是我们应用程序的包名称。如果您的应用程序名称不同,您将需要进行更改。
我们首先在此处查看 product
API 代码: https://azure.microsoft.com/en-in/downloads/。
我们运行 mvn clean package
命令将项目打包为胖 JAR:
接下来,我们登录 Azure 门户(https://portal.azure.com/)。
- 点击左侧栏中的
App Services
菜单项,如下图所示:
在 Azure 门户中选择 App Services
- 点击
添加
链接:
通过浏览 Azure 门户选择 Web 应用程序 |应用服务 |添加。
- 点击
Create
按钮链接,您应该会看到以下页面
- 我们填写
product
API 的详细信息。我已经填写了App name
asch10product
并将其他选项保留为默认值。
- 接下来,点击页面底部的
创建
按钮。
这将导致应用服务的创建。
- 我们点击
App Services
下的ch10product
,进入菜单:
- 我们点击
Application settings
链接并在下拉菜单中选择以下选项:- 选择
Java 8
作为Java 版本
- 为
Java Minor 版本
选择最新
李> - 为
Web 容器
选择Newest Tomcat 9.0
(此容器实际上不会被使用;Azure 使用捆绑的容器作为 Spring Boot 应用程序的一部分。) - 点击
保存
- 选择
- 接下来,我们点击左侧的
Deployment credentials
链接。这里我们按顺序捕获FTP/deployment username
和Password
为了能够将我们的应用程序推送到主机并单击Save
,如下面的屏幕截图所示:
- 连接到我们在 第 8 步 中看到的 FTP 主机名,并使用您在 第 10 步中保存的凭据em> 登录:
- 接下来,我们将目录更改为远程服务器上的
site/wwwroot
并将 fat JAR 和web.config
传输到该文件夹:
- 我们回到概述部分并重新启动应用程序。我们应该能够启动应用程序并看到我们的 REST API 工作。
在本节中,我们了解了如何获取现有的 REST API 应用程序并将其部署在 Azure 中。这不是最简单和最好的部署方式。这个选项更像是一种提升和转变,我们采用现有的应用程序并尝试将工作负载转移到云中。为了部署 Web 应用程序,Azure 提供了一个 Maven 插件,可以将您的应用程序直接推送到云中。有关详细信息,请参阅以下链接: https://docs.microsoft.com/en-in/java/azure/spring-framework/deploy-spring-boot-java-app-with-maven -插件。
REST API 部署在 Windows Server VM 上。 Azure 正在增加对 Java 应用程序的支持,但它们的强项仍然是 .NET 应用程序。
如果您想使用 Linux 并部署 REST API 应用程序,您可以选择使用基于 Docker 的部署。我们将在下一节介绍基于 Docker 的部署。
将 Docker 容器部署到 Azure 容器服务
让我们部署我们的 Docker 容器应用程序。我为上一节中使用的 product
API 示例创建了 Docker 映像。可以通过 following 命令从 Docker hub 拉取 Docker 镜像:
让我们开始并登录到 Azure 门户。我们应该看到以下内容:
- 点击左侧栏中的
App Services
菜单项。我们应该看到以下屏幕。 点击New 如屏幕截图所示:
- 在
New
搜索Web App for Containers
:
- 选择
Web App for Containers
后,点击Create
如所示:
选择通过导航创建
App Services
| 添加
| 网页应用
- 我们将为我们的
product
API 容器填写详细信息:- 我已经填写了
App Name
和Resource Group
asch10productContainer
其他选项保持默认。 - 在
Configure container
部分,我们选择容器存储库。如果 Docker hub 中已经有 Docker 镜像,请提供镜像拉取标签,cloudnativejava/ch10productapi
。 - 点击页面底部的
确定
。它会验证图像。 - 接下来,我们点击页面底部的
Create
:
- 我已经填写了
通过 Azure 门户导航选择创建 | 新 |搜索
Web App for Containers
- 这将导致应用服务的创建:
通过 Azure 门户导航选择新创建的应用程序容器 | 应用服务
- 我们点击
Appch10productcontainer
"id288599184" class="indexterm"> Services,它将我们带到可以看到标记 URL 的菜单,https:/ /ch10productcontainer.azurewebsites.net
, 容器在哪里可用。
可以访问宿主docker应用的URL
- 我们可以看到我们的
product
API 在浏览器中运行:
这是一种将应用程序部署到云平台的简单方法。在前面的两个场景中,我们都没有使用任何专门的应用程序或数据存储服务。对于真正的云原生应用,我们需要利用提供商提供的平台服务。整个想法是,应用程序可扩展性和可用性方面的繁重工作由本机平台处理。作为开发人员,我们专注于构建关键业务功能并与其他组件集成。
将 Spring Boot API 部署到 Azure Service Fabric
构建应用程序并将其部署到底层 IaaS 平台是大多数组织开始与公共云提供商合作的方式。随着云流程的舒适度和成熟度水平的提高,应用程序开始使用 PaaS 功能构建。因此,应用程序开始由队列、事件、托管数据存储、安全性和平台服务的其他功能组成。
但是对于非功能性需求,尊重 仍然存在一个关键问题。谁会想到应用程序的功能?
- 如何确保有足够的应用程序实例在运行?
- 当实例宕机时会发生什么?
- 应用程序如何根据传入流量向上/向下扩展?
- 我们如何监控所有正在运行的实例?
- 我们如何管理分布式有状态服务?
- 我们如何对已部署的服务进行滚动升级?
编排引擎出现了。 Kubernetes、Mesos 和 Docker swarm 等产品提供了管理应用程序容器的能力。 Azure 已发布 Service Fabric,它是您的应用程序的应用程序/容器管理软件。它可以在本地或云端运行。
Service Fabric 提供以下关键功能:
- 允许您部署可大规模扩展并提供自我修复平台的应用程序
- 允许您安装/部署有状态和无状态的基于微服务的应用程序
- 提供仪表板来监控和诊断应用程序的健康状况
- 定义自动修复和升级策略
在当前版本中,Service Fabric 支持两种底层操作系统——仅 Windows Server 和 Ubuntu 16.04 的风格。最好的选择是 Windows Server 集群,因为支持、工具和文档是最好的。
为了演示 Service Fabric 的功能和用法,我将使用 Ubuntu 映像进行本地测试,并使用 Service Fabric 聚会集群在线部署我们的 product
API 示例Service Fabric 群集。我们还将研究如何扩展应用程序实例,以及 Service Fabric 的自我修复功能。
基本环境设置
- 本地 Service Fabric 群集设置 - 拉取 Docker 映像:
- 使用以下附加设置更新主机上的 Docker 守护程序配置并重新启动 Docker 守护程序:
- 启动从 Docker hub 下拉的 Docker 镜像:
- 在容器外壳中添加以下命令:
完成最后一步后,将启动一个开发 Service Fabric 集群,可以从浏览器访问 http://localhost:19080
。
现在我们需要为容器和来宾可执行文件设置 Yeoman 生成器:
- 接下来,我们从 NPM 安装 Yeoman 模板生成器:
- 接下来,我们安装 Yeoman 生成器,该生成器将用于使用 Yeoman 创建 Service Fabric 应用程序。按着这些次序:
- 要在 macOS、JDK 版本 1.8 和 Gradle 上构建 Service Fabric Java 应用程序,必须在主机上安装该软件。该软件可以使用 Homebrew 安装,如下:
这样就完成了环境设置。接下来,我们将把我们的 product
API 应用程序打包为 Service Fabric 应用程序,以便在集群中进行部署。
打包产品 API 应用程序
我们登录 product
API 项目(完整代码可在: https://github.com/PacktPublishing/Cloud-Native-Applications-in-Java) 并运行以下 命令:
我们应该得到以下屏幕:
我们输入以下值:
这将创建一个包含一组文件的应用程序包:
接下来,我们转到 /ProductServiceFabric/ProductServiceFabric/ProductAPIPkg
文件夹。
创建一个目录 code
并在其中创建一个名为 entryPoint.sh
的文件,其内容如下:
另外,请确保我们将打包的 JAR (product-0.0.1-SNAPSHOT.jar
) 复制到此文件夹中。
笔记
Number of instances of guest binary
的值对于本地环境开发应该是 1
,对于 Service Fabric 群集可以是更大的数字在云端。
接下来,我们将在 Service Fabric 群集中托管我们的应用程序。我们将使用 Service Fabric 聚会集群。
启动 Service Fabric 群集
加入 Linux 集群:
我们将被定向到包含集群详细信息的页面。集群可用一小时。
默认情况下,某些端口是打开的。当我们部署我们的 product
API 应用程序时,我们可以在端口 8080
上访问相同的应用程序:
Service Fabric 群集资源管理器在前面提到的 URL 中可用。由于集群使用基于证书的身份验证,您需要将 PFX 文件导入您的钥匙串。
如果您访问 URL,您可以看到 Service Fabric 群集资源管理器。默认情况下,集群提供三个节点。您可以将多个应用程序部署到集群。根据应用程序设置,集群将管理您的应用程序可用性。
Azure 聚会群集默认视图
将产品 API 应用程序部署到 Service Fabric 群集
为了将我们的 application 部署到集群,我们需要登录到 ProductServiceFabric
为应用程序创建的 Service Fabric 脚手架的文件夹。
连接到 Service Fabric 方群集
由于 Service Fabric 方群集使用基于证书的身份验证,因此我们需要在 /ProductServiceFabric
的工作文件夹中下载 PFX 文件。
运行以下命令:
接下来,我们制作使用隐私增强邮件< /span> (PEM) 文件以连接到 Service Fabric派对集群:
连接到 Service Fabric 群集后,我们需要通过运行以下命令来安装我们的应用程序:
我们应该看到我们的应用程序被上传并部署在集群中:
在 Docker 容器中安装并启动 Service Fabric 群集
上传应用程序后,我们可以在 Service Fabric 资源管理器中看到该应用程序,并且可以访问该应用程序的功能:
观察 Azure Party Cluster 中部署的应用程序
API 功能位于: http://zlnxyngsvzoe.westus.cloudapp.azure.com:8080/product/2
。
验证 API 是否正常工作
我们可以看到当前应用程序是如何部署在一个节点(_lnxvm_2
)上的。如果我们关闭该节点,应用程序实例会自动部署在另一个节点实例上:
从可用的三个主机中观察部署在单个节点上的应用程序
通过选择节点菜单中的选项(在以下屏幕截图中突出显示)来关闭节点(_lnxvm_2
):
观察可用于禁用 Azure 聚会群集中主机上的应用程序的选项
立即,我们可以看到应用程序部署在节点 _lnxvm_0
作为 Cluster
的自我修复模型强>:
使用 Service Fabric 群集在另一个节点上启动在一种模式下禁用的应用程序
再次,我希望读者有足够的兴趣继续探索集群的功能。对 Java 应用程序和多个版本的 Linux 的支持是有限的。 Azure 正在努力为平台添加额外的支持,以支持各种应用程序。
Azure 云功能
随着我们将应用程序迁移到云端,我们正在使用平台服务来提高我们对业务功能的关注,而不是担心应用程序可扩展性。无服务器应用程序是下一个前沿领域。开发人员专注于构建应用程序,而不用担心服务器配置、可用性和可伸缩性。
Java 函数目前处于测试阶段,在 Azure 门户上不可用。
我们可以下载并尝试创建 Java 函数on 我们的本地机器。我们将看到该功能的简要预览。
构建和运行 Java 函数
接下来,我们可以按如下方式运行该函数:
我们可以在下图中看到该函数的启动:
构建您的 Java 云函数
默认功能可在以下 URL 获得:
如果我们去 http://localhost:7071/api/hello?name=cloudnative
我们可以看到函数的输出:
潜入代码
如果我们深入代码,我们可以看到主要代码 file 其中默认函数 你好
定义为:
该方法使用 @HttpTrigger
进行注释,其中我们定义了触发器的名称、允许的方法、使用的授权模型等。
编译函数时,它会生成一个 function.json
,其中定义了函数绑定:
您可以看到输入和输出数据绑定。函数只有一个触发器。触发器与一些相关数据一起触发,这些数据通常是触发函数的有效负载。
输入和输出绑定是一种从代码中连接到数据的声明性方式。绑定是可选的,一个函数可以有多个输入和输出绑定。
您可以使用 Azure 门户开发函数。触发器和绑定直接在 function.json
文件中配置。
Java 函数仍然是一个预览特性。该功能集仍处于测试阶段,文档很少。我们需要等待 Java 成为 Azure Functions 世界的一等公民。
这使我们结束了使用 Azure 进行平台开发。
概括
在本章中,我们看到了 Azure 云平台提供的各种功能和服务。当我们将应用程序转变为云原生模型时,我们会从应用程序服务 |集装箱服务 |服务结构 |无服务器模型(云功能)。当我们构建新的应用程序时,我们跳过最初的步骤,直接采用平台服务,允许自动应用程序可扩展性和可用性管理。
在下一章中,我们将介绍各种类型的 XaaS API,包括 IaaS、PaaS、iPaaS 和 DBaaS。我们将在构建您自己的 XaaS 时涵盖架构和设计问题。