本教程将引导您在Oracle云基础设施(OCI)的Ampere A1计算平台上启动并运行GraalVM。您将首先在JVM模式下运行Spring Boot应用程序,随后构建并以原生二进制形式运行Micronaut.io应用程序。利用GraalVM,不仅能提升现有应用程序的性能,还能为云端构建轻量级多语言应用程序。对于Ampere A1计算形态,它提供线性可扩展性和无与伦比的性价比,是理想的伴侣。
Ampere A1计算平台基于Ampere Altra CPU,为企业和应用开发者带来了一场革命,他们正构建从边缘设备到云数据中心可扩展的工作负载。这个平台的独特设计提供了一致且可预测的性能,因为计算核心内没有资源争夺,提供了更多的隔离和安全性。Oracle云基础设施上这一新类计算形态,结合Altra CPU的强大力量和OCI的安全性、可扩展性以及服务生态系统,提供了无与伦比的平台。
GraalVM是一个高性能的运行时环境,适用于Java、JavaScript、基于LLVM的语言如C和C++,以及其他动态语言编写的应用程序。它显著提高了应用程序的性能和效率,因此可以帮助您更高效地在云平台上运行现有应用程序。
GraalVM还能为现有基于JVM的应用程序构建原生可执行二进制文件——原生镜像。所产生的原生镜像以机器代码形式包含整个程序,可立即执行,避免了JVM本身的启动和内存占用。这一能力使GraalVM成为构建云原生应用程序的理想选择,目前已有几种JVM语言的微服务框架今天包括这一功能。
在本教程中,您将:
您将开始初始化Oracle云环境,用于创建和部署Java EE应用程序。该环境将包含在云隔间内,隔间内的通信将通过虚拟云网络(VCN)进行。隔间和VCN将隔离并保护整体环境。您将创建一个Ampere A1计算实例,以安装并使用GraalVM企业版运行应用程序。
3.在创建实例页面,您将创建新实例以及新的网络资源,如虚拟云网络(VCN)、互联网网关(IG)等。
4.为您的实例配置镜像。
5.为您的实例配置资源。
6.选择您的网络选项。为您的下一个云部署创建新的VCN和子网。确保您选择为实例分配公共IP地址。
7.生成并下载SSH密钥对。这一步是可选的,但强烈建议进行,以便于以后的维护和升级。如果您已经有密钥对,也可以使用您的公钥。如果您想了解如何生成SSH密钥,请按照“生成SSH密钥”教程中的说明操作。
8.点击“创建”来创建网络资源并启动计算实例。
为了使应用程序能从互联网访问,您需要开放应用程序将使用的端口。在这一部分中,您将配置您的云网络的安全列表和计算实例上的防火墙规则,以使您的应用程序能够发送和接收流量。
安全列表充当实例的虚拟防火墙,具有指定允许进出的流量类型的入站和出站规则。安全列表在子网级别配置,将安全规则应用于该子网中的所有网络元素。您的网络带有一个默认的安全列表,其中包含了一组初始规则。默认安全列表允许您使用SSH连接到实例,并允许实例对任何目的地进行出站网络调用。
3.在子网页面上,点击默认安全列表以查看详情并进行配置。
4.点击“添加入站规则”以添加新规则,允许符合规则的传入流量。
5.添加一个入站规则,允许在8080端口上的传入流量
a.将源CIDR设置为0.0.0.0/0。这允许来自所有源的传入流量。
b.将目的端口范围设置为8080。这将目的地设置为仅8080端口。现在,该规则允许来自所有源的流量使用8080端口。这正是我们所需要的,以便我们的应用程序可以从任何地方访问。
c.提供描述
防火墙规则控制实例进出的数据包级别流量。您需要直接在实例本身配置防火墙规则,为您提供额外的安全级别。
OCI为其客户免费提供Oracle GraalVM企业版。GraalVM企业版支持包含在Oracle云订阅中。高性能的基于Arm的计算形态与OCI上的GraalVM企业版结合,为现有和新的企业应用程序提供了一个引人注目的平台。
安装完成后,GraalVM可在/usr/lib64/graalvm目录中找到。
GraalVM包含了一个JDK,并且默认情况下,它用GraalVM编译器替换了Java顶级JIT编译器。新颖且创新的GraalVM编译器可以提升您现有JVM语言应用程序的性能。安装GraalVM后,java运行时就可在您的系统上使用,您可以使用以下命令检查版本。
作为现有Java应用程序的一个例子,我们可以运行Spring PetClinic示例应用程序,该应用程序是用Spring Boot构建的。
2.构建并运行应用程序。
您第一次运行应用程序时,Maven将下载依赖项。下载完成可能需要几分钟时间。您应该看到类似以下示例的输出:
2021-03-05 18:11:28.447 INFO 3704 --- [ main] o.s.s.petclinic.PetClinicApplication : No active profile set, falling back to default profiles: default
2021-03-05 18:11:31.531 INFO 3704 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-03-05 18:11:31.697 INFO 3704 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 144 ms. Found 4 JPA repository interfaces.
2021-03-05 18:11:33.436 INFO 3704 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-03-05 18:11:33.720 INFO 3704 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-03-05 18:11:33.721 INFO 3704 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5133 ms
2021-03-05 18:11:34.797 INFO 3704 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-03-05 18:11:34.902 INFO 3704 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.28.Final
2021-03-05 18:11:34.983 INFO 3704 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-03-05 18:11:35.266 INFO 3704 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
2021-03-05 18:11:36.838 INFO 3704 --- [ main] o.h.tuple.entity.EntityMetamodel : HHH000157: Lazy property fetching available for: org.springframework.samples.petclinic.owner.Owner
2021-03-05 18:11:37.094 INFO 3704 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2021-03-05 18:11:37.112 INFO 3704 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2021-03-05 18:11:38.696 INFO 3704 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-03-05 18:11:40.604 INFO 3704 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 13 endpoint(s) beneath base path '/actuator'
2021-03-05 18:11:40.758 INFO 3704 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-03-05 18:11:40.783 INFO 3704 --- [ main] o.s.s.petclinic.PetClinicApplication : Started PetClinicApplication in 13.846 seconds (JVM running for 14.906)
应用程序大约在14秒内启动。如您所见,GraalVM包含了完整的JDK,并且可以作为现有JVM的直接替代品。
要了解GraalVM可用的优化标志的更多信息,请参阅此处的文档。
GraalVM能够从您的Java应用程序创建自包含的可执行二进制文件,这些文件运行速度极快。GraalVM对您的Java代码的预编译处理了所有应用程序类、依赖关系和运行时库,并消除了JVM本身的开销和占用空间。然而,一些高级语言特性,如运行时代理和反射,需要额外配置。许多微服务Java框架,如Micronaut、Helidon和Quarkus,支持立即构建原生镜像。
1.首先,安装原生镜像工具。这些包在OCI的yum仓库中可用,但默认情况下并未安装。
在本教程中,我们使用Micronaut构建应用程序,因为Micronaut使用依赖注入和面向切面的运行时,而不使用反射。
2.使用以下命令在micronaut.io/launch上生成一个新项目以开始:
3.运行应用程序,看看它在JVM上启动需要多长时间:
您应该看到类似以下示例的输出:
应用程序在755毫秒内启动,这是令人印象深刻的。
4.现在,为应用程序构建一个原生镜像,并比较启动时间:
构建原生镜像大约需要5分钟。构建完成后,原生镜像将放置在target目录中,并以项目名称命名。
5.运行原生镜像。
您应该看到类似以下示例的输出:
原生镜像的启动速度快了40多倍,仅需18毫秒。
关键点在于,无论您的应用程序多简单或复杂,GraalVM原生镜像都能为您带来立即的性能提升。结合最新的基于Arm的计算形态和GraalVM企业版,Oracle云基础设施提供了一个无与伦比的平台,用于构建和发展您的企业工作负载。
作为Oracle的高级合作伙伴,Agilewing正重新定义企业体验Oracle云服务的方式。借助于其简化的开户流程和一流的技术支持,Agilewing将复杂的开户和操作流程转化为一种轻松、直观的体验。通过我们的一站式服务,您可以迅速开启并享受Oracle云的全方位服务,从而无缝融入云端世界。
Agilewing的AgileCDN服务,结合了OCI的云基础服务,提供了一流的全球内容加速解决方案。超过2800个全球POP节点和7000个直连点的强大网络,确保了无论您的业务扩展到全球哪个角落,都能保持高效稳定的运行。
利用Oracle云的先进技术,Agilewing致力于简化云服务搭建、云迁移和业务出海的过程。我们的合作模式为客户带来经济高效的解决方案,使他们能够更加专注于核心业务,同时享受Oracle云的高性能和安全保障。
Oracle云服务,作为一个充满潜力的领域,以其高性能、安全性和全球统一的服务标准,为各类企业开启了新的机遇之门。通过Agilewing的专业服务,无论是个人用户还是企业,都能轻松步入这个充满技术革新和高效能的新时代。现在,就让Agilewing引领您开始探索Oracle云服务,打开一个全新的世界大门。
如您想咨询 Oracle 的相关业务,可联系搜索微信号:lhh1843812463 或 woshiwhw123
或者可以进入以下群组进行咨询:
微信公众号
微信技术交流社群: