余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

一文解读业务平台升级JDK11的适配之路

xiyangw 2023-09-28 14:59 17 浏览 0 评论

本文基于两个出发点,描述了业务平台于21年12月启动了对JDK版本升级的适配之路,并回顾了整个升级过程,对升级过程中的问题做了记录。

作者 | 郑波(岱泽)

来源 | 阿里开发者公众号


业务平台升级JDK11,基于两个出发点:一、jdk8于2019年1月停止维护,springboot2.1之后的版本已经兼容JDK11,springboot3.0完全放弃对JDK8的支持,未来属于更高版本的JDK;二、在试点国产化芯片的过程中,由于JDK8对Arm架构的优化不足,导致国产化芯片无法发挥自身的性能优势,为了更好的适配国产化,务必要求对JDK版本进行升级。基于上述两个出发点,业务平台于21年12月启动了对JDK版本升级的适配之路。这里回顾整个升级过程,对升级过程中的问题做一下记录


一、升级版本的选择

当时有两个JDK版本可供选择,JDK11、JDK17,从长远开来,JDK17更代表未来,但由于JDK11 相比JDK17的变化并不大,相比之下从JDK11升级到JDK17的挑战要相对小。由于升级的基本都是电商核心系统,基于风险的控制,从JDK8升级到JDK11,随后再从JDK11升级到JDK17是一个更合理的选择。


二、GC选择及功能适配

业务平台核心系统使用了非常多的定制化功能,比如GCIH、CMS GC、异步日志、Wisp、Jwarmup、UncommonNullCast、多租户,为了减少对业务的影响,同时保障JDK11相比JDK8不会产生性能的退化,相关的特性均需要在JDK11上进行适配。同时为了避免GC算法的调整对业务运维及稳定性的影响,升级初期决定依旧使用CMS GC,仅灰度少量的G1

特性

特性说明

GCIH

营销利用GCIH缓存营销数据,大促强依赖的特性

CMS GC

核心业务使用的GC算法,为了避免对业务使用上的影响,需要保留Cms GC的支持

异步GC日志

GC日志异步化,降低业务的影响

Wisp

协程支持,buy2、carts2上均在使用,对业务的性能3-5%的性能优化

JWarmup

启动预热,核心系统利用该功能降低启动过程中C1、C2带来的CPU飙升,业务抖动问题

UncommonNullCast

-XX:CompileCommand=

退优化相关的优化参数,避免部分场景下退优化带来的性能问题

-Dcom.alibaba.jdk.verifyECDSATrailing

跳过ECDSA尾部零校验,兼容老的ECDSA数据,Tp3和支付宝交互中,需要依赖


三、升级JDK11相关组件的升级

在升级JDK11的过程中,业务代码的改造只是其中之一,还涉及到业务依赖的各种组件之间的升级适配,包括Pandora、Tomcat、星环容器、天启、Doom、天擎等测试工具的升级支持

组件

升级改造点

Tomcat

非Pandoraboot的应用,强依赖Tomcat,目前大部分业务使用的依旧是Tomcat7,但Tomcat7 本身对JDK11的支持存在问题(ECJ的版本过低,在存在动态编译代码的情况下,比如:jsp、模板预演、groovy等,由于不识别jdk11,将目标代码编译成低版本的代码,导致性能及功能受损)。由于tomcat7 和tomcat8对jar包加载的顺序有了调整,导致升级到tomcat8成本会相对较高,为了降低改造成本,对tomcat7进行改造。(https://bz.apache.org/bugzilla/show_bug.cgi?id=57129)

最新的版本: taobao-tomcat-7.0.108.ecj

Pandora

Pandora各组件对JDK11的版本支持,在项目启动之初,Pandora已经在对JDK11进行了适配,但在实际升级使用中,依旧发生了一些不兼容的问题,期间主要有

  • 服务端使用JDK11版本运行,客户端使用JDK8的场景下,服务端抛的异常经过Hession序列化后,无法在JDK8上进行反序列化的情况。该问题前期评估,主要是客户端感知的错误发生变化,风险可控,实际在上线过程中,消费者侧的感知发生变化。

最新的版本: 2022-07-stable

天启

天启作为业务平台最核心的测试用力回归工具,在整个适配开始之初,就作为高优先级适配,天启内部使用了很多序列化及记录Record的过程,本身为了做代码增强,使用了相对较多的hack的方式,因此这部分改造及适配成本最大,适配过程中,一方面需要调整doom的依赖,另外一方面需要保障测试用力能正常回归

天擎

天擎作为业务平台预发环境隔离的工具,预发回归测试均需要进行依赖。这部分的改造也需要提前进行适配。


四、灰度及上线流程的选择

业务平台核心应用很多都是伴随taobao业务成长起来的应用,具有历史代码多、依赖组件广的特点,核心系统中存在非常多的二三方包依赖,在升级之初考虑使用JDK提供的兼容性扫描工具进行分析,但在实操过程中,扫描到的不兼容代码过多,但实际上大部分并没有使用到的情况。如果按照扫描出来的结果推动相关二三方包的适配,整个工程量是完全无法评估的,整个升级节奏也无法把控。为了解决该问题,我们决定整体的升级节奏调整并不追求完全的代码兼容。只对实际影响业务运行的代码做兼容处理。因为整体的升级节奏也就变成了如下几步

  1. 1) 代码使用JDK8进行编译,但要求代码可以同时在JDK8及JDK11上运行
  2. 2) 上线过程中,先将日常及预发环境的版本切换成JDK11和JDK8同时运行,回归测试过程中同时测试JDK11、JDK8版本下的运行情况
  3. 3) 线上逐步灰度JDK11运行环境的功能,做好监控及线上排查定位。随着几次大促下来后,逐步将所有的容器切换到JDK11,下线JDK8环境的容器。
  4. 4) 利用运行态的JDK11特性,优化系统性能
  5. 5) 将编译从JDK8切换到JDK11 ,同时充分JDK11本身的新的特性。
  6. 基于上述的升级步骤,对业务代码的升级改造也做了调整,业务在使用过程中,同时安装JDK8和JDK11,业务利用脚本的方式控制线上的JDK11及JDK8的灰度比例。同时经过多轮大促: 38大促灰度10台容器、日常灰度100台、618灰度一个单元、99大促灰度所有机房
if [ -f /home/admin/logs/jdk11.enable ]; then
    export JAVA_HOME=/opt/taobao/install/ajdk11_11.0.14.13/
    export JDK11_ENABLE=true
    echo "enable jdk11 , use new JAVA_HOME : ${JAVA_HOME}"
fi


if [ "$JDK11_ENABLE" == "true" ]; then
    CATALINA_OPTS="${CATALINA_OPTS} -Xlog:gc*:${MIDDLEWARE_LOGS}/gc.log:time"
    CATALINA_OPTS="${CATALINA_OPTS} --add-exports=java.base/jdk.internal.loader=ALL-UNNAMED --add-exports=java.base/jdk.internal.loader=jdk.unsupported --patch-module jdk.unsupported=/home/admin/buy2/bin/java9-migration-helper-0.1.jar"
    CATALINA_OPTS="${CATALINA_OPTS} -Dio.netty.tryReflectionSetAccessible=true --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED"
    CATALINA_OPTS="${CATALINA_OPTS} --add-exports=java.base/jdk.internal.util.jar=ALL-UNNAMED --add-exports=java.base/jdk.internal.util.jar=jdk.unsupported"
    CATALINA_OPTS="${CATALINA_OPTS} --add-opens=java.base/com.alibaba.wisp.engine=ALL-UNNAMED"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:CompileCommand=stableif,*::*"
    test -z "$JPDA_ADDRESS" && export JPDA_ADDRESS=*:8000
    #gson兼容
    CATALINA_OPTS="${CATALINA_OPTS} -Djava.locale.providers=COMPAT,SPI"
else
    CATALINA_OPTS="${CATALINA_OPTS} -Xloggc:${MIDDLEWARE_LOGS}/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
    CATALINA_OPTS="${CATALINA_OPTS} -XX:-UncommonNullCast -XX:CompileCommand=stableif,*::*"
    test -z "$JPDA_ADDRESS" && export JPDA_ADDRESS=8000
fi


五、二三方包适配及改造

JDK11相比JDK8之间的关键的变化

参考:Oracle JDK Migration Guide

● 版本号格式的变化

● 本地化的优先级变化

● module化

● 废弃代码清理

● JDK日志架构变化

由于业务代码中旧的代码量较多,为了减少整个升级的复杂度,整体的升级策略,以兼容旧的代码逻辑为主,尽可能的升级到新的版本中(并不是使用jdk11的最佳实践进行直接升级)。

在实际的适配过程中,发现主要的兼容问题集中在版本号格式的变化带来的不兼容。对于这部分代码逻辑主要要求相关业务进行改进即可,对于一些无法找到维护者的二方包来说,直接通过反编译的方式进行整体改造。

二方包

兼容版本

改造原因

citrus-webx-all-in-one

3.2.4.1-jdk11

JDK11版本号格式变化,导致无法启动,由于目前已经无法找到对应维护者,针对这部分二方包,反编译后提交仓库供业务使用。

toolkit-webx-all-in-one

2.0.3-jdk11

toolkit.common.lang

com.alibaba.toolkit:toolkit-common-lang:jar

1.0-jdk11

citrus-webx-all-in-one

3.2.4.1-jdk11

forest-store

8.1.11

使用了非公开的类,在升级到jdk11后,相关的类发生了变化,需要做响应的改造升级

ip-client

5.5.69

sic-client

1.5.33

com.alibaba.ultron:common-sdk-datasource:1.0.0-buy2.0-4

1.0.0-jdk11-beta.2

common-uic-common

3.8.8-jdk11 +

com.cainiao.cdc:cdc-client

com.cainiao.cdc:cdc-common

1.13.25

使用了unsafe的包,导致在升级到JDK11后,相关的类无法使用

gson

2.8.9

由于JDK11的本地化变化,导致gson在解析时间格式上存在不兼容的情况,升级gson版本,同时在启动时添加 -Djava.locale.providers=COMPAT,CLDR 参数。https://github.com/google/gson/pull/1211


点击查看原文,获取更多福利!

https://developer.aliyun.com/article/1162353?utm_content=g_1000368533


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关推荐

华为交换机配置命令总结

1、配置文件相关命令[Quidway]displaycurrent-configuration显示当前生效的配置[Quidway]displaysaved-configuration显示fla...

解决账户无法登录的故障
解决账户无法登录的故障

在优化系统时错误地根据网上的提示,将唯一的Administrator账户设置为禁用,导致重启后无法进入系统。类似的故障还有使用组策略限制本地账户登录,导致重启后...

2023-10-11 17:16 xiyangw

S5720交换机登录提示初始密码存在安全风险
S5720交换机登录提示初始密码存在安全风险

问题描述客户每次登录输密码时,提示初始密码不安全,现在客户嫌麻烦想要去掉:Username:huaweiPassword:Warning:Theinitia...

2023-10-11 17:15 xiyangw

Springboot,Mybatis修改登录用户的密码
Springboot,Mybatis修改登录用户的密码

一、Mybatis.xml<updateid="changePassword"parameterType="string...

2023-10-11 17:15 xiyangw

PHP理论知识之沐浴更衣重看PHP基础(二)
PHP理论知识之沐浴更衣重看PHP基础(二)

接上篇,咱们继续讲解PHP基础八、标准PHP组件和框架的数量很多,随之产生的问题就是:单独开发的框架没有考虑到与其他框架的通信。这样对开发者和框架本身都是不利的...

2023-10-11 17:15 xiyangw

新鲜出炉UCloud云主机“数据方舟”评测报告(5)— — 关其城
新鲜出炉UCloud云主机“数据方舟”评测报告(5)— — 关其城

2015年10月29日,UCloud云主机黑科技——“数据方舟”功能正式上线,首轮内测随即开放。截止至2015年12月6日,我们共收到了534位用户的评测申...

2023-10-11 17:14 xiyangw

业余无线电Q简语及英文缩语
业余无线电Q简语及英文缩语

Q简语:语音通信及CW通信通用(加粗为常用)QRA电台何台QRB电台间之距离QRG告之正确频率QRH频率是否变动QRI发送音调QRJ能否收到QRK信号之可...

2023-10-11 17:14 xiyangw

非常详细!如何理解表格存储的多版本、生命周期和有效版本偏差
非常详细!如何理解表格存储的多版本、生命周期和有效版本偏差

表格存储在8月份推出了容量型实例,直接支持了表级别最大版本号和生命周期,高性能实例也将会在9月中旬支持这两个特性。那么,最大版本号和生命周期以及特有的...

2023-10-11 17:14 xiyangw

H3C交换机恢复出厂和各种基本配置,这20个要点你知道吗?
H3C交换机恢复出厂和各种基本配置,这20个要点你知道吗?

私信“干货”二字,即可领取138G伺服与机器人专属及电控资料!H3C交换机不知道密码如何恢复出厂设置1、开机启动,Ctrl+B进入bootrom菜单,选择恢复出...

2023-10-11 17:13 xiyangw

在使用移动支付系统的时候如何保护信息安全?

移动支付的方式近年来不断被更新,使得Venmo(据嘉丰瑞德理财师了解,此为美国的“支付宝”)之类的支付方式已经可以某种意义上代替随身携带现金了。但是你必须防范那些第三方应用程序轻松地获取你的银行卡以及...

界面控件DevExpress WinForms MVVM入门指南——登录表单(下)

从本文档中,您将了解如何向应用程序添加登录表单。在本节教程中着重讨论了如何实现此任务,这基本上是附加应用程序功能的一部分。DevExpressUniversalSubscription官方最新版免...

linux基础命令(一)
linux基础命令(一)

为啥要学linux?您可能熟悉WindowsXP、Windows7、Windows10和MacOSX等操作系统。Linux就是这样一种强大的操...

2023-10-11 17:13 xiyangw

MySQL数据库密码忘记了,怎么办?

#头条创作挑战赛#MySQL数据库密码忘记了且没有其他可以修改账号密码的账户时怎么办呢?登录MySQL,密码输入错误/*密码错误,报如下错误*/[root@TESTDB~]#mysql-u...

MobaXterm忘记Session密码,如何查看已保存的密码
MobaXterm忘记Session密码,如何查看已保存的密码

MobaXterm工具登录过SSH终端后,如果存储了Session(存储后再连接ssh的时候只需要输入账号不需要输入密码就可以直接连接上ssh),则可以...

2023-10-11 17:12 xiyangw

华为交换机密码丢失修改方法
华为交换机密码丢失修改方法

华为S2300交换机找回密码设置一、目的交换机的console和telnet密码丢失,无法登录设备。交换机已进行过数据配置,要把密码恢复而数据配置不能丢失。二、...

2023-10-11 17:12 xiyangw

取消回复欢迎 发表评论: