让性能腾飞!亚马逊云科技的 Java 云端之旅
在上篇文章中,我们为大家介绍了亚马逊的 Java 生态及丰富的开发工具、框架。本文将分享亚马逊的 Java 架构、迁移途径,并分享一个具体实例,介绍如何使用机器学习来构建 Java 应用和提升 Java 性能。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!
Java 开发的平台之选
1 为 Java 应用提供多种开发和部署选择
计算:EC2、Lambda、ECS、EKS、Fargate
存储:S3、Elastic File Service
网络:Classic Load Balancer、Application Load Balancer、Network Load Balancer、Security Groups、Virtual Private Cloud
数据库:RDS、DynamoDB、Aurora、Neptune
管理:Auto Scaling、CloudFormation、Systems Manager、CloudWatch
众所周知,现在很多开发者基于云平台进行 Java 应用的开发和部署。亚马逊云科技提供了一整套完善的选项来帮助开发者更好的开发。例如计算领域的虚拟机、容器、无服务器,存储领域的对象存储和文件系统;网络领域不同层级的负载均衡和访问控制机制;数据库领域的各种关系型和非关系型数据库;以及全方位多角度的管理和监控。
2 执行环境

在 Java 的执行环境方面,开发者通常会选择三个主要的计算方式,包括虚拟服务器 (Amazon EC2)、容器 (Amazon ECS、EKS 和 Fargate)、无服务器计算 (Amazon Lambda)。无论是哪种方式,亚马逊都在不断添加新的能力来帮助开发者进行更好的 Java 构建。
3 无服务器应用

无服务器计算在近年来成为越来越多开发者的首选。Amazon Lambda 管理所有的基础设施,以将代码放在可用性高的容错型基础设施上运行,从而使开发者能够专注于构建有差别后端服务。使用 Lambda,开发者不必在补丁发布时更新底层操作系统 (OS),或随着使用量的增加而为调整大小或添加新服务器担心。Amazon Lambda 无缝部署代码、执行所有的管理、维护和安全补丁操作,并通过 Amazon CloudWatch 提供内置记录和监控。
使用 Amazon Lambda,不需要了解任何新语言、工具或框架。开发者可以使用任何第三方库,甚至是本机库。你还可以将任何代码(框架、软件开发工具包、库等)打包为 Lambda Layer,并在多个函数之间轻松进行管理和共享。Lambda 原生支持 Java,并提供 Runtime API,允许开发者使用任何其他编程语言来编写函数。
Lambda 函数是在完全托管的运行时环境中执行函数代码,因此每次应用程序扩展以创建新的执行环境时都会进行初始化。在 2022 年 re:Invent 大会上,新功能 Amazon Lambda SnapStart 正式发布。利用 SnapStart 可将 Lambda 函数冷启动持续时间降低至不到 200 毫秒,延迟率降低 90%,使得冷启动跟非冷启动(缓存命中)几乎没有区别。目前这项功能适用于使用 Corretto 运行时的 Java 函数,包括 Spring Boot、Quarkus、Micronaut 和其他 Java 框架的应用。
Java 应用迁移上云
开发者除了选择云平台直接进行 Java 开发之外,还有很多遗留的应用可能是在本地或者在其它环境中运行,而越来越多的开发者需要将这些 Java 应用迁移上云。而基于 Java 上云的现代化应用改造也是亚马逊逐步帮助企业和开发者迁移应用上云的重要途径。

传统的 Java 企业应用架构
上图传统的三层应用架构,包括表示层、业务逻辑层、数据层,分别对应 Web 服务器、应用服务器、数据库服务器,也有传统的应用软件帮助开发者构建传统的三层架构,像 JavaBeans、Web Services 等等。

现代三层应用架构
随着云服务架构的不断提升和不断演进,整体上讲,与传统的三层架构也有非常匹配的对应关系。虽然同样包括表示层、业务逻辑层和数据层,但是实现方式有非常明显的变化。
首先在三层之间,是通过 API 进行通信。其次在业务逻辑层通过事件的方式进行消息的传递,同时在系统架构中构建消息队列实现后端数据的通信和交互。另外数据层面,也有面向不同工作负载的关系型和非关系型数据库选项来契合前端的应用。
通过事件、消息队列等技术形成了现代化三层架构。那么如何将传统三层应用架构向现代化三层架构迁移呢?亚马逊云科技已经为大家提供了方便快捷的迁移方案。通过 App2Container,可以将已有的应用进行容器化,并且迁移上云。在 A2C 产品中,其核心首先是容器化现有应用,其次支持不同的部署源,比如一些本地环境,像 EC2 或者 VM 等等,把他们的应用以容器的方式在云端部署。通过将 Java 应用进行容器化处理,部署的目标是基于亚马逊的容器服务,包括 ECS、EKS、ECR 等等。结合开发者工具进行整体的开发生命周期管理,使得整个云端容器化部署更加便捷,也使得传统 Java 应用向云端迁移获得更加良好的效果。

App2Container – 容器化现有应用并将其迁移上云
通过机器学习加速 Java 开发
机器学习一直是近年来开发者非常关注的话题,我们也在探索如何通过机器学习帮助开发者尤其是 Java 开发者进行更快更好的高质量开发,这也是亚马逊云科技一直以来着力解决的问题,希望能够为开发者提供便利。

Java 应用开发之旅
上图是典型的 Java 应用开发之旅。包括代码编写、代码审核、安全和操作审核、观测和漏洞缓解。通常上述四个阶段构成了典型的 Java 应用开发之旅。其实也适用于其它语言的开发过程。
在这个过程中,我们也发现了一系列挑战,大量消耗开发者的时间和精力:
如何帮助开发者识别有问题的代码,尤其是编译通过,但运行结果不符合预期的情况下,如何找到有问题的代码,其实是非常耗费精力的过程;
在行业内部或者标准化的环境中有些代码分析工具,缺乏高质量的代码分析环境,也缺乏很好的实践的集成,使得开发者在使用这些工具时感到费时费力。
如何发现并修复昂贵的代码行,这同样值得关注。
而亚马逊云科技一直致力于解决上述问题,在 Java 开发的后三个阶段,已经引入了机器学习的审核和观测机制,包括 Amazon CodeGuru 和 Amazon DevOps Guru,帮助开发者进行代码审核、安全操作审核,以及观测和漏洞缓解。通过这两个人工智能驱动的代码服务,可以极大地提高开发者的效率,来帮助开发者更好地发现代码中的问题,提升代码的性能。

ML 辅助的审核和观测

Amazon CodeGuru
Amazon CodeGuru 是基于机器学习的代码审核和性能建议服务。它本身分为两个部分,第一个部分叫做 CodeGuru Reviewer (静态代码分析器),第二部分叫做 CodeGuru Profile (代码的性能分析器),通过这两大功能可以帮助开发者进行具有智能建议的内置代码审查、检测和优化昂贵的代码行以及识别延迟和性能改进。

Amazon CodeGuru Reviewer
Amazon CodeGuru Reviewer 主要用于代码审核,通过亚马逊云科技的最佳实践,来帮助开发者更加正确地使用 Amazon API。同时可以检测很多潜在的问题,比如如何构建并发机制、如何审核避免资源泄漏、避免敏感信息泄露,以及通过数据挖掘的方法来发现缺陷代码,从而提升代码质量。

Amazon CodeGuru Reviewer 代码审核效果
上图为 Amazon CodeGuru Reviewer 代码审核效果。整个 Reviewer 分为四个层级,包括代码、建议、修复、开发者反馈。后端通过机器学习的审核机制,可以推荐相关的修改建议,开发者可以根据修改建议对代码进行针对性地修复来提升代码质量。
而对于 Amazon CodeGuru Profiler,它是性能分析可视化,在整个性能分析可视化过程中也包括四个部分:Why、What、How、Where。通过性能分析可视化,生成非常直观的火焰图,其中会针对开发者的代码进行机器学习性能改进分析。

其实还有一个有趣的问题,就是如何使用机器学习来编写代码。其目的不是为了取代开发者,而是帮助开发者进行更快和更好的构建。
在 2022 re:MARS 上,亚马逊云科技推出了全新的服务:Amazon CodeWhisperer,它是机器学习驱动的编码伴侣。
这项服务可以从纯英文的注释中生成代码,也可以生成完整的函数。通过它还可以生成即用型代码。作为扩展,CodeWhisperer 可用于主流 IDE 中。下图为使用机器学习生成 Java 代码的典型示例。

CodeWhisperer
对于 CodeWhisperer,除了 Java 之外,还支持众多的语言。在 IDE 方面,也支持集成目前主流的 IDE,包括 JetBrains、VS Code、Visual Studio 等等。同时也集成了亚马逊云科技的一流的 API。帮助开发者既能够利用云服务的高效快捷,又能够在熟悉的环境中进行开发。

更多资源
以上就是亚马逊云科技关于 Java 语言架构、迁移以及如何使用机器学习来构建 Java 应用和提升 Java 性能的相关介绍。
欢迎开发者和我们互动,一起共建 Java 社区、Java 生态,在云上更好地进行 Java 应用开发,提升全方位技能。
请持续关注 Build On Cloud 微信公众号,了解更多面向开发者的技术分享和云开发动态!
往期推荐

作者王宇博
亚马逊云科技大中华区开发者关系总监,致力于新一代信息技术与创新在开发者中的布道推广,以及开发者社区和生态体系的建设。他此前担任亚马逊云科技高级产品经理多年,负责云原生、大数据和机器学习等相关产品的业务和市场拓展。在加入亚马逊云科技之前,他曾在多家跨国企业担任产品、技术和管理等岗位,具有近 20 年的 IT 行业经验与实践,同时在计算机视觉、模式识别等领域也有多年的科研经历。
评论