读书笔记《cloud-native-applications-in-java》平台部署-Azure
本章讨论 Microsoft 公共云平台 Azure 的应用程序设计和部署。云原生开发的本质是能够将您的应用程序与云提供商提供的 PaaS 平台集成。作为开发人员,您专注于创造价值(解决客户问题),并允许云提供商为您的应用程序的基础架构承担繁重的工作。
在本章中,我们将学习以下内容:
- Different categories of PaaS services provided by Azure. We will delve a little deeper into services that will be used by our sample applications.
- Migrate our sample application to Azure and understand the various options available. We will also evaluate all the options and understand the pros and cons for each option.
我们正在介绍 Azure 平台,目的是展示如何构建和部署应用程序。我们不会深入介绍 Azure,我们希望读者使用 Azure 文档(https://docs.microsoft.com/en-us/azure/) 到探索其他选项。
Azure 支持多种编程语言,但出于本书的目的,我们正在研究 Azure 中对 Java 应用程序的支持。
Azure 在一系列技术领域提供不断增加的 PaaS 和 IaaS。出于我们的目的,我们将查看直接适用于我们的应用程序并使用的区域和服务的子集。
为了便于使用,我创建了这个跨与典型业务应用程序最相关的技术领域的服务分类模型:
这只是一个指示性列表,绝不是一个详尽的列表。有关完整列表,请参阅 Azure 门户。
在前面的分类模型中,我们将服务分为以下几个方面:
- Infrastructure: This is an all-encompassing list of services provided by Azure to deploy and host our applications. We have combined services across compute, storage, and networking in this category. We will be looking at the following set of services for the purpose of our sample Java applications.
- App Services: How can we take the existing Spring Boot applications and deploy them in our Azure platform? This is more of a lift and shift scenario. Here the application is not refactored, but the dependencies are deployed on App Services. Using one of the database services, the application can be deployed and hosted. Azure provides PostgreSQL and MySQL as hosted database models among a variety of other options.
- Container Services: For applications packaged as Docker containers, we can explore how to deploy Docker containers to the platform.
- Functions: This is the serverless platform model, where you need not worry about application hosting and deployment. You create a function and let the platform do the heavy lifting for you. As of now, Java-based Azure cloud functions are in beta. We will explore how to create one in a development environment and test locally.
- Service Fabric: Service Fabric is a distributed systems platform for deploying and managing microservices and container applications. We will explore how we can deploy our sample
product
API in Service Fabric.
- Application: This is a list of services that help build distributed applications. As we move to a distributed microservices model, we need to decouple our application component and services. Features such as Queue, EventHub, EventGrid, and API management help build a cohesive set of robust APIs and services.
- Database: This is a list of data store options provided by the Azure platform. This includes relational, key value, redis cache, and data warehouse among others.
- DevOps: For building and deploying applications in the cloud, we need the support of robust CI/CD toolsets. Visual Studio team services are provided for hosting code, issue tracking, and automated builds. Again, open source tools are still not first-class citizens in the Azure portal. You can always use hosted versions of the required software.
- Security: Another key factor for cloud applications are security services. Active directory, rights management, key vault, and multi-factor authentication are some of the key services provided in this area.
- Mobile: If you are building mobile applications, the platform provides key services such as application services for mobile, media services, and mobile engagement services, among others in this area.
- Analytics: In the area of analytics, the platform provides robust services in the areas of MapReduce, Storm, Spark through HDInsight and Data Lake services for analytics and a data repository.
此外,还有multiple其他技术领域Azure 提供服务——物联网(物联网)、监控、管理、人工智能(AI< /span>),以及认知和企业集成领域。
正如我们在上一节中看到的,Azure 提供了许多选项来在平台上构建和部署应用程序。我们将使用我们的 product
API REST 服务示例来检查 Azure 提供的各种选项来部署和运行我们的应用程序。
在开始之前,我假设您熟悉 Azure 平台并且已经在门户中注册。
Azure 支持多种 编程语言,并提供SDK 来支持各个领域的开发。出于我们的目的,我们主要探索 Azure 平台中对 Java 应用程序的支持。
我们将在以下四个方面探索应用托管服务:
- App Services
- Container Services
- Service Fabric
- Functions
请参阅以下链接了解 更多详情和getting 开始: https://azure.microsoft.com/en-in/downloads/。
在本节中,我们将使用我们的 product
API 服务并将其迁移到 Azure 应用服务。我们将查看对应用程序所做的其他更改,以符合 Azure 应用服务的要求。
我采用了我们在Chapter 3中构建的product
API REST服务,< span class="emphasis">设计您的云原生应用程序。在服务中,我们进行了以下更改:
在项目的根文件夹中添加一个文件 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/)。
- Click on the
App Services
menu item in the left-hand column as shown in the following screenshot:
在 Azure 门户中选择 App Services
- Click on the
Add
link:
通过浏览 Azure 门户选择 Web 应用程序 |应用服务 |添加。
- Click on the
Create
button link and you should see the following page
- We fill in the details for our
product
API. I have filled inApp name
asch10product
and left the other options at the default.
- Next, click the
Create
button at the bottom of the page.
这将导致应用服务的创建。
- We click on the
ch10product
underApp Services
, which takes us to the menu:
- We click on the
Application settings
link and select the following options in the drop-down menu:- Choose
Java 8
for theJava version
- Choose
Newest
for theJava Minor version
- Choose
Newest Tomcat 9.0
for theWeb container
(This container will not actually be used; Azure uses the container bundled as part of the Spring Boot application.) - Click
Save
- Choose
- Next, we click on the
Deployment credentials
link on the left-hand side. Here we capture theFTP/deployment username
andPassword
in order to be able to push our application to the host and click onSave
as shown in the following screenshot:
- Connect to the FTP hostname we saw in Step 8 and use your credentials saved in Step 10 to log in:
- Next, we change directory to
site/wwwroot
on the remote server and transfer the fat JAR andweb.config
to the folder:
- We go back to the overview section and restart the application. We should be able to start the application and see our REST API working.
在本节中,我们了解了如何获取现有的 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 容器应用程序。我为上一节中使用的 product
API 示例创建了 Docker 映像。可以通过 following 命令从 Docker hub 拉取 Docker 镜像:
让我们开始并登录到 Azure 门户。我们应该看到以下内容:
- Click on the
App Services
menu item in the left-hand column. We should see the following screen. Click onNew as indicated in the screenshot:
- Under
New
search forWeb App for Containers
:
- Once the
Web App for Containers
is selected, click onCreate
as indicated:
选择通过导航创建
App Services
| 添加
| 网页应用
- We will fill in the details for our
product
API container:- I have filled in the
App Name
andResource Group
asch10productContainer
and left the other options at the default. - In the
Configure container
section, we select the container repository. If there is already a Docker image in Docker hub, provide the image pull tag,cloudnativejava/ch10productapi
. - Click
OK
at the bottom of the page. It validates the image. - Next, we click
Create
at the bottom of the page:
- I have filled in the
通过 Azure 门户导航选择创建 | 新 |搜索
Web App for Containers
- This leads to the creation of the App Service:
通过 Azure 门户导航选择新创建的应用程序容器 | 应用服务
可以访问宿主docker应用的URL
- We can see our
product
API running in the browser:
这是一种将应用程序部署到云平台的简单方法。在前面的两个场景中,我们都没有使用任何专门的应用程序或数据存储服务。对于真正的云原生应用,我们需要利用提供商提供的平台服务。整个想法是,应用程序可扩展性和可用性方面的繁重工作由本机平台处理。作为开发人员,我们专注于构建关键业务功能并与其他组件集成。
构建应用程序并将其部署到底层 IaaS 平台是大多数组织开始与公共云提供商合作的方式。随着云流程的舒适度和成熟度水平的提高,应用程序开始使用 PaaS 功能构建。因此,应用程序开始由队列、事件、托管数据存储、安全性和平台服务的其他功能组成。
但是对于非功能性需求,尊重 仍然存在一个关键问题。谁会想到应用程序的功能?
- How do I make sure there are enough application instances running?
- What happens when an instance goes down?
- How does the application scale up/down depending on the incoming traffic?
- How do we monitor all the running instances?
- How do we manage distributed stateful services?
- How do we perform rolling upgrades to the deployed services?
编排引擎出现了。 Kubernetes、Mesos 和 Docker swarm 等产品提供了管理应用程序容器的能力。 Azure 已发布 Service Fabric,它是您的应用程序的应用程序/容器管理软件。它可以在本地或云端运行。
Service Fabric 提供以下关键功能:
- Allows you to deploy applications that can scale massively and provide a self-healing platform
- Allows you to install/deploy both stateful and stateless microservice-based applications
- Provides dashboards to monitor and diagnose the health of applications
- Defines policies for automatic repair and upgrades
在当前版本中,Service Fabric 支持两种底层操作系统——仅 Windows Server 和 Ubuntu 16.04 的风格。最好的选择是 Windows Server 集群,因为支持、工具和文档是最好的。
为了演示 Service Fabric 的功能和使用,我将使用 Ubuntu 映像进行本地测试,并使用 Service Fabric 聚会集群在线部署我们的 product
API 示例Service Fabric 群集。我们还将研究如何扩展应用程序实例,以及 Service Fabric 的自我修复功能。
- Local Service Fabric cluster setup—pull a Docker image:
- Update the Docker daemon configuration on your host with the following additional settings and restart the Docker daemon:
- Start the Docker image pulled down from Docker hub:
- Add the following commands within the container shell:
完成最后一步后,将启动一个开发 Service Fabric 集群,可以从浏览器访问 http://localhost:19080
。
现在我们需要为容器和来宾可执行文件设置 Yeoman 生成器:
- Next, we install the Yeoman template generator from NPM:
- Next, we install the Yeoman generator that will be used to create Service Fabric applications by using Yeoman. Follow these steps:
- To build a Service Fabric Java application on macOS, JDK version 1.8, and Gradle, the software must be installed on the host machine. The software can be installed by using Homebrew, as follows:
这样就完成了环境设置。接下来,我们将把我们的 product
API 应用程序打包为 Service Fabric 应用程序,以便在集群中进行部署。
我们登录 product
API 项目(完整代码可在: https://github.com/PacktPublishing/Cloud-Native-Applications-in-Java) 并运行以下 命令:
我们应该得到以下屏幕:
我们输入以下值:
这将创建一个包含一组文件的应用程序包:
接下来,我们转到 /ProductServiceFabric/ProductServiceFabric/ProductAPIPkg
文件夹。
创建一个目录 code
并在其中创建一个名为 entryPoint.sh
的文件,其内容如下:
另外,请确保我们将打包的 JAR (product-0.0.1-SNAPSHOT.jar
) 复制到此文件夹中。
接下来,我们将在 Service Fabric 群集中托管我们的应用程序。我们将使用 Service Fabric 聚会集群。
加入 Linux 集群:
我们将被定向到包含集群详细信息的页面。集群可用一小时。
默认情况下,某些端口是打开的。当我们部署我们的 product
API 应用程序时,我们可以在端口 8080
上访问相同的应用程序:
Service Fabric 群集资源管理器在前面提到的 URL 中可用。由于集群使用基于证书的身份验证,您需要将 PFX 文件导入您的钥匙串。
如果您访问 URL,您可以看到 Service Fabric 群集资源管理器。默认情况下,集群提供三个节点。您可以将多个应用程序部署到集群。根据应用程序设置,集群将管理您的应用程序可用性。
Azure 聚会群集默认视图
为了将我们的 application 部署到集群,我们需要登录到 ProductServiceFabric
为应用程序创建的 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 正在努力为平台添加额外的支持,以支持各种应用程序。
随着我们将应用程序迁移到云端,我们正在使用平台服务来提高我们对业务功能的关注,而不是担心应用程序可扩展性。无服务器应用程序是下一个前沿领域。开发人员专注于构建应用程序,而不用担心服务器配置、可用性和可伸缩性。
Java 函数目前处于测试阶段,在 Azure 门户上不可用。
我们可以下载并尝试创建 Java 函数on 我们的本地机器。我们将看到该功能的简要预览。
接下来,我们可以按如下方式运行该函数:
我们可以在下图中看到该函数的启动:
构建您的 Java 云函数
默认功能可在以下 URL 获得:
如果我们去 http://localhost:7071/api/hello?name=cloudnative
我们可以看到函数的输出:
如果我们深入代码,我们可以看到主要代码 file 其中默认函数 你好
定义为:
该方法使用 @HttpTrigger
进行注释,其中我们定义了触发器的名称、允许的方法、使用的授权模型等。
编译函数时,它会生成一个 function.json
,其中定义了函数绑定:
您可以看到输入和输出数据绑定。函数只有一个触发器。触发器与一些相关数据一起触发,这些数据通常是触发函数的有效负载。
输入和输出绑定是一种从代码中连接到数据的声明性方式。绑定是可选的,一个函数可以有多个输入和输出绑定。
您可以使用 Azure 门户开发函数。触发器和绑定直接在 function.json
文件中配置。
Java 函数仍然是一个预览特性。该功能集仍处于测试阶段,文档很少。我们需要等待 Java 成为 Azure Functions 世界的一等公民。
这使我们结束了使用 Azure 进行平台开发。