使用端到端安全性、监视和自动化进行缩放

在设计应用程序时,我们需要确定如何适应工作负荷更改、从意外故障中恢复、最大程度地降低安全风险等。 虽然一个人可以从试验和错误方法开始,但需要时间远离其他组织目标,并可能对我们的声誉产生不利影响。 Azure 提供从一开始就获得正确操作所需的体系结构指南。 此外,还需要生成可缩放的应用程序,从最先进的安全性和自动缩放到支持数据、消息传送、缓存、性能监视和自动化的服务。 其中许多支持服务也基于常用的开源软件(如 PostgreSQL、Redis、JMS 和 Kafka),因此不会锁定到专有解决方案中。

包含标题为“平台服务”和本文中所述服务的徽标的关系图。

现在,让我们看看一些关键的 Azure 服务和功能,以及如何将其用于生成可缩放的 Java 应用程序。

扩展 Java 应用程序的功能 - 数据库和消息传送

除了提供多个用于运行 Java 代码的选项外,Azure 还提供广泛的完全托管服务来支持数据库需求,包括 Azure Database for PostgreSQL、Azure Database for MySQLMongoDB Atlas、Azure Cosmos DBAzure SQL 数据库 和Azure SQL 托管实例。 消息传送也是如此,包括Azure 服务总线Azure 事件中心Apache Kafka for Confluent Cloud 的选项。

Azure 服务总线 高级版层支持 JMS(Java 消息服务编程模型)。 无论应用程序是在 VM、Kubernetes 中还是在完全托管的 PaaS 服务上运行,都可以使用开源客户端、Azure Java SDK、Spring 初学者和应用程序服务器集成快速预配和使用这些完全托管的数据和消息传送服务。 它们都提供 Microsoft 和 Azure 期望的符合性、可用性和可靠性保证。 许多 Java 和 Spring 开发人员希望使用惯用库来简化与其首选云服务的连接。 Microsoft 维护库、驱动程序和模块的综合列表,使你可以轻松地跨数据、消息传送、缓存、存储、事件、目录和机密管理与 Azure 服务进行交互。 有关详细信息,请参阅 Spring Cloud Azure 开发人员指南

此图列出了 Spring Cloud Azure 和关联的 Azure 服务的功能。

此图显示了各种 Java 库、驱动程序和 Spring 模块支持的功能类别和关联的 Azure 平台服务。

零信任 - 安全网络

可以通过在 Azure 虚拟网络(Azure 中自己的专用网络的基本构建基块)中部署 Java 应用程序来保护 Java 应用程序。 虚拟网络使许多类型的 Azure 资源能够安全地相互通信、与 Internet 以及本地网络和系统通信。 可以使用虚拟网络将应用程序与支持后端服务与 Internet 隔离,并将其放置在专用网络上。 可以假设完全控制应用程序和后端系统的入口和出口。

Azure Spring Apps 参考体系结构示意图。

零信任 - 安全通信端到端

作为解决方案体系结构的一部分实现安全通信可能很有挑战性。 许多公司手动轮换证书或构建自己的解决方案,以自动进行预配和配置。 即便如此,仍有数据外泄风险,例如未经授权的复制或数据传输。

使用 Azure,可以在任何通信点保护通信端到端或终止传输级安全性。 还可以自动为保护通信所需的所有 Azure 资源进行预配和配置。 若要查看它如何适用于 Azure Spring Apps,请参阅适用于 Spring Boot 应用的端到端安全通信 - 在 零信任 环境中。 此过程与可用于运行 Java 应用程序的其他 Azure 计算服务类似。

根据“永不信任、始终验证和无凭据”的原则,零信任有助于通过消除未知和非托管证书来保护所有通信,并且仅信任在授予这些证书访问权限之前通过验证标识共享的证书。 可以使用任何类型的 TLS/SSL 证书,包括证书颁发机构颁发的证书、扩展验证证书、wild卡证书,以及支持任意数量的子域或用于开发和测试环境的自签名证书。

Java 或 Spring Boot 应用可以从 Azure 密钥库(下一步讨论)安全地加载证书。 使用 Azure 密钥保管库,可以控制证书的存储和分发,以减少意外泄漏。 应用程序和服务可以使用托管标识、基于角色的访问控制和最低特权原则安全地访问证书。 此安全加载使用 Azure 密钥库 JCA(Java 加密体系结构)提供程序提供支持。

适用于 Spring Boot 应用的安全端到端通信的体系结构示意图。

零信任 - 管理机密

许多 Java 应用程序使用 URL 和凭据连接到支持服务 - 这些信息(如果公开)可用于获取对敏感数据的未经授权的访问。 由于许多原因(包括通过代码存储库发现)将此类信息嵌入应用本身会带来巨大的安全风险。 许多开发人员使用环境变量外部化此类凭据,以便多个应用程序可以加载它们,但这只会将风险从代码本身转移到执行环境。

包含标题为“零信任 - 使用 Azure 密钥库管理机密”的关系图,其中包括本节中所述功能的摘要。

Azure 密钥库提供了一种更安全、更安全的方式来保护机密。 它允许你完全控制应用程序机密的存储和分发,使用基于角色的访问控制(RBAC)和最小特权原则来限制访问。 可以控制应用程序机密 - 只需授予应用程序使用权限即可根据需要使用它们。 在应用程序启动时,在授予对机密的访问权限之前,应用程序使用 Azure RBAC 通过 Microsoft Entra ID 和 Azure 密钥库授权进行身份验证。 Azure 密钥库包括完整的审核功能,并且具有两个服务层级:标准层,使用软件密钥进行加密,以及一个高级版层,其中包括硬件安全模块(HSM)保护的密钥。

最终用户身份验证和授权

大多数企业 Java 应用程序都需要用户身份验证和授权,可以使用 Microsoft Entra ID 实现 此 ID -一个完整的标识和访问管理解决方案,具有集成安全性。 最终用户帐户可以是使用 Microsoft Entra ID 和 Azure Active Directory B2C 从 Facebook、Twitter 或 Gmail 的组织标识或社交标识。 可以使用适用于 JavaMicrosoft 身份验证库或适用于 Microsoft Entra 的 Spring Boot Starter 实现基于 Microsoft Entra 的 Microsoft Entra ID 解决方案。 还可以使用所选的任何标识提供者,例如 ForgeRock、Auth0、Ping 或 Okta。

实施端到端监视

使用 Azure,可以使用任何工具和平台端到端监视 Java 应用程序。 或者,可以使用 Azure Monitor 的一项功能 Application Insights 实现完全托管的本机监视,包括应用程序性能监视(APM)。 它为 Java、Spring 和 Micrometer 和 Spring Boot 等框架提供了强大的支持,使你能够快速识别和排查问题。 功能包括实时指标流式处理、请求速率和响应时间跟踪、事件跟踪和外部依赖项速率 - 监视在 Azure 或本地运行的 Java 应用程序的可用性、性能、可靠性和使用情况所需的一切。

可以通过聚合 Log Analytics 中的日志和指标(Azure 门户中的工具)来监视端到端,该工具可用于编辑和运行 Azure Monitor 中的日志和指标数据的查询。 可以编写返回一组记录的查询,然后使用 Log Analytics 对记录进行排序、筛选和分析。 或者,可以编写更高级的查询来执行统计分析和可视化图表中的结果,因为可能需要识别特定的趋势。 无论是以交互方式处理查询的结果,还是将其与其他 Azure Monitor 功能(如日志查询警报或工作簿)配合使用,Log Analytics 都是用于编写和测试查询的好工具。

也就是说,我们意识到,将 Java 应用程序引入 Azure 的客户可能想要继续使用用于监视其本地应用程序的相同 APM 工具。 为了支持此用法,我们与 New RelicAppDynamicsDynatraceElastic 合作,将其监视解决方案与 Azure App 服务 和 Azure Spring Apps 集成。 监视代理与代码并排运行,我们将为你安装并保留代理。 部署到 Azure 容器应用、Azure Kubernetes 服务或虚拟机时,可以与应用程序一起运行这些代理(包括 New Relic、AppDynamics、Dynatrace、Elastic 和 Datadog),但需要自行安装和管理它们。 同样,可以通过聚合 Elastic 和 Splunk 中的日志和指标来监视端到端。

包含标题为“使用任何工具和平台监视端到端”的关系图,其中显示了本文所述的工具的示例屏幕截图和徽标。

我们还意识到,许多客户希望继续使用 Grafana 来查询、可视化、发出警报并了解其指标。 因此,我们与 Grafana Labs 合作提供 Azure 托管 Grafana,这是一项完全托管的服务,可让客户在 Azure 上本机运行 Grafana。 借助该服务,可以轻松部署安全且可缩放的 Grafana 实例,并将其连接到开源、云和第三方数据源,以便进行可视化和分析。 该服务针对 Azure Monitor 和 Azure 数据资源管理器等 Azure 本机数据源进行优化,它包括应用程序性能监视(APM)与 Azure 计算服务(如 Azure App 服务、Azure Spring Apps、Azure Kubernetes 服务、Splunk、Datadog 和 Azure 虚拟机)的集成。

使用缓存加速 Java 应用程序

随着 Java 应用程序的工作负载的增长,可以使用 Azure Redis 缓存实现内存中缓存层来实现查询结果、会话状态和静态内容的性能。 这是提高应用程序吞吐量并减少延迟而无需重新构建基础数据库的绝佳方法。 Azure Redis 缓存企业层与 Redis 合作开发,由 Microsoft 完全管理,是用于在 Azure 上运行 Redis 的最高可用性和可缩放的部署选项,包括活动异地副本 (replica)、外部化会话管理和高速搜索和索引等功能。

包含标题为“使用 Redis 缓存加速和缩放 Java 应用”的关系图,包括本节中所述功能的摘要。

自动缩放

用于运行 Java 应用程序的所有 Azure“计算”服务都支持自动缩放(自动缩放),这有助于最大程度地提高成本效益并适应不断变化的工作负载,而无需为所需的容量付费。 启用后,可以放心,自动缩放负责底层基础结构和应用程序工作负载。

图中标题为“使用自动缩放提高应用利用率”,包括本节中所述功能的摘要。

可以根据负载或计划自动横向扩展。 在基于负载的(或基于指标的)模式下,应用程序水平横向扩展到处理负载所需的资源,具体取决于设置的限制。 同样,当负载减少时,资源水平缩放,永远不会低于你设置的最小值。

在基于计划的模式下,应用程序会根据定义的计划和限制进行横向扩展和横向扩展。 基于计划的模式对于遵循可预测模式的工作负荷非常有用,可用于建立基于负载的缩放的基线。

从创意到生产自动化

将应用程序移动到云时,需要根据需要自动执行一切操作,以便在企业规模上进行 Java 开发。 需要考虑自动缩放来解决应用程序工作负载,如前所述。 但是,你还需要在整个云环境中进行缩放和自动化(理想情况下从想法到生产),包括如何快速预配用于测试、QA、生产、蓝/绿部署、地理扩展等的新环境。

此图显示了“预配”、“生成”和“部署”类别的框,其中包含本节中所述工具的相关徽标。

Azure 允许使用各种工具和平台从创意到生产自动化。 概括而言,此类自动化管道可以分为三类:

  • 预配管道 - 可以根据需要使用 Terraform、Azure 资源管理器 (ARM) 模板、Bicep 模板或 Azure CLI 预配 Azure 资源,以便为持续向上旋转和旋转环境创建可重复的脚本。

  • 生成管道 - 基于 Maven 或 Gradle 等工具,如本文档前面所述。

  • 部署管道 - 可以使用 GitHub Actions、Azure Pipelines、Jenkins Pipelines、GitLab Pipelines 或 Azure CLI 自动执行代码部署,包括蓝/绿部署,在部署代码更新时将关键系统保留在生产环境中。

继续使用现有做法和系统

在 Azure 上迁移或生成并缩放 Java 应用程序时,可以使用网络、监视、自动化、标识提供者、本地系统、开发和生成工具和应用库的现有投资。 下表提供了一些示例:

类别 Java 生态系统产品和服务
网络 F5、Palo Alto、Cloudflare、Checkpoint、Infoblox
监视 New Relic、Dynatrace、AppDynamics、Elastic、Splunk
自动化 GitHub Actions、Azure Pipelines、Jenkins、GitLab
标识提供者 Microsoft Entra ID、ForgeRock、Auth0、Ping、Okta
本地系统 数据库(如 Oracle DB 或 IBM DB2)、消息传送(如 IBM MQ 或 TIBCO EMS)、事件(如 Kafka)、目录(如 Microsoft Entra ID、OpenLDAP 或 IBM ID)
开发工具 IntelliJ、Visual Studio Code、Eclipse、Spring Tool Suite、Maven、Gradle

引用体系结构

Azure 体系结构中心提供有关使用已建立模式和做法在 Azure 上构建解决方案的指导,包括如何使用这些功能。 这些参考体系结构基于我们从客户参与中学到的内容,考虑到成本优化、卓越运营、性能效率、可靠性、可伸缩性、安全性、监视、烟雾测试等。 它们还解决了解决方案设计组件(例如 Azure 登陆区域)-用于托管通过基础结构即代码预先预配的工作负载的环境,以在企业规模上启用 Java 应用程序迁移和绿地开发。

例如,下面是 Azure Spring Apps 的登陆区域加速器,演示如何实现中心辐射型设计,其中 Azure Spring Apps 部署在依赖于中心中托管的共享服务的单个辐射中。 此项目是使用组件构建的,用于在 Microsoft Azure 良好架构框架实现原则。 若要探索此体系结构的实现,请参阅 GitHub 上的 Azure Spring Apps 登陆区域加速器 存储库。 可以将相同的方法应用于部署到任何 Azure“计算”目标的任何 Java 应用程序,例如Azure App 服务、Azure 容器应用或Azure Kubernetes 服务。 此外,如果要将现有 Java 应用程序迁移到 Azure,我们提供了一套全面的迁移指南和建议的策略。

包含标题为“使用端到端安全性缩放、监视和自动化”的图示,以及本文中所述工具的徽标。

下一步

为 Java 应用程序选择正确的 Azure 服务