无处不在 | 亚马逊云科技的 Java 生态
Java 自诞生以来就一直是热门的编程语言。得益于丰富的生态以及完善维护的包和框架,Java 拥有着庞大的开发者社区。这个 1995 年诞生的计算机语言,以 “一次编写,到处运行” 的跨平台特性以及面向对象、泛型编程等现代语言的特性迅速成为了企业级应用乃至移动应用开发的首选。亚马逊云科技也一直在 Java 方面有持续的投入,以丰富整个 Java 生态。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!
无论在全球还是在中国,开发者规模的增长都越来越快。开发者们会选择自己熟悉的语言进行代码的构建、编译和生成,虽然市场上可选的编程语言很多,但 Java 一直是众多开发者的首选语言。
Apache 软件基金会在 2020 年的调查指出,使用 Java 语言构建源代码的数量远超其他编程语言,由此可见开发者对于 Java 语言的喜爱程度。此外,TIOBE 编程语言排名调研结果显示:从 2001 年到 2022 年,Java 语言一直处于编程语言排名前三的位置,而且在 2005 年和 2015 年分别获得开发者最为喜爱的编程语言。可见,Java 语言拥有着非常广阔的市场以及庞大的开发者群体。
亚马逊的 Java 生态
亚马逊正在广泛地使用 Java,无论是对外的电商零售系统还是内部的应用,包括很多亚马逊云科技的服务也都在使用 Java 进行构建。
亚马逊有成千上万的 Java 应用在生产环境中运行。从 2016 年开始,我们意识到不能过度依赖外部的二进制发行版构建 Java 应用。原因在于:
一是 Java 的季度发布中通常会引入重大更新,并可能产生广泛的影响。
二是某些关键错误的修复需要等待 Java 的发布进度,可能整体下来需要几个月的时间才能获得支持,而我们迫切需要把这些修复投入生产以解决问题。
因此,我们决定从源代码开始构建 Java,以满足亚马逊对 Java 应用在性能和安全等诸多方面的需求。
2018 年我们发布了 Amazon Correto,Amazon Corretto 是开放 Java 开发工具包 (OpenJDK) 的免费、多平台、生产就绪型发行版。Amazon Corretto 提供长期支持,其中包括性能增强和安全修复。我们会借助 Amazon Correto 快速为 Java 带来新的能力,修复更多的错误,贡献给 Java 社区,不断为 OpenJDK 做出贡献。
1 大规模运行 Java 应用
亚马逊作为一家数据驱动型公司,我们的后台运行了众多 Java 构建的系统,我们会为这些系统生成火焰图进行运行分析。通过分析软件的可视化,帮助我们快速准确地识别最常见的代码路径。
这是 Amazon SDK v1 中 S3 存储桶的调用快照,它提供了每个调用的详细分析,并显示每个方法调用的 CPU 利用率,这里我们可以发现 java.math.BigInteger.squareToLen 函数占用了 20% 的 CPU 时间。对于所有使用 Java 的服务,我们都有这样的数据。这其实是一个非常大规模的聚合数据。
基于亚马逊自己的使用经验所产生的数据,将有助于帮助我们确定要为 Java 做哪些类型哪些方面的贡献和改进,并反馈给上游社区。但有时社区需要 3-18 个月才能采纳这些修复,因此我们需要一整套解决方案,不仅帮助亚马逊内部,也帮助开发者更好地获得关于 Java 性能的提升以及错误的改进。
2 亚马逊云科技的 Java 生态系统
亚马逊云科技的 Java 生态系统是庞大、完善和具体的。其中涵盖了开发工具包,以及与亚马逊云科技服务的集成,包括服务、环境、功能、工具等。
在 Amazon Correto 推出之前,亚马逊的 Java 生态其实已经初具规模。Amazon Correto 的推出又进一步丰富了 Java 生态系统。包括如何将更多的 Java 工具和常用的 IDE 进行集成,以及帮助开发者更好地在云端开发,我们也推出了 Amazon Java SDK 的第二版。
与此同时,我们也考虑了要在云服务中引入便捷的 Java 构建方式,比如 Amazon Lambda、Amazon CDK 、Amazon Kinesis 等。经过我们的不懈努力,开发者现在可以通过亚马逊云科技的服务和工具便捷快速、高性能地构建任何的 Java 应用。
Java 开发工具
1 Amazon Corretto 的起源
Amazon Corretto 是根据亚马逊内部需求构建的,并作为二进制发行版对所有开发者开放。亚马逊的数千种基于 Java 的生产环境都在运行 Amazon Corretto,这意味着在 Java 开发中遇到的很多问题、错误等等均可以在早期被发现。Amazon Corretto 是 OpenJDK 的下游发行版,OpenJDK 是 Java 平台标准版的开源实现,这是自 Java 7 以来 Java SE 所需的基础环境。OpenJDK 是一个开放源代码的项目,并且也开始提供从 Java 11 开始的二进制发行版。
Amazon Corretto 目前提供 4 个版本:8、11、17、19。Amazon Corretto 是 OpenJDK 的可靠版本,并保证提供免费的长期支持 (LTS) (Amazon Corretto 19 是 non-LTS 版本)。每个 LTS 版本都会包含亚马逊免费提供的性能增强、安全更新等内容。Amazon Corretto 更新计划是每季度发布一次,并且在常规季度周期之外,当必要时会为用户提供应用紧急修复程序(主要是安全性更新)。
Amazon Corretto 被设计为所有 Java SE 发行版的直接替代品,正确安装后,你可以像之前使用 OpenJDK 一样的方式使用 Amazon Corretto 来调用和运行 Java 应用程序。当然,OpenJDK 中不可用的功能,如 Java 飞行记录器 (JFR)等,Amazon Corretto 也无法支持。
Amazon Corretto 版本在大多数操作系统上都可用,包括支持 Docker 映像部署。Amazon Corretto 使用 Java 技术兼容性工具包(TCK)进行认证,以确保其符合 Java SE 标准。
2 Amazon Corretto 的外部二进制发行版
按道理说,我们只对内部发布 Amazon Corretto 就很有意义了,为什么亚马逊要对外发布一个二进制版呢?
有开发者向我们提出:由于许可证成本的变化,他们正在考虑将所有 Java 软件重写为不同的语言,比如 Python、C# 等,但我们实际上是不希望这种事情发生的,不仅是因为这会给开发者带来不必要的迁移成本,更重要的是这有可能演变为整个 Java 社区的灾难。因此,我们决定对外发布一个公开的 Amazon Corretto 二进制发行版。
亚马逊已经在 Amazon Linux 上发布 OpenJDK 很长一段时间了,因此,发布 Amazon Correto 对于我们来说并非难事。通过与开发者们的交流,我们决定进一步的推动这个事情的发生,并与更多的开发者们分享 Amazon Corretto,而不是将其限制为只能在 Amazon Linux 镜像上使用、只能在亚马逊云科技服务里使用。这样一来,开发者能够借助亚马逊在数千项服务中的经验获得三到十二个月的先发优势,并且,他们喜欢 Amazon Corretto 在自己的平台上提供对新 Java 技术的早期访问,包括性能调优、向后移植和测试。
很多开发者告诉我们,他们在亚马逊云科技上运行一些工作负载,还有一些在本地运行,一些工作负载在其他云上运行。他们把打包好的 Java 的软件,安装在第三方平台上。这些开发者担心针对多个不同的二进制分发版会出现兼容性的问题,他们要求我们提供一个能够提供良好兼容性的 Java 发行版。
如今,Amazon Corretto 可在所有主要操作系统上使用,并且为生产环境提供无成本的长期支持。你可以在任意云、本地、桌面上运行它,也可以将其与你的软件捆绑在一起。
3 在 OpenJDK 中进行协作
亚马逊和社区一起维护 OpenJDK 的 LTS 版本,包括 8、11 和 17 版本。并且参与到 Java 社区的 JCP 成员组织和执行委员会,一起制定 Java 下一步的发展方向,促进 Java 更好的演进。
亚马逊也会为 OpenJDK 贡献新的功能,比如对 ARM 架构的支持,包括 Amazon Graviton2 和 Graviton3 处理器。
此外,Amazon Corretto 团队向 Shenandoah GC 发布分代模式的预览版。这是我们与 Red Hat 合作做出重大 GC 贡献的结果:在传统的单代 Shenandoah 中添加了分代模式。Java 的主要优点之一是 Java 虚拟机 (JVM) 自动处理内存管理。许多创新源于努力减小 JVM 对应用程序吞吐量和响应时间的影响。
4 不断增长的贡献
对比 JDK 11(上图上)和 JDK 17(上图下)中亚马逊的贡献比例,可以看出亚马逊对 Java 的贡献在显著增长。
5 OpenJDK 版本和贡献
上图也更好的展示了这个趋势,2020 年,亚马逊向 OpenJDK 提交了 176 个贡献;2021 年提交了 381 个贡献;到 2022 年仅一季度就提交了 110 个贡献。可以看到亚马逊对 OpenJDK 的贡献是呈上升趋势,而且我们也在对 Java LTS 版本提供支持。目前亚马逊已经决定支持 JDK 8 到 2026 年,对于非 LTS 版本,亚马逊会在下一版本的 30 天内进行升级来确保开发者能够获得更好、更便捷、更安全的使用体验。
6 JDK 11 到 19 的新增功能 (部分)
上图是 OpenJDK 11 到 OpenJDK 19 的部分新增功能,可以看到新增功能的覆盖范围很广,亚马逊和亚马逊云科技也在其中做出了非常重要的贡献。
7 Amazon SDK for Java
这是适用于 Java 的 Amazon 开发工具包,通过提供一组一致且 Java 开发者熟悉的库来简化亚马逊云科技服务的使用。它支持 API 生命周期注意事项,例如凭据管理、重试、数据封送处理和序列化。适用于 Java 的 Amazon 开发工具包还支持更高级别的抽象,以简化开发。
适用于 Java 的 Amazon 开发工具包 2.0 是对 1.0 的重写,具有一些出色的新功能。与 1.0 版本一样,它使你能够轻松使用亚马逊云服务,也包括非阻塞 I/O、自动分页、HTTP/2 和可插拔 HTTP 层等功能以进一步自定义你的应用程序。你可以在几分钟内开始使用 Maven 或任何支持 MavenCentral 的项目管理工具对 Java 项目进行构建、依赖管理。
8 相关工具
当然,亚马逊也了解到很多开发者喜欢使用 IDE 来开发。亚马逊云科技也和众多主流 IDE 进行集成,来帮助我们开发者进行快速的 Java 开发。
9 Amazon CDK for Java
Amazon CDK 是一个开源软件开发框架,用于使用熟悉的编程语言对云应用程序资源进行建模和预置。你可以使用不同的编程语言(如 Python、JavaScript、TypeScript、Java 或 C#)来执行此操作。
相比以前的工具,使用 CDK 可以让你的上手速度变快很多,因为你可以使用熟悉的语言和概念,类和方法,而无需进行上下文切换。你还拥有编程语言的所有工具支持,例如自动补全、内联文档、测试、Linting 和调试器。最重要的是,你能够更快地完成基础架构和应用程序的抽象和构建。我们提供了许多合理的默认值,因此无需阅读大量文档,只需利用默认值快速安全地开始即可。当然,许多默认值可以根据你的需要进行调整。
10 Java 框架
目前很多开发者都在使用不同的 Java 框架进行应用的开发和构建。包括 Web 应用、微服务以及持久性 API 等等。相信各位开发者都选择了不同的框架加速开发。亚马逊云科技提供了一整套开发的生态体系服务来为此提供良好的支持。
11 适用于 Java 软件交付的开发者工具
我们有端到端的解决方案来帮助开发者进行协同工作。从 CI/CD 到整个系统的可观察性,从基础设施即代码到开发/测试,再到开发与安全的集成,你可以使用专门的 Amazon 工具构建成熟的端到端 Java 开发实践。同时,我们在某些领域与顶级供应商进行了原生集成,为开发者提供一站式体验。
具体来说,你可以在构建阶段使用 Amazon Cloud 9 和 Java SDK,并利用 Amazon CodeCommit 对其进行版本控制。代码提交可使用类似 Git 的环境,可以与任何标准的 IDE(Eclipse 或 VS Code)集成。Amazon CodeArtifacts 是二进制文件的版本化存储库,如果你使用的是处理容器 /K8s,则可以使用 Amazon ECR 来推送和拉取映像。Amazon Codeguru 是我们用于 SAST(静态代码分析)的机器学习注入服务,可帮助你提高代码质量和安全性。
开发者可以使用 Amazon CodeBuild 生成 Java 代码,并使用 Amazon CodeDeploy 将其部署到亚马逊云科技环境中。Amazon Codepipeline 为 CI/CD 流水线提供了完整的集成。所有这些开发服务都与可观察性工具很好地集成。开发者可以使用 CloudWatch 来记录和提醒需求,使用 X-Ray 进行追踪,使用 Amazon Config 来评估、审核和评估亚马逊云科技服务资源的配置,利用开发运营专家来识别生产代码中的异常。对于容器化工作负载,Prometheus 和 Grafana 的托管服务可以很好地满足可观察性需求。最重要的是,你可以使用我们的基础设施级代码,CDK 或者 SAM for serverless 配置这些服务。
步骤 1 – 使用 Amazon CodeCommit 构建代码库
Amazon CodeCommit 是一项安全、高度可扩展的托管型源代码控制服务,可帮助团队更轻松地协作处理代码。使用 Amazon CodeCommit,你无需运行自己的源代码控制系统,也无需担心基础设施的扩展能力。你可以使用 Amazon CodeCommit 将来自代码的任何数据存储为二进制文件,而且它可以无缝兼容你现有的 Git 工具。
步骤 2 – 使用 Amazon CodeBuild 编译和测试
在开发阶段之后,你通常会生成、编译和测试 Java 源代码。你可以利用完全托管的服务 Amazon CodeBuild 来打包依赖项,并创建构建包并运行单元测试用例。使用 Amazon CodeBuild 可以进行依赖的打包,进行构建包的创建,并且运行相关的单元测试。使用该服务进行设置、修补、更新和管理之外, 也可进行自动扩展和收缩,以满足你的代码的构建需求。
步骤 3 – 使用 Amazon CodeDeploy 部署
通常我们会分为三步:首先部署是在 beta 环境中执行的,在该环境中执行各种激进的测试;如果一切正常,那么可以转移到 gamma 环境,这是一个类似生产的环境,运行完整的端到端测试。最后,如果没有失败,你可以转移到生产环境,分批或分波执行部署并执行和监控以获得结果。
按照此做法,可以帮助开发者快速地在成功时部署代码,在失败时回滚代码。你可以使用 CodeDeploy 来自动执行部署,最大限度地提高应用程序可用性。
12 Amazon CodePipeline 持续交付
CodePipeline 对生成和测试进行建模,并且可以根据你定义的发布过程模型,在每次发生代码更改时部署代码。这使你能够快速可靠地交付功能和更新。你可以通过将我们针对流行的第三方服务(如 GitHub)的预构建插件或将你自己的自定义插件集成到发布过程的任何阶段来轻松构建端到端解决方案。
我们希望和开发者一起共建 Java 社区、Java 生态,在云上帮助开发者更好地进行 Java 应用开发,提升开发者的全方位技能。
欢迎持续关注 Build On Cloud 微信公众号,了解更多面向开发者的技术分享和云开发动态!
作者王宇博
亚马逊云科技大中华区开发者关系总监,致力于新一代信息技术与创新在开发者中的布道推广,以及开发者社区和生态体系的建设。他此前担任亚马逊云科技高级产品经理多年,负责云原生、大数据和机器学习等相关产品的业务和市场拓展。在加入亚马逊云科技之前,他曾在多家跨国企业担任产品、技术和管理等岗位,具有近 20 年的 IT 行业经验与实践,同时在计算机视觉、模式识别等领域也有多年的科研经历。
评论