前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >轻量灵动:革新轻量级服务开发

轻量灵动:革新轻量级服务开发

作者头像
京东技术
发布于 2023-08-22 07:32:44
发布于 2023-08-22 07:32:44
33900
代码可运行
举报
文章被收录于专栏:京东技术京东技术
运行总次数:0
代码可运行

Tech 导读 Java虽然在市场份额占比巨大,但是在万物云原生下,因它启动时长,资源消耗较大,不易水平扩展等方面都成为了明显的短板,导致市场份额也逐渐减少。而GraalVM弥补了这些缺陷,本文将从实战方向带你打开,原生镜像之路。

01

概念篇

在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!

1.1 从JDK8->JDK17 你需要知道的

从 JDK 8 升级到 JDK 17 可以让你的应用程序受益于新的功能、性能改进和安全增强。下面是一些 JDK 8 升级到 JDK 17 的最佳实战:

1.1.1 确定升级的必要性:

首先,你需要评估你的应用程序是否需要升级到 JDK 17。查看 JDK 17 的新特性、改进和修复的 bug,以确定它们对你的应用程序是否有实际的好处。

1.1.2 了解 JDK 8 到 JDK 17 的变化:

详细了解 JDK 8 和 JDK 17 之间的差异是非常重要的。熟悉 JDK 17 中引入的新特性、移除的特性以及可能影响现有代码的变化。

1.1.3 解决向后不兼容的变化 更新依赖项和框架:

在升级过程中,可能会遇到一些向后不兼容和框架不兼容的变化。例如,一些 API 的使用方式可能发生了变化,或者一些方法已被废弃。在升级之前,你需要对这些变化进行仔细的检查,并相应地修改你的代码。

1.1.4 进行兼容性测试

在升级之前,进行兼容性测试是非常重要的。确保你的应用程序在 JDK 17 下能够正常运行,并且没有出现任何性能下降或功能问题。可以使用自动化测试工具来简化测试过程。

1.1.5 逐步升级:

对于大型应用程序或关键系统,建议逐步进行升级。可以先将应用程序迁移到较新的 JDK 版本,如 JDK 11 或 JDK 14,然后再逐步升级到 JDK 17。这样可以降低升级过程中的风险,并使你能够逐步解决遇到的问题。

1.1.6 监控和优化性能:

升级到 JDK 17 后,你可能会注意到一些性能改进。然而,某些代码可能会受到影响并表现出不同的行为。使用性能监控工具来检测潜在的性能问题,并进行必要的调整和优化。

1.1.7 更新部署和运维流程:

升级 JDK 版本后,你可能还需要更新你的部署和运维流程。例如,JDK 17 中引入了一些新的命令行工具和管理选项。

1.2 为什么要使用jdk17?

1.2.1 长期支持(LTS):

JDK 版本中的一些版本被标记为长期支持版本,这意味着它们将获得更长时间的支持和维护。JDK 17 是 OpenJDK 的一个 LTS 版本。

1.2.2 生态系统支持:

一些开源项目、框架和工具可能会更早地支持较新的 JDK 版本,以利用新的特性和改进。选择较新的 JDK 版本可以使你能够使用最新的工具和库,并获得更好的生态系统支持。

1.2.3 新功能和改进:

每个 JDK 版本都会引入新的功能、增强和改进。

1.3 强强联合GraalVM

GraalVM 是一种开源的【通用】虚拟机(通用: 它具有支持多种编程语言的能力 直接在 graalvm运行 不需要额外的运行时环境),具有许多特性和优势,使得它在特定的场景中成为一个有吸引力的选择。以下是一些使用 GraalVM 的原因:

1.3.1 高性能:

GraalVM 具有优化的即时编译器,能够将 Java 程序编译成高效的机器码。在许多情况下比传统的 Java 虚拟机更快。

1.3.2 AOT 编译:

GraalVM 可以将 Java 程序静态编译成本地机器码,这被称为 Ahead-of-Time(AOT)编译。AOT 编译可以提供更快的启动时间和更低的内存消耗,适用于一些对性能要求较高的场景。

1.3.3 生态系统支持:

GraalVM 在开发者社区中有广泛的支持和活跃的生态系统。许多开源项目和框架已经对 GraalVM 进行了优化和集成,使得使用 GraalVM 更加方便和无缝。

1.3.4 嵌入式支持:

GraalVM 提供了嵌入式 API,允许你将 GraalVM 作为库集成到你的应用程序中。这意味着你可以将 GraalVM 作为运行时引擎嵌入到你的应用程序中,从而实现更高的灵活性和自定义性。

1.3.5 云原生支持:

GraalVM 具有与云原生应用程序开发和部署相关的特性。它可以与 Docker 和 Kubernetes 配合使用,支持快速启动和低内存消耗,适用于云环境中的微服务架构

02

实战篇

理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。

2.1 第一步建议先升级依赖项

如果你的项目基于java 8,在升级前最好先升级依赖项,从java 8升级到java 17是一个很大的跨越,依赖项不升级则出问题的概率会比较高,maven可以用mvn versions:display-dependency-updates命令检查依赖项更新,输出会类似这样:

图1.检查依赖项更新输出示意

然后可以把依赖项升级到输出的对应版本,大部分包升级不会出问题,如果有问题,建议去出问题的依赖官方仓库寻找解决方案。这个命令是直接查询maven远程仓库,如果依赖项多的话会运行比较长的时间

或者 jdeps --jdk-internals --multi-release 17 --class-path . encloud-api.jar

javax.annotation.*被移除 可以手动倒入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
</dependency>

常见的标记为废弃的参数 迁移前后的参数如下:

图2.迁移前后的参数示意

2.2 环境安装

2.2.1 Jdk环境安装 https://www.graalvm.org/downloads/

版本对比、一张官方的对比图

图3.官方的版本对比图示意

升级时springboot和springcloud版本对应表:https://start.spring.io/actuator/info

2.2.2 maven环境安装 https://maven.apache.org/download.cgi

GraalVM对maven没有特定的版本要求。通常情况下,只要您使用的Maven版本足够新并支持Java 8或更高版本,就可以与GraalVM一起使用。建议您使用Maven 3.5.x 或更高版本以确保与GraalVM的兼容性。

启动java器使用 GraalVM 默认编译器 Graal 运行 JVM。安装时检查Java版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$JAVA_HOME/bin/java -version

2.3 二进制的生成

2.3.1 安装本机映像

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gu install native-image
该native-image工具安装在$JAVA_HOME/bin目录中

2.3.2 maven构建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn clean package -Pnative -Dmaven.test.skip=true

2.4 出现的坑点

2.4.1 对于mac 提前安装 glibc-devel

2.4.2 对于 centos 提前安装

yum install centos-release-scl

yum install devtoolset-8

source /opt/rh/devtoolset-8/enable

yum install zlib-devel

否则编译出现 会编译失败 gcc需要升级到6.4以上

报错如下:

图4、5.报错示意

2.4.3 对于java 应用来说 打出来的二进制可能出现乱码 因此需要强制指定

图6.强制指定示意

2.5 模块化 初体验

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 git clone https://github.com/graalvm/graalvm-demos
 cd graalvm-demos/native-hello-module
 结构图
 ├── hello
│   └── Main.java
│       > package hello;>> public class Main {>     public static void main(String[] args) {>         System.out.println("Hello from Java Module: ">             + Main.class.getModule().getName());>     }> }
│
└── module-info.java
    > module HelloModule {
    >     exports hello;
    > }
    
 mvn package
 $JAVA_HOME/bin/java --module-path target/HelloModule-1.0-SNAPSHOT.jar --module HelloModule
 $JAVA_HOME/bin/native-image --module-path target/HelloModule-1.0-SNAPSHOT.jar --module HelloModule
 ./hellomodule

2.6 编译器操作模式

Graal 作为 HotSpot JIT 编译器有两种运行模式:

libgraal:Graal 编译器提前编译到本地共享库中。在这种运行模式下,共享库由 HotSpot VM 加载。编译器使用与 HotSpot 堆分开的内存,并且从一开始就运行得很快,因为它不需要预热。这是默认和推荐的操作模式。

jargraal:Graal 编译器经历与 Java 应用程序的其余部分相同的预热阶段。也就是说,在编译其热方法之前首先对其进行解释。-XX:-UseJVMCINativeLibrary使用命令行选项选择此模式。这将延迟达到最佳性能的时间。

2.7 本机映像构建配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
maven常用配置
<buildArgs>
如果要将其他参数传递给本机图像生成器,请<buildArgs> 在插件的配置中使用
<buildArgs>
    <arg>--argument</arg>
</buildArgs>
<skipNativeBuild>
要跳过本机图像的生成,请在插件的配置中提供以下内容:
<skipNativeBuild>true</skipNativeBuild>
<skipNativeTests>
要跳过本机图像编译测试的生成和执行,请在插件的配置中提供以下内容:
<skipNativeTests>true</skipNativeTests>
<debug>
如果要启用调试信息的生成,请在插件配置中提供以下内容:
<debug>true</debug>
<useArgFile>
如果要使用参数文件构建原生图像,请在插件配置中提供以下内容:
<useArgFile>true</useArgFile>

2.8 日志记录添加到本机可执行文件

1、默认情况下,由 Native Image 生成的本机可执行文件支持通过java.util.logging.*API 进行日志记录。

2、本机可执行文件中的默认日志记录配置基于 logging.properties 在 JDK 中找到的文件。该文件配置了一个 java.util.logging.ConsoleHandler 只显示该 INFO 级别及以上级别的消息的文件,如果您需要额外的日志记录处理程序,则必须注册相应的类以进行反射。例如,如果您使用 java.util.logging.FileHandlerthen 提供以下反射配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "name" : "java.util.logging.FileHandler",
    "methods" : [
      { "name" : "<init>", "parameterTypes" : [] },
    ]
  }

3、将以下 Java 代码保存到名为LoggerRunTimeInit.java的文件中,然后使用以下命令对其进行编译javac

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.IOException;
 import java.util.logging.Level;
 import java.util.logging.LogManager;
 import java.util.logging.Logger;

 public class LoggerTest {
     public static void main(String[] args) throws IOException {
         LogManager.getLogManager().readConfiguration(LoggerRunTimeInit.class.getResourceAsStream("/logging.properties"));
         Logger logger = Logger.getLogger(LoggerRunTimeInit.class.getName());
         logger.log(Level.WARNING");
     }
 }

4、下载 logging.properties 资源文件 (https://www.graalvm.org/docs/reference-manual/native-image/assets/logging.properties) 并将其保存在与 LoggerRunTimeInit.java 相同的目录中。

5、构建并运行本机可执行文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 native-image LoggerTest -H:IncludeResources="logging.properties"
  ./LoggerTest

6、它应该产生类似于以下内容的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WARNING

2.9 使用jdk17和graalvm 你可以体验到

  1. 启动时间:GraalVM 提供了 Just-In-Time (JIT) 编译和 Ahead-Of-Time (AOT) 编译的能力。AOT 编译可以将 Java 应用程序编译成本地机器码,从而加快应用程序的启动时间。相比之下,传统的 JIT 编译需要一些启动时间来进行动态编译。因此,使用 GraalVM 的 AOT 编译可能会显著减少启动时间,提高应用程序的响应性能。
  2. 内存占用:GraalVM 的 AOT 编译可以减少应用程序的内存占用,因为本地机器码通常比解释执行的字节码更加紧凑。这可以提高应用程序的可扩展性和资源利用率。
  3. 即时编译性能:GraalVM 的 JIT 编译器在某些情况下可能会提供更好的性能。它可以对热点代码进行更优化的编译,以提高执行速度。这可能在一些计算密集型任务或高并发场景中带来性能提升。
  4. 应用本身大小:在真实环境下占用对比,且二进制版本是已经整合5个项目的完整项目,而jar只是其中1/5。‍

图7.应用本身大小对比示意

2.10 demo开箱即体验

经过真实项目验证的框架demo已上传至github,地址:kafka-stream (https://github.com/17734671027/kafka-stream)基于 JDK17+springboot3.0.6+kafkaStream 构成,支持 native-image 打包,让您下的开心,用的舒心 ,欢迎大家体验。

03

总结

理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。

在云原生下,Java升级到最新版本并使用GraalVM可以提高Java应用的性能、体验新特性、提高资源利用率和适应万物云原生的能力。

打造SAAS化服务的会员徽章体系,可以作为标准的产品化方案统一对外输出。结合现有平台的通用能力,实现会员行为全路径覆盖,并能结合企业自身业务特点,规划相应的会员精准营销活动,提升会员忠诚度和业务的持续增长。

底层能力:维护用户基础数据、行为数据建模、用户画像分析、精准营销策略的制定

▪功能支撑:会员成长体系、等级计算策略、权益体系、营销底层能力支持

▪用户活跃:会员关怀、用户触达、活跃活动、业务线交叉获客、拉新促活

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 京东技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
你不知道的 Vue 单元测试(6000字实战单元测试)
Vue-Test-Utils 是 Vue.js 官方的单元测试实用工具库,它提供了一系列的 API 来使得我们可以很便捷的去写 Vue 应用中的单元测试。
一只图雀
2020/10/26
11.6K0
你不知道的 Vue 单元测试(6000字实战单元测试)
Vue-Test-Utils + Jest 单元测试入门与实践
vs code打开项目你会发现根目录下有一目录test/unit,里面就有一个已经生成的测试用例。
用户6094182
2020/03/20
2.6K0
前端单元测试那些事
Jest 是 Facebook 开源的一款 JS 单元测试框架,它也是 React 目前使用的单元测试框架,目前vue官方也把它当作为单元测试框架官方推荐 。 目前除了 Facebook 外,Twitter、Airbnb 也在使用 Jest。Jest 除了基本的断言和 Mock 功能外,还有快照测试、实时监控模式、覆盖度报告等实用功能。 同时 Jest 几乎不需要做任何配置便可使用。
树酱
2020/10/15
1.6K0
React单元测试:Jest + Enzyme(一)
前端的单元测试在很多人看来都是一个可有可无的东西,理由一般有下面几条(以下内容统一称单元测试为单测):
Dickensl
2022/06/14
1.6K0
React单元测试:Jest + Enzyme(一)
前端单元测试那些事
Jest 是 Facebook 开源的一款 JS 单元测试框架,它也是 React 目前使用的单元测试框架,目前vue官方也把它当作为单元测试框架官方推荐 。 目前除了 Facebook 外,Twitter、Airbnb 也在使用 Jest。Jest 除了基本的断言和 Mock 功能外,还有快照测试、实时监控模式、覆盖度报告等实用功能。 同时 Jest 几乎不需要做任何配置便可使用。
树酱
2020/07/03
4.5K0
前端单元测试那些事
初尝 Jest 单元测试
最近的几次发布都犯了小错,都是缺乏或者忽视了测试所导致的。通常来说,一个新功能上线的时候,开发和测试都投入比较多,各项测试都是比较全面的。然而,发布上线也并非意味着不再有bug或者修改。那这时候问题来
IMWeb前端团队
2017/12/29
1.8K0
初尝 Jest 单元测试
2022年3月最新Eslint + Prettier + Husky + Stylelint + Jest + CI/CD 超详细前端单元测试&amp;规范工程化工作流
由于我的示例项目使用Next.js框架构建,需要在extends中额外配置"next"。 同时个人建议配置react-hooks插件
源心锁
2022/08/12
2K0
2022年3月最新Eslint + Prettier + Husky + Stylelint + Jest + CI/CD 超详细前端单元测试&amp;规范工程化工作流
全面掌握 Vue.js 测试体系:单元测试与端到端测试全攻略
测试是软件开发中不可或缺的一部分。在 Vue.js 项目中,通过合理的测试体系可以提升代码的可靠性与可维护性。本文将介绍如何使用 Jest 和 Cypress 在 Vue.js 项目中构建全面的单元测试和端到端测试体系,结合可运行的代码示例,帮助开发者快速上手并应用于实际项目。
Swift社区
2025/01/09
1960
全面掌握 Vue.js 测试体系:单元测试与端到端测试全攻略
干货 | 携程租车React Native单元测试实践
琨玮,携程高级前端开发工程师,从事React Native/Web前端的开发及维护工作,喜欢研究新技术。
携程技术
2020/02/18
6.3K0
干货 | 携程租车React Native单元测试实践
手摸手教你封装跨项目复用的 Vue 组件库
在前端项目的开发中,往往会根据业务需求,沉淀出一些项目内的UI组件/功能模块(以下通称组件) 等;这些组件初期只在同一个项目中被维护,并被该项目中的不同页面或模块复用,此时的组件逐步被完善,是一个只聚焦于功能和健壮性的成长期。
江米小枣
2020/06/15
2.8K0
写代码无BUG,网易云前端单元测试方案总结
单元测试的技术方案很多,不同工具之间有互相协同,也存在功能重合,给我们搭配测试方案带来不小的困难,而且随着 ES6, TypeScript 的出现,单元测试又增加了很多其他步骤,完整配置起来往往需要很大的时间成本。我希望通过对这些工具的各自作用的掌握,了解完整的前端测试技术方案。前端单元测试的领域也很多,这里主要讲对于前端组件如何进行单元测试,最后会主要介绍下对于 React 组件的一些测试方法总结。
秋风的笔记
2021/03/12
9.7K0
写代码无BUG,网易云前端单元测试方案总结
提高代码质量——使用Jest和Sinon给已有的代码添加单元测试
在日常的功能开发中,我们的代码测试都依赖于自己或者QA进行测试。这些操作不仅费时费力,而且还依赖开发者自身的驱动。在开发一些第三方依赖的库时,我们也没有办法给第三方提供完整的代码质量报告。
黄Java
2018/09/18
3.9K0
Vite 2.0 + Vue 3.0 + Test Unit 配置
由于 Jest 运行在 Node 环境 中,所以并不支持 import 这个来自 ESM 的关键字,所以就需要 @babel/preset-env ,文档 jest/using-babel
黄啊码
2022/06/20
1.5K0
如何做前端单元测试
对于现在的前端工程,一个标准完整的项目,通常情况单元测试是非常必要的。但很多时候我们只是完成了项目而忽略了项目测试。我认为其中一个很大的原因是很多人对单元测试认知不够,因此我写了这边文章,一方面期望通过这篇文章让你对单元测试有一个初步认识。另一个方面希望通过代码示例,让你掌握写单元测试实践能力。
政采云前端团队
2021/12/09
3.4K0
如何做前端单元测试
使用jest进行单元测试
不扯犊子直接说吧,第一点,用数据、用茫茫多的测试用例去告诉使用者,你的程序是多么鲁棒健壮;第二点,把它作为一种素养去培养吧,当你按照一系列规范去做事,那么你做出来的东西,我想是有品质在的。
江涛学编程
2020/08/25
3.7K0
使用jest进行单元测试
react生态下jest单元测试
注意:这里我们使用cnpm去安装速度会更快,npm速度会很慢! a.建议使用npm install –g jest(不需要单个去安装依赖),修改package.json文件即可。
懿曲折扇情
2022/08/24
2.3K0
react生态下jest单元测试
手写一个js工具库并且发布到npm上,并且添加eslint和jest单元测试详细教程和解决方案
自从工作以来,写项目的时候经常需要写一些方法,恰好JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法
小渔夫
2022/07/18
1.6K0
手写一个js工具库并且发布到npm上,并且添加eslint和jest单元测试详细教程和解决方案
前端接入单元测试(Node+React)
假如要重构一个老前端框架,并根据其开发一个向后兼容的新框架。此时老框架针对其内部API函数,写了充分的单侧用例。在开发新框架时,直接运行老前端框架的单侧用例,如果所有测试用例都通过,则可快速保证内部api的一致性,快速验证所有功能。
kiki.
2022/09/29
3.4K0
前端接入单元测试(Node+React)
Vue3组件库工程化实战 --Element3
随着对前端功能和性能的不断提高,前端早就不是一段内嵌于页面的一段JS代码了。已经进化为一个系统复杂的工程了。 下面我就结合element3组件库的搭建经验。带大家搭建一个mini版组件库。
@超人
2021/03/18
1.3K0
Vue3组件库工程化实战 --Element3
Migrate From Vue-cli to Vite
[译] 原文地址:https://medium.com/nerd-for-tech/from-vue-cli-to-vitejs-648d2f5e031d
皮小蛋
2021/05/08
5.2K1
Migrate From Vue-cli to Vite
推荐阅读
相关推荐
你不知道的 Vue 单元测试(6000字实战单元测试)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档