Azure 上的 Java:云原生服务简介





5.00/5 (3投票s)
在第一篇文章中,我们将向您介绍云原生应用程序的概念以及为什么应该使用它们。
这是系列文章中的第一篇,该系列文章将阐述 Brendan Burns 的书籍《Designing Distributed Systems》(O’Reilly 出版)第 8 章中的思想,该书可从 Microsoft 处免费获取。目标是向您展示如何将单体三层 Web 应用程序迁移到集成了服务的用户界面,以及如何使用无服务器函数托管这些服务。
为了演示这一点的好处,我们将向您展示如何使用 Azure Dev/Ops 平台及其管道来实现两个微服务。一个用于投票,一个用于获取报告。这些微服务使用无服务器 Azure Functions。这些服务部署在 Azure 平台上。由于它们运行在 消耗计划上,因此直到收到 HTTP 请求时才会发送到服务器。这意味着硬件资源不会专用于其运行。您将能够修改和扩展这些服务,亲自了解它们的工作原理。而且,您将能够探索 Azure 平台上可用的工具服务。
尽管在此项目中我们不使用 Cosmos DB,但您可以将其作为练习自行迁移。
在第一篇文章中,我们将向您介绍云原生应用程序的概念以及为什么应该使用它们。我们还将解释如何将三层 Web 应用程序迁移到云原生平台,如何设置项目以及需要哪些支持工具和应用程序。
在第二篇文章中,您将在一个 组织中创建三个项目。本文演示了如何在组织中创建和添加一个项目。您将重复这些步骤来创建和添加另外两个项目。
在第三篇文章中,您将创建类似于 Facebook 页面上的简单投票。该应用程序提供选举标题、投票期间的开始和结束日期、一组投票选项以及包含结果的报告。
在本系列文章中,我们将简要介绍容器化和 Kubernetes,但您不需要具备 Kubernetes 使用方面的专业知识。但是,如果您想了解更多关于 Kubernetes 的信息,可以阅读这些文章
- Kubernetes Bundle | Microsoft Azure
- Hands-On Kubernetes on Azure | Microsoft Azure
- DevOps
- 持续集成/持续交付 (CI/CD)
- 微服务
- 无服务器应用程序
- 容器化
- Docker 是一个用于构建应用程序容器的平台
- 云数据库
- MySQL Workbench
“云原生”是什么意思?
“云原生”一词适用于分布在多个平台并可以通过共享或公共网络进行交互的服务。它也可以应用于旨在运行在“本地外部”资源上并使用这些服务的应用程序。
云原生应用程序只包含完成特定工作所需的功能。它依赖外部服务进行专门支持。相比之下,单体、传统的三层 Web 应用程序假定它们运行在特定的网络架构和特定的支持服务上。例如,Internet Information Services v10、SQL Server 2019 和 .NET Framework 4.5。它们还假定每个应用程序都带来了自己的动态链接库 (DLL) 集来支持服务器处理。
在非云原生设计的应用程序中,应用程序的所有功能组件都包含在内,但它们并不总是清晰定义或分离的。在云原生应用程序中,功能组件是分离的。例如,云原生应用程序使用服务接口调用服务来获取购物车中的项目列表,而不是直接执行对特定数据库服务器的查询。数据库操作会发生,但它隐藏在服务内部,应用程序不知道也不关心它是如何完成的。
云原生设计基于“关注点分离”原则。此原则要求软件只执行执行任务所需的最少操作。软件不应执行可以委派给其他服务的操作。例如,获取用户数据的应用程序接口应该将数据存储委派给其他服务,而不是自己存储数据。
有关此主题的更多信息,请参阅架构原则。
为什么选择云原生?
我们将运行在单个固定环境中的紧耦合服务分解为分布在多个处理器上的松耦合服务集,这样做有什么好处?由于用户界面隐藏了应用程序和服务之间的连接,因此云平台可能在没有服务请求到达之前不会运行该服务的实例。这减少了对物理服务器的需求。
服务只需支持与用户界面的连接。如果需要,界面可以请求更多服务实例。例如,处理身份验证的最佳方式是与用户界面一起进行,因为用户界面是必须接受或拒绝身份验证请求的服务。用户的身份可以传递给服务,从而允许服务授权使用特定功能。这意味着服务不依赖于特定版本的操作系统或正在使用的身份验证方法。
这使得服务能够以轻量级的 容器形式交付。当所有服务都在容器中运行时,可以使用 Kubernetes 等编排服务来监视和管理这些容器。这确保它们始终运行,并且有足够的活动实例来满足需求。
设计和构建具有面向服务体系结构的应用程序意味着您可以自由地将每个服务定位在最能满足该服务要求的平台上。例如,如果您的 SQL 数据库无法处理事务量,您可以将其移至像 Cosmos DB 这样的“非关系型 SQL”(NoSQL)数据库。只要不更改接口,应用程序就会继续工作。或者,如果您需要在凌晨 3 点更新身份验证服务以修复登录安全漏洞。您可以更新身份验证服务,让用户界面保持传入连接的活动状态。同时,您可以终止到身份验证器的连接,停止所有正在运行的服务,然后重新启动连接。这将自动重启新版本。对用户来说,这是看不见的。然后,您就可以好好睡一觉了。
如何实现?
迁移到 Microsoft Azure 等云服务的原因有很多,但您如何才能到达那里?“那里”又在哪里?让我们来看一些可以回答这些问题的技术
- DevOps 是将开发与运维支持需求相结合的流程和支持工具,从而使部署和运维成为开发过程的一部分。
- 持续集成/持续交付 (CI/CD) 是用于快速可靠地构建和部署应用程序新版本的流程。
- 微服务是轻量级、专注的、通常是无状态的服务,通常使用 HTTP 请求访问。
- 无服务器是一种按需部署应用程序的方法,不需要专用服务器。
- 容器化是一种打包应用程序的方法,其中每个应用程序都与一个隔离应用程序与实际机器的虚拟机进行交互。这使得应用程序可以在不更新任何应用程序参数的情况下进行移动。
- Docker 是一个用于构建应用程序容器的平台。
- Kubernetes 是一个用于加载、运行和监视容器的平台,
- 可扩展的云数据库(如 Cosmos DB)是能够处理极高事务量的数据库。它们通常是 NoSQL 数据库,并且能够捕获事务的完整历史记录(例如,跟踪购物车的所有更改)。
现在您已经熟悉了这些工具,我们可以说“到达那里”意味着使用这些工具创建集成服务的应用程序,而不是实现它们。这类似于 Mashups,后者从许多外部服务获取信息。Mashups 是独立的外部函数集合,它们通过少量专用代码(通常由脚本提供)组合在一起。每个服务提供一个专注的处理或数据集,应用程序在它们之间传递数据来完成工作。
要做到这一点,您必须将应用程序划分为服务和消费者。也就是说,识别提供信息的代码部分(如数据库),以及使用信息的代码部分(如用户界面)。然后查看服务和消费者之间的集成代码,以识别“服务层接口”。这将成为您的无状态服务 API 的基础。
接下来,决定如何通过集成服务来重新实现您的应用程序。请记住您将如何存储应用程序状态信息以及如何控制对服务的访问。
最后,您需要确定如何部署每个服务,以便您可以随时更新任何服务,而不会中断应用程序的整体运行。之所以需要这样做,部分原因是您不再知道谁在调用某个服务或何时连接到它,因为该连接已不存在。
Microsoft 提供了关于使用云服务构建和设计应用程序以及迁移到云服务的丰富知识。以下是一些可用信息的示例
除了这些文章之外,“Designing Distributed Systems”提供了一套出色的云原生应用程序开发工具。作者讨论了几种支持迁移到云的策略:将应用程序重新打包到容器中,将服务请求重定向到其他提供商(例如,为为 HTTP 服务构建的应用程序提供 HTTPS 服务),以及在新架构上开发新应用程序。
设置项目
为了说明一个常见的用例,我们将构建一个三层应用程序:一个小数据库,一组用于操作数据的服务,以及一个简单的 HTML 页面作为用户界面。该应用程序将使用 OAuth 2 通过 Azure Active Directory (AAD) 对用户进行身份验证。
我们还将向您展示如何构建一个完整的 CI/CD 管道,只需几次鼠标点击即可构建和部署您的更改。我们将在 Eclipse 中使用 Java 和 HTML 进行此操作。代码存储在 GitHub 中,因此您无需移动代码即可使应用程序正常工作。
这种方法的缺点是它假设您拥有在新架构上重建应用程序的资源。如果没有,容器化提供了一种迁移到云以减少基础设施限制的方法。这样,您将有时间完全迁移您的应用程序。虽然本文没有篇幅讨论容器化,但 Microsoft 提供了两套优秀的书籍,涵盖此主题
现在让我们讨论我们示例应用程序的一些具体细节。
Azure Functions
我们应用程序的服务部分使用 Azure Functions 实现。Microsoft 提供了这些服务的概述
Azure Function 托管实现“工作单元”的代码。我们将使用消耗计划,这意味着这些函数仅在被调用时存在,并且 Microsoft 可以根据我们的服务计划支持的数量来托管我们函数的实例以满足需求。这要求我们的服务是原子化和无状态的。然而,由于函数实现了独立的服务并且不持有状态数据,我们可以随时更新或替换它们中的任何一个,而不会对任何其他服务产生影响。想象一下,能够在不停止的情况下提供身份验证过程的紧急补丁,并且由于推送完整的应用程序重建而无需停机。
数据服务
此应用程序使用 Azure Database for MySQL。Microsoft 提供许多其他数据服务,但 MySQL 可能是最受欢迎的数据库。我们将构建的数据库是使用 MySQL Workbench 开发的。我们的应用程序很简单,因此我们没有将其推向极限。但是,它将处理典型的三层应用程序所需的大部分服务。
用户界面
由于我们的应用程序专注于服务,并且有很多方法可以实现用户界面,因此我们将把用户界面保持在一个使用基本 HTML 的网页上。HTML 改编自 Bootstrap 的 Bootstrap Starter Page。
安全
现代应用程序必须是安全的,因此我们不能将数据服务暴露给公众。我们的应用程序仅接受来自拥有 Microsoft 登录凭据的用户的请求。我们将使用 Azure Active Directory (AAD) 要求用户登录并提供其身份。
支持工具和流程
本系列文章重点介绍使用 Java 和相关技术构建的应用程序,以展示如何使用这些工具基于 Azure Functions 实现应用程序。我们将 Eclipse 用作集成开发环境 (IDE),并使用 EGit 扩展它以集成 GitHub 源代码控制。
另一个关键部分是 GitHub 和 Azure 之间的管道,用于实现部署。您可以实现以下两种管道之一
虽然 GitHub Actions 更易于实现,但 Azure DevOps 平台是一个完全协作的 IDE,它在一个地方包含了源代码控制服务、管道和其他项目管理功能。
本文通过设置 DevOps 组织和管道来介绍 Azure DevOps 服务。
有关这些服务的更多信息,您可以查阅 Microsoft 的一些相关文档
- Azure Functions 的基本文档大小
- Eclipse 上的无服务器函数
- Azure Functions 与 Java、Eclipse 和 Maven
- CI/CD
- GitHub 集成
- EGit/用户指南:入门
后续步骤
本系列文章仅触及 Azure 功能的表面。您是否需要 Microsoft SQL Server 或 Cassandra 作为数据服务?Azure 都有。想监控存储更改?使用由 Blob 事件触发的 Azure Functions。您想运行微服务吗?使用 Spring。
以下是您可以探索的一些 Azure 服务简要列表
阅读云原生开发知识是必要且重要的,但构建自己的应用程序可以帮助您将其置于正确的视角。本系列文章中的下一篇文章将向您展示如何设置一个自动化的 CI/CD 管道,该管道使用与 GitHub 集成的 Azure DevOps Pipelines。 第三篇,也是最后一篇,文章将实现一个完整的微服务。在每篇文章的结尾,您将拥有一个可以扩展以了解更多信息的可用环境。