使用端到端安全性、监控和自动化进行缩放
在设计应用程序时,我们需要确定如何适应工作负荷的变化、从意外故障中恢复、最大限度地降低安全风险等。 虽然我们可以从试验和错误的方法入手,但这会占用其他组织目标的时间,并可能对我们的声誉造成不利影响。 Azure 可提供所需的体系结构指导,从一开始就做正确的事。 你还拥有生成可缩放的应用程序所需的一切 - 从最先进的安全性和自动缩放到数据、消息传送、缓存、性能监控和自动化的支持服务。 其中许多支持服务还基于常用的开源软件,如 PostgreSQL、Redis、JMS 和 Kafka,因此不会被专有解决方案所束缚。
现在,让我们来看看一些关键的 Azure 服务和功能,以及如何利用它们来生成可缩放的 Java 应用程序。
扩展 Java 应用程序的功能 - 数据库和信息传送
除了为运行 Java 代码提供多个选项外,Azure 还提供了广泛的完全托管服务,以支持各种数据库需求,包括 Azure Database for PostgreSQL、Azure Database for MySQL、MongoDB Atlas、Azure Cosmos DB、Azure 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 开发人员指南。
零信任 - 安全网络
可以将 Java 应用程序部署到 Azure 虚拟网络(Azure 中自己的专用网络的基本构件)中,从而确保应用程序的安全。 虚拟网络使多种类型的 Azure 资源能够相互之间、与 Internet 以及与企业内部网络和系统进行安全通信。 可以使用虚拟网络将应用程序和支持的后端服务与 Internet 隔离,并将其置于专用网络中。 可以完全控制应用程序和后端系统的入口和出口。
零信任 - 端到端的安全通信
将安全通信作为解决方案架构的一部分实施绝非易事。 许多公司都是手动轮换证书或建立自己的解决方案来自动化预配和配置。 即便如此,数据外泄风险依然存在,如未经授权的复制或数据传输。
借助 Azure,可以确保端到端的通信安全,或在任何通信点终止传输级安全性。 还可以自动为保护通信所需的所有 Azure 资源进行预配和配置。
零信任基于“绝不信任、始终验证、无证书”的原则,通过消除未知和未管理的证书,以及只信任通过验证身份共享的证书,然后才允许访问这些证书,从而确保所有通信的安全。 可以使用任何类型的 TLS/SSL 证书,包括证书颁发机构颁发的证书、扩展验证证书、支持任意数量子域的通配符证书,或用于开发和测试环境的自签名证书。
Java 或 Spring Boot 应用可以安全地从 Azure Key Vault 加载证书(将在下文讨论)。 使用 Azure 密钥保管库,可以控制证书的存储和分发,以减少意外泄漏。 应用程序和服务可以利用托管身份、基于角色的访问控制和最小特权原则来安全地访问证书。 此安全加载使用 Azure Key Vault JCA(Java 加密体系结构)提供程序提供支持。
零信任 - 管理机密
许多 Java 应用程序使用 URL 和凭据连接到支持服务,这些信息一旦公开,就可能被用于未经授权访问敏感数据。 将此类信息嵌入应用程序本身会带来巨大的安全风险,原因有很多,包括通过代码库发现。 许多开发人员使用环境变量将这些凭据外部化,以便多个应用程序可以加载它们,但这只是将风险从代码本身转移到了执行环境。
Azure Key Vault 提供了更好、更安全、更可靠的方式来保护机密。 它通过使用基于角色的访问控制 (RBAC) 和最小权限原则来限制访问,让你能够完全控制应用程序机密的存储和分发。 可以保留对应用程序机密的控制权 - 只需根据需要授予应用程序使用机密的权限即可。 应用程序启动后,在授予机密访问权限之前,应用程序会使用 Microsoft Entra ID 进行身份验证,Azure Key Vault 会使用 Azure RBAC 进行授权。 Azure Key Vault 包括完整的审核功能,并有两个服务层级:标准层使用软件密钥加密,高级层包括硬件安全模块 (HSM) 保护密钥。
最终用户身份验证和授权
大多数企业 Java 应用程序都需要用户身份验证和授权,可以使用具有集成安全性的完整身份和访问管理解决方案 Microsoft Entra ID 来实现这一点。 最终用户帐户可以是组织身份,也可以是使用 Microsoft Entra ID 和 Azure Active Directory B2C 的 Facebook、Twitter 或 Gmail 的社交身份。 可以使用用于 Java 的 Microsoft 身份验证库或为 Microsoft Entra ID 使用 Spring Boot Starter 来实现基于 Microsoft Entra ID 的解决方案。 也可以使用自己选择的任何身份提供程序,如 ForgeRock、Auth0、Ping 或 Okta。
实施端到端监视
借助 Azure,可以使用任何工具和平台对 Java 应用程序进行端到端监控。 另外,还可以使用 Application Insights(Azure Monitor 的一项功能)来实施完全托管的本机监控,包括应用程序性能监控 (APM)。 它为 Java、Spring 以及 Micrometer 和 Spring Boot 等框架提供了强大的支持,让你能够快速识别问题并排除故障。 其功能包括实时指标流、请求率和响应时间跟踪、事件跟踪和外部依赖率 - 这些是监控在 Azure 或内部部署上运行的 Java 应用程序的可用性、性能、可靠性和使用情况所需的一切。
可以通过 Log Analytics 中的日志和指标聚合进行端到端监控,这是 Azure 门户中的一个工具,可用于在 Azure Monitor 中对日志和指标数据进行编辑和运行查询。 可以编写一个查询,以返回一组记录,然后使用 Log Analytics 对其进行排序、筛选和分析。 也可以编写更高级的查询来执行统计分析,并在图表中将结果可视化,以识别特定趋势。 无论是以交互方式处理查询结果,还是与日志查询警报或工作簿等其他 Azure Monitor 功能一起使用,Log Analytics 都是编写和测试查询的好工具。
尽管如此,我们意识到,将 Java 应用程序引入 Azure 的客户可能希望继续使用他们用于监控内部部署应用程序的 APM 工具。 为了支持这种使用,我们与 New Relic、AppDynamics、Dynatrace 和 Elastic 合作,将它们的监控解决方案与 Azure 应用程序服务和 Azure 容器应用集成。 通过监控与代码并行运行的代理,我们将为你安装并不断更新代理。 在部署到 Azure 容器应用、Azure Kubernetes 服务或虚拟机时,可以在运行应用程序的同时运行任何这些代理(包括 New Relic、AppDynamics、Dynatrace、Elastic 和 Datadog),但需要自行安装和管理它们。 同样,也可以通过聚合 Elastic 和 Splunk 中的日志和指标来监控端到端。
我们还意识到,许多客户希望继续使用 Grafana 来查询、可视化、预警和了解他们的指标。 因此,我们与 Grafana Labs 合作提供了 Azure 托管 Grafana,这是一项完全托管的服务,可让客户在 Azure 上本机运行 Grafana。 该服务可轻松部署安全、可缩放的 Grafana 实例,并将其连接到开源、云和第三方数据源,以便进行可视化和分析。 该服务针对 Azure 本机数据源(如 Azure Monitor 和 Azure 数据资源管理器)进行了优化,包括与 Azure 计算服务(如 Azure 应用程序服务、Azure 容器应用、Azure Kubernetes 服务、Splunk、Datadog 和 Azure 虚拟机)的应用性能监控 (APM) 集成。
使用缓存加速 Java 应用程序
随着 Java 应用程序工作负载的增加,可以使用用于 Redis 的 Azure 缓存为查询结果、会话状态和静态内容实施内存缓存层,从而提高性能。 这是提高应用程序吞吐量和减少延迟的好方法,而无需重新构建基础数据库。 用于 Redis 的 Azure 缓存企业层是与 Redis 合作开发的,由 Microsoft 全面管理,是在 Azure 上运行 Redis 的可用性和可缩放性最高的部署选项,包括活动异地复制、外部化会话管理以及高速搜索和索引等功能。
自动缩放
所有用于运行 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 容器应用的登陆区域加速器,展示了如何实现中心辐射型设计,其中 Azure 容器应用部署在依赖于中心托管的共享服务的单个分支中。 此项目是使用组件构建的,以实现 Microsoft Azure 架构良好的框架中的原则。 要探索此体系结构的实现,请参阅 GitHub 上的 Azure 容器应用登陆区域加速器存储库。 可以对部署到任何 Azure“计算”目标(如 Azure 应用程序服务或 Azure Kubernetes 服务)的任何 Java 应用程序采用相同的方法。 此外,如果你正在考虑将现有 Java 应用程序迁移到 Azure,我们还提供了一套全面的迁移指南和推荐策略。