云原生应用之--SpringNative 实战

简介: 云原生应用之--SpringNative 实战

1.1 Graalvm

1.1.1 简介

GraalVM 是一种高性能运行时,可显着提高应用程序性能和效率,非常适合微服务. 对于 Java 程序 GraalVM 负责将 Java 字节码编译成机器码,映像生成过程使用静态分析来查找可从主 Java 方法访问的任何代码,然后执行完全提前 (AOT) 编译。生成的本机二进制文件包含机器代码形式的整个程序,以便立即执行。

1.

1.1.2 环境准备

  • Brew 安装

  brew install --cask graalvm/tap/graalvm-ce-lts-java11

  gu install native-image

1.2.1.2.

复制

  • 下载安装
  1. 下载 GraalVM : https://www.graalvm.org/downloads/
  2. 配置环境变量:JAVA_HOME 和 PATH
  3. 运行 gu install native-image

1.1.3 运行 demo

// 创建 HelloWorld.java 文件

public class HelloWorld {

   public static void main(String[] args) {

   

       System.out.println("Hello, World!");

   }

}

// 执行编译

javac HelloWorld.java

native-image HelloWorld

//运行

./helloworld

Hello, World!

1.2.3.4.5.6.7.8.9.10.11.12.13.1.2.3.4.5.6.7.8.9.10.11.12.13.

复制

1.2 Spring Native

1.2.1 简介

Spring Native 原生镜像可以在许多场景下降低工作负载,包括微服务,函数式服务,非常适合容器和 Kubernetes。优点:快速启动,提高峰值性能以及降低内存消耗缺点:构建过程慢, 预热后的运行时优化少常规 JVM 和此本机映像平台之间的主要区别:

  • 在构建时会从主入口点对应用程序进行静态分析。
  • 在构建时将未使用的零件删除。
  • 反射,资源和动态代理需要配置。
  • 类路径在构建时是固定的。
  • 没有类延迟加载:可执行文件中附带的所有内容都将在启动时加载到内存中。
  • 一些代码将在构建时运行。
  • 一些 Java 切面类的特性未得到完全支持。组成模块Spring Native 由以下模块组成:
  • spring-native:运行Spring Native所需的运行时依赖,还提供了Native hints API。
  • spring-native-configuration:Spring AOT 插件使用的 Spring 类的配置提示,包括各种 Spring Boot 自动配置。
  • spring-native-docs:参考指南,采用 asciidoc 格式。
  • spring-native-tools:用于查看镜像构建配置和输出的工具。
  • spring-aot:Maven 和 Gradle 插件公共的 AOT 转换基础架构。
  • spring-aot-gradle-plugin:AOT 转换的 Gradle 插件。
  • spring-aot-maven-plugin:AOT 转换的 Maven 插件。
  • samples:包含各种演示功能用法的示例,也用于集成测试。

2. 快速上手

主要有两种的方式来构建 Spring Boot 原生应用:使用 Spring Boot Buildpacks Support 生成一个包含本地可执行文件的轻量级容器。使用 GraalVM native image Maven plugin support 来生成本地可执行文件。

2.1 通过 Buildpacks 上手

2.1.1 系统要求

需要安装 Docker,并至少分配 8G 内存, 以及更多的 CPU

2.1.2 初始化 DEMO 项目

通过 https://start.spring.io/ 初始化 demo 工程

2.1.3 构建原生应用

可以按以下命令构建本地应用程序:

  • Maven $ mvn spring-boot:build-image
2.1.3.1 编译加速

资料:https://paketo.io/docs/howto/configuration/直接执行编译命令,因为要从 github 下载相关依赖,会非常慢,慢到你怀疑人生, 而且大多数时候会下载失败, 如图image.png则可以通过以下方法进行加速

  1. 下载构建需要的文件到本地,或上传到 OSS

https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-21.3.0

graalvm-ce-java11-linux-amd64-21.3.0.tar.gz

graalvm-ce-java11-linux-amd64-21.3.0.tar.gz.sha256 (sha256校验码)

native-image-installable-svm-java11-linux-amd64-21.3.0.jar

native-image-installable-svm-java11-linux-amd64-21.3.0.jar.sha256 (sha256校验码)

1.2.3.4.5.1.2.3.4.5.

复制

  1. 在工程根目录 bindings/dependency-mapping 创建 binding 文件
  2. 创建 type 文件:echo ‘dependency-mapping’ >type
  3. 查看文件校验码

也可以通过 https://github.com/paketo-buildpacks/graalvm/blob/main/buildpack.toml 网站进行查看

  1. 在工程根目录 bindings/dependency-mapping 创建 mapping 文件
  • 本地文件方式

echo 'file://{docker 内文件目录}/graalvm-ce-java11-linux-amd64-21.3.0.tar.gz'>3a1bc8eaf0518c128aaacb987ceb0b0e288776f48af630c11c01fd31122d93fa

echo 'file://{docker 内文件目录}/native-image-installable-svm-java11-linux-amd64-21.3.0.jar'>8958d4e0cad07340db0cf9e871776809e2f08fe0c93960f728fec75c4a96764f

1.2.1.2.

复制

  • Oss 方式

echo 'https://max-volador.oss-cn-hangzhou.aliyuncs.com/graalvm/dependency/graalvm-ce-java11-linux-amd64-21.3.0.tar.gz'>3a1bc8eaf0518c128aaacb987ceb0b0e288776f48af630c11c01fd31122d93fa

echo 'https://max-volador.oss-cn-hangzhou.aliyuncs.com/graalvm/dependency/native-image-installable-svm-java11-linux-amd64-21.3.0.jar'>8958d4e0cad07340db0cf9e871776809e2f08fe0c93960f728fec75c4a96764f

1.2.1.2.

复制

  1. 最后一步, 修改 pom.xml 配置,配置完成后就可以快乐的执行编译命令

<plugin>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-maven-plugin</artifactId>

  <configuration>

     <classifier>${repackage.classifier}</classifier>

     <image>

        <builder>paketobuildpacks/builder:tiny</builder>

        <env>

           <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>

           <SERVICE_BINDING_ROOT>/bindings</SERVICE_BINDING_ROOT>

        </env>

        <!-- 文件挂载 -->

        <bindings>

           <binding>${basedir}/bindings/dependency-mapping:/bindings/dependency-mapping</binding>

           <!--suppress UnresolvedMavenProperty -->

           <binding><absolute-binding-path>: {docker 内文件目录} </binding>

        </bindings>

     </image>

  </configuration>

</plugin>

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.

2.1.4 运行原生应用

$ docker run --rm -p 8080:8080 demo:0.0.1-SNAPSHOT

1.1.

复制

2.2 通过原生镜像的 Maven 插件上手

2.2.1 系统要求

  1. Docker 8G 以上内存
  2. Graalvm 环境

2.2.2 初始化 DEMO 项目

通过 https://start.spring.io/ 初始化 demo 工程

2.2.3 构建原生应用

$ mvn -Pnative-image package上面的命令会创建一个本地可执行文件,该可执行文件在 target 目录中。

2.2.4 运行原生应用程序

$ ./target/demo

3. 开发进阶

3.1 Spring AOT

Spring AOT构建插件旨在通过利用应用程序的上下文(类路径,配置)来生成和编译源代码,从而改善本机图像的兼容性和占用空间。

3.1.1 Maven

<build>

   <plugins>

       <!-- ... -->

       <plugin>

           <groupId>org.springframework.experimental</groupId>

           <artifactId>spring-aot-maven-plugin</artifactId>

           <version>0.10.4</version>      

           <configuration>

               <removeSpelSupport>true</removeSpelSupport>

               <removeUnusedConfig>true</removeUnusedConfig>

               <removeYamlSupport>true</removeYamlSupport>

               <removeXmlSupport>false</removeXmlSupport>

           </configuration>

           <executions>

               <execution>

                   <id>test-generate</id>

                   <goals>

                       <goal>test-generate</goal>

                   </goals>

               </execution>

               <execution>

                   <id>generate</id>

                   <goals>

                       <goal>generate</goal>

                   </goals>

               </execution>

           </executions>

       </plugin>

   </plugins>

</build>

1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.

复制

3.1.2 配置 Spring AOT

  • mode 切换插件真实为本地镜像编译器提供多少配置:
  • native (默认)提供本地镜像以及代理的资源,初始化,代理和反射(使用自动配置提示)配置。
  • native-init 如果仅希望提供初始化配置和替换,则应使用。
  • native-agent 正在使用跟踪代理程序生成的配置作为基础,并且还为控制器等组件提供了其他提示。
  • removeXmlSupporttrue 默认情况下设置为 true,优化空间占用,将其设置为 false 恢复 Spring XML 支持(XML converters, codecs and XML application context support)。
  • removeSpelSupport默认情况下设置为 false,设置为 true 删除 Spring SpEL 支持以优化空间占用(应仅在不需要 SpEL 的应用中使用)。
  • removeYamlSupport 默认情况下设置为 false,设置为则true 删除Spring Boot Yaml支持以优化空间占用。
  • removeJmxSupport 默认情况下设置为 true,以优化空间占用,将其设置为false 恢复 Spring Boot JMX支持。
  • verify 默认情况下设置为 true,执行一些自动验证以确保应用可以本地编译, 设置为 false 关闭验证。
  • debugVerify 默认设置为false,设置为 true 时启用验证调试。
  • removeUnusedConfig默认情况下设置为 true,设置为 false 禁用删除未使用的配置。
  • failOnMissingSelectorHint 默认情况下设置为 true,如果没有为激活的选择器提供提示数据,则抛出错误,设置为 false 将插件从抛出错误切换为警告。
  • [Experimental] buildTimePropertiesMatchIfMissing 默认设置为 true。将其设置为 false 意味着指定 matchIfMissing=true 的任何属性都将被覆盖且不报错。
  • [Experimental] buildTimePropertiesChecks(实验)打开一些与属性相关的配置条件构建时间的评估。它必须至少包含 default-include-all或 default-exclude-all 的初始参数, 然后可以使用逗号分隔的前缀列表,以明确包含或排除(例如 default-include-all,!spring.dont.include.these.,!or.these 或 default-exclude-all,spring.include.this.one.though.,and.this.one)。前缀匹配最长的属性将会被应用(如果属性与多个前缀匹配)。

3.1.3. native-image 配置

Spring Native 通过 Spring AOT build plugin 在 META-INF/native-image 下自动生成配置文件 native-image.properties,reflect-config.json,proxy-config.json 或 resource-config.json:

3.2 Spring-native 扩展

3.2.1 通过 @NativeHint 实现

@NativeHint(options = "native-image 命令行参数",

types="反射类配置",

aotProxies="复杂代理类配置",

jdkProxies="JDK 动态代理类配置",

serializables="序列化类配置,

resources="资源文件配置",

initialization="应该在构建时或运行时显式初始化的类/包",

imports="共享类导入")

@NativeHint(options = {"-H:+ReportExceptionStackTraces"})

1.2.3.4.5.6.7.8.9.10.11.1.2.3.4.5.6.7.8.9.10.

复制

3.2.2 通过 配置文件实现

在 META-INF/native-image 下 ${groupId}.${artifactId} 新增配置文件

reflect-config.json: 反射配置

serialization-config.json: 序列化配置

proxy-config.json: 动态代理配置

resource-config.json: 外部文件配置

1.2.3.4.5.1.2.3.4.5.

复制

4. 常见问题

4.1 构建问题

4.1.1 在构建时意外初始化了 DataSize

Error: Classes that should be initialized at run time got initialized during image building:

org.springframework.util.unit.DataSize was unintentionally initialized at build time. To see why org.springframework.util.unit.DataSize got initialized use --trace-class-initialization

1.2.1.2.

复制

缺乏 spring-native 依赖项和Spring AOT plugin

4.1.2 构建本机映像时出现内存不足错误

Error: Image build request failed with exit status 137。native-image 会消耗大量 RAM,因此建议您使用至少 16G RAM 的计算机

4.1.3 Builder 生命周期 ‘creator’ 失败,状态码为 145

Error: Image build request failed with exit status 145。内存不足, 网络问题等

4.1.4 缺少资源包

Caused by: java.util.MissingResourceException:

 Resource bundle not found javax.servlet.http.LocalStrings.

 Register the resource bundle using the option

   -H:IncludeResourceBundles=javax.servlet.http.LocalStrings.

1.2.3.4.1.2.3.4.

复制

4.2 运行问题

4.2.1 序列化&反序列化失败问题

反序列化失败

DemoResponse(data=null, code=null, message= null)

序列化失败

在 META-INF/native-image/${groupId}/${artifactId}/serialization-config.json 添加需要进行序列化的类信息

[

{

  "name": "com.springnative.demo.response.DemoResponse"

}

]

1.2.3.4.5.6.7.8.9.1.2.3.4.5.6.7.8.9.

复制

4.2.2 反射问题

在 META-INF/native-image/${groupId}/${artifactId}/reflect-config.json 中添加需要用到反射的类信息

{

 "name": "com.springnative.demo.response.DemoResponse",

 "allDeclaredFields": true,

 "allDeclaredConstructors": true,

 "allDeclaredMethods": true,

 "allPublicMethods": true,

 "allDeclaredClasses": true

}

1.2.3.4.5.6.7.8.9.1.2.3.4.5.6.7.8.9.

复制

4.2.3 apache httpclient 调用失败, 采用 java.net.http.HttpClient 替换

4.2.4 mybatis-plus 初始化问题 & mapper 失效问题 (待补充)

5. 参考资料

Spring Native documentationGraalvmgraalvm-ce-buildsSpring-native Githubpaketo

相关文章
|
9天前
|
Kubernetes 监控 Cloud Native
全栈声明式可观测:KubeVela开箱即用且灵活定制的云原生应用洞察
KubeVela 是一个开箱即用的现代化应用交付与管理平台。本文我们将聚焦 KubeVela 的可观测体系,介绍云原生时代的可观测挑战及 KubeVela 的解决方案。
|
2天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
3天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第6天】 在数字化转型的浪潮中,企业正迅速采纳云原生技术以实现敏捷性、可扩展性和弹性。本文深入探讨了如何利用Kubernetes这一领先的容器编排平台,结合微服务架构,构建和维护高效、可伸缩的云原生应用。通过分析现代软件设计原则和最佳实践,我们提出了一个综合指南,旨在帮助开发者和系统架构师优化云资源配置,提高部署流程的自动化水平,并确保系统的高可用性。
24 1
|
4天前
|
Kubernetes Cloud Native Docker
使用 kubevpn 在本地快速开发云原生应用
KubeVPN 是一个用于云原生开发的工具,它允许用户通过本地计算机直接访问远程 Kubernetes 集群中的服务,利用 k8s DNS 或 Pod IP/Service IP。它可以拦截并调试服务网格中的工作负载流量,并提供开发模式,让容器在本地以与 k8s pod 相同的环境运行。快速开始包括下载二进制文件、自定义 Krew 安装、构建二进制文件以及安装示例应用。KubeVPN 支持链接到多个集群、DNS 解析、反向代理,以及在 Docker 中的开发模式,确保与 Kubernetes 运行环境一致。此外,它还兼容多种协议和平台。
23 5
|
8天前
|
Cloud Native 安全 持续交付
构建未来:云原生架构在现代企业中的应用与挑战
【5月更文挑战第1天】 随着数字化转型的深入,云原生技术以其灵活性、可扩展性和敏捷性成为现代企业IT架构的核心。本文将探讨云原生架构的关键组件,包括容器化、微服务、持续集成/持续部署(CI/CD)以及DevOps实践,并分析它们如何共同塑造企业的运营模式。同时,文章还将讨论在采纳云原生过程中企业可能遇到的挑战,如安全性问题、技术复杂性以及组织文化的转变,并提出应对策略。
27 8
|
8天前
|
运维 Cloud Native 持续交付
构建未来:云原生技术在企业数字化转型中的应用
【5月更文挑战第1天】 随着企业加速其数字化转型的步伐,云原生技术作为推动创新和灵活性的关键力量,正变得日益重要。本文深入探讨了云原生技术如何为企业提供高度可扩展、灵活且安全的解决方案,以及它如何支持企业在不断变化的市场环境中保持竞争力。通过对容器化、微服务架构、持续集成/持续部署(CI/CD)等核心技术的剖析,揭示了它们如何共同塑造一个更加敏捷和响应迅速的开发环境。文章还讨论了企业在采纳云原生技术过程中面临的挑战,并提出了一系列策略建议,以帮助企业顺利过渡到云原生模式。
|
8天前
|
机器学习/深度学习 Cloud Native Devops
深度学习在图像识别中的应用与挑战构建未来:云原生技术在企业数字化转型中的关键作用
【4月更文挑战第30天】 随着人工智能技术的飞速发展,深度学习已成为推动计算机视觉领域进步的关键力量。尤其在图像识别任务中,深度神经网络通过学习海量数据中的复杂模式,显著提高了识别的准确率和效率。然而,尽管取得了显著成就,深度学习在图像识别应用过程中仍面临一系列挑战,包括模型泛化能力、计算资源消耗以及对抗性攻击等。本文旨在探讨深度学习技术在图像识别领域的应用现状,并分析其面临的主要技术挑战和未来的发展方向。 【4月更文挑战第30天】 随着企业加速迈向数字化时代,传统的IT架构正面临重大挑战。云原生技术以其灵活性、可扩展性和敏捷性,成为推动企业转型的重要力量。本文将探讨云原生技术的基本原理,分
|
9天前
|
监控 Cloud Native 持续交付
构建未来:云原生技术在企业数字化转型中的应用
【4月更文挑战第30天】 随着云计算技术的成熟,云原生(Cloud-Native)架构已成为推动企业数字化转型的关键驱动力。本文将深入探讨云原生技术的核心组件、实施策略以及它们如何促进企业的敏捷性、可扩展性和创新能力。通过案例分析,我们将揭示云原生实践的最佳模式和面临的挑战,为追求技术前沿的企业提供可行的转型蓝图。
|
9天前
|
Cloud Native Devops 持续交付
构建未来应用:云原生架构在现代企业中的实践与挑战
【4月更文挑战第29天】 随着数字化转型的加速,企业正迅速转向云计算以支撑其业务敏捷性和创新。云原生技术,作为推动这一转型的关键因素,正在重新定义软件开发和运维模式。本文将深入探讨云原生架构的核心组件,包括容器化、微服务、持续集成/持续部署(CI/CD)以及DevOps文化,并分析这些技术如何帮助企业实现弹性、可扩展和高效的应用部署。同时,我们将讨论在采纳云原生实践中所面临的挑战,包括安全性、治理和人才缺口等问题。
|
9天前
|
Cloud Native Devops 持续交付
构建未来:云原生架构在现代企业中的应用与挑战
【4月更文挑战第29天】 随着数字化转型的不断深入,企业的IT架构正经历着根本性的变革。云原生技术以其独特的弹性、可扩展性和敏捷性成为这一转型的关键驱动力。本文将探讨云原生架构的核心组件,包括容器化、微服务、持续集成/持续部署(CI/CD)以及DevOps实践,并分析这些技术如何帮助企业实现快速迭代和高效运营。同时,我们也将识别在采纳云原生技术过程中可能遇到的挑战,并提出相应的解决策略。通过实际案例分析,本文旨在为决策者提供实施云原生架构的洞见,以加速其业务创新和市场响应速度。

热门文章

最新文章