欢迎访问深圳敏捷云计算科技有限公司!

甲骨文云,如何在ARM服务器部署GraaIVM服务

2024-01-15 原创文章

本教程将引导您在Oracle云基础设施(OCI)的Ampere A1计算平台上启动并运行GraalVM。您将首先在JVM模式下运行Spring Boot应用程序,随后构建并以原生二进制形式运行Micronaut.io应用程序。利用GraalVM,不仅能提升现有应用程序的性能,还能为云端构建轻量级多语言应用程序。对于Ampere A1计算形态,它提供线性可扩展性和无与伦比的性价比,是理想的伴侣。

Ampere A1计算平台基于Ampere Altra CPU,为企业和应用开发者带来了一场革命,他们正构建从边缘设备到云数据中心可扩展的工作负载。这个平台的独特设计提供了一致且可预测的性能,因为计算核心内没有资源争夺,提供了更多的隔离和安全性。Oracle云基础设施上这一新类计算形态,结合Altra CPU的强大力量和OCI的安全性、可扩展性以及服务生态系统,提供了无与伦比的平台。

引言

什么是GraalVM?

GraalVM是一个高性能的运行时环境,适用于Java、JavaScript、基于LLVM的语言如C和C++,以及其他动态语言编写的应用程序。它显著提高了应用程序的性能和效率,因此可以帮助您更高效地在云平台上运行现有应用程序。

GraalVM还能为现有基于JVM的应用程序构建原生可执行二进制文件——原生镜像。所产生的原生镜像以机器代码形式包含整个程序,可立即执行,避免了JVM本身的启动和内存占用。这一能力使GraalVM成为构建云原生应用程序的理想选择,目前已有几种JVM语言的微服务框架今天包括这一功能。

教程目标

在本教程中,您将:

  • 创建一个Ampere A1计算实例
  • 安装GraalVM企业版
  • 使用GraalVM以JVM模式运行流行的Spring Boot示例应用程序Pet Clinic
  • 构建并以GraalVM原生镜像运行Micronaut应用程序
  • 评估在Ampere A1上使用GraalVM的适用性
  • 清理部署

先决条件

  1. Oracle免费层(试用)、付费或LiveLabs云账户
  2. 熟悉OCI控制台
  3. 网络概述
  4. 熟悉隔间
  5. 容器和Podman的基本概念知识

设置云环境

您将开始初始化Oracle云环境,用于创建和部署Java EE应用程序。该环境将包含在云隔间内,隔间内的通信将通过虚拟云网络(VCN)进行。隔间和VCN将隔离并保护整体环境。您将创建一个Ampere A1计算实例,以安装并使用GraalVM企业版运行应用程序。

OCI基础设施建设简介

  1. 打开导航菜单。在“治理与管理”下,进入“身份认证”并点击“隔间”。在此屏幕上,您将看到隔间列表,点击“创建隔间”。
  2. 输入以下信息:名称:输入“AppDev”。描述:输入描述(必填),例如:“AppDev隔间用于入门教程”。避免输入机密信息。父隔间:选择您希望该隔间所在的隔间。默认为根隔间(或租户)。点击“创建隔间”。您的隔间将显示在列表中。

创建Ampere A1计算实例

  1. 要创建Ampere A1计算实例,请使用控制台左上角的导航菜单,前往“计算实例”。
  2. 打开实例创建流程。
  • 验证您处于AppDev隔间中
  • 点击“创建实例”。

3.在创建实例页面,您将创建新实例以及新的网络资源,如虚拟云网络(VCN)、互联网网关(IG)等。

  • 将实例命名为GraalVMApp
  • 更新镜像选择,使用Oracle Linux 7.9。
  • 点击“更改形状”按钮查看可用的计算形状。

4.为您的实例配置镜像。

  1. 点击“更改镜像”按钮查看可用的操作系统镜像。
  2. 选择Oracle Linux 7.9。

5.为您的实例配置资源。

  1. 在形状系列选择中选择Ampere Arm基础处理器。
  2. 从带有Ampere Arm基础处理器的形状列表中选择VM.Standard.A1.Flex 形状。Ampere A1形状是灵活的,您可以修改核心数和内存量。为VM选择1个核心和6 GB内存。

6.选择您的网络选项。为您的下一个云部署创建新的VCN和子网。确保您选择为实例分配公共IP地址。
7.生成并下载SSH密钥对。这一步是可选的,但强烈建议进行,以便于以后的维护和升级。如果您已经有密钥对,也可以使用您的公钥。如果您想了解如何生成SSH密钥,请按照“生成SSH密钥”教程中的说明操作。

8.点击“创建”来创建网络资源并启动计算实例。

向用户公开应用程序端口

为了使应用程序能从互联网访问,您需要开放应用程序将使用的端口。在这一部分中,您将配置您的云网络的安全列表和计算实例上的防火墙规则,以使您的应用程序能够发送和接收流量。

配置您的虚拟云网络(VCN)

安全列表充当实例的虚拟防火墙,具有指定允许进出的流量类型的入站和出站规则。安全列表在子网级别配置,将安全规则应用于该子网中的所有网络元素。您的网络带有一个默认的安全列表,其中包含了一组初始规则。默认安全列表允许您使用SSH连接到实例,并允许实例对任何目的地进行出站网络调用。

配置安全列表以公开应用程序端口

  1. 导航到您创建的实例的详细信息页面。计算实例点击您创建的实例
  2. 通过点击子网,导航到实例所连接的子网

3.在子网页面上,点击默认安全列表以查看详情并进行配置。

4.点击“添加入站规则”以添加新规则,允许符合规则的传入流量。

5.添加一个入站规则,允许在8080端口上的传入流量

a.将源CIDR设置为0.0.0.0/0。这允许来自所有源的传入流量。

b.将目的端口范围设置为8080。这将目的地设置为仅8080端口。现在,该规则允许来自所有源的流量使用8080端口。这正是我们所需要的,以便我们的应用程序可以从任何地方访问。

c.提供描述

配置您的实例

防火墙规则控制实例进出的数据包级别流量。您需要直接在实例本身配置防火墙规则,为您提供额外的安全级别。

  1. 导航到您创建的实例的详细信息页面。计算实例点击您创建的实例。
  2. 复制您实例的公共IP地址。
  3. 使用SSH连接到实例。使用您自己生成的密钥或在实例创建步骤中提供的密钥。使用Oracle Linux操作系统的实例的默认用户名是opc。
  4. 执行防火墙配置命令。这将修改实例本身的防火墙,以暴露8080端口并接受传入流量。

在Ampere A1上安装并使用GraalVM企业版

OCI为其客户免费提供Oracle GraalVM企业版。GraalVM企业版支持包含在Oracle云订阅中。高性能的基于Arm的计算形态与OCI上的GraalVM企业版结合,为现有和新的企业应用程序提供了一个引人注目的平台。

  1. 导航到您创建的实例的详细信息页面。计算实例点击您创建的实例。
  2. 复制您实例的公共IP地址。
  3. 使用SSH登录到实例。使用您自己生成的密钥或在实例创建步骤中提供的密钥。使用Oracle Linux操作系统的实例的默认用户名是opc。 要在OCI上安装GraalVM和Git,请运行以下命令:


安装完成后,GraalVM可在/usr/lib64/graalvm目录中找到。

在GraalVM上运行现有Java应用程序

GraalVM包含了一个JDK,并且默认情况下,它用GraalVM编译器替换了Java顶级JIT编译器。新颖且创新的GraalVM编译器可以提升您现有JVM语言应用程序的性能。安装GraalVM后,java运行时就可在您的系统上使用,您可以使用以下命令检查版本。

作为现有Java应用程序的一个例子,我们可以运行Spring PetClinic示例应用程序,该应用程序是用Spring Boot构建的。

  1. 克隆仓库以开始。

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将复杂的开户和操作流程转化为一种轻松、直观的体验。通过我们的一站式服务,您可以迅速开启并享受Oracle云的全方位服务,从而无缝融入云端世界。

Agilewing的AgileCDN服务,结合了OCI的云基础服务,提供了一流的全球内容加速解决方案。超过2800个全球POP节点和7000个直连点的强大网络,确保了无论您的业务扩展到全球哪个角落,都能保持高效稳定的运行。

利用Oracle云的先进技术,Agilewing致力于简化云服务搭建、云迁移和业务出海的过程。我们的合作模式为客户带来经济高效的解决方案,使他们能够更加专注于核心业务,同时享受Oracle云的高性能和安全保障。

Oracle云服务,作为一个充满潜力的领域,以其高性能、安全性和全球统一的服务标准,为各类企业开启了新的机遇之门。通过Agilewing的专业服务,无论是个人用户还是企业,都能轻松步入这个充满技术革新和高效能的新时代。现在,就让Agilewing引领您开始探索Oracle云服务,打开一个全新的世界大门。

如您想咨询 Oracle 的相关业务,可联系搜索微信号:lhh1843812463woshiwhw123

或者可以进入以下群组进行咨询:

微信公众号

微信技术交流社群: