最新要闻
- 《流浪地球2》全球爆火背后!《三体》导演:中国科幻的内核是文化自信
- 神十五航天员首次出舱视频公布:和地球同框 绝美
- 每日速看!方向盘助力失灵、AEB抽风!车主:百年凯迪拉克毁于LYRIQ 绝望
- 速递!Android 14来了:提升续航和流畅度
- 《狂飙》片头被指抄袭 网友放对比照跟国外一电影太相似:背后公司被扒
- 全球热点评!网民称《水浒》应从中小学课文中清除 毒害更多人:浙江官方回应了
- 24岁生日当天崩了!腾讯QQ回应:服务器挤爆了 现已恢复
- 【全球报资讯】酒剑仙拿狙蚌埠住了 《仙剑奇侠传》五位角色入驻《和平精英》
- 环球即时看!24亿巨制大片 《速度与激情10》开启预售 片长130分钟
- 天天热点!魅族20 Pro外观偷跑:矩阵三摄 纯白机身太吸睛
- 世界今日报丨年轻人别以赚钱为目标!张朝阳称别把考试太当回事:不一定非上好大学
- 天天即时:中国在土耳其建造电站强震中未受损:稳定保障救援电力供应
- 实时焦点:微软公布ChatGPT版Bing不到48小时:申请用户量已超百万
- 投诉不断 极氪被爆出现大规模动力故障 官方回应:会升级
- 焦点讯息:昆虫学硕士因表演双节棍获得工作 2000万粉大V感慨:掌握一门手艺很重要
- 当前报道:手机QQ崩了:显示无网络 你消息接收正常吗?
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
全球实时:JVM sandbox 实现热修复示例
JVM-SANDBOX简介
JVM-SANDBOX(沙箱)实现了一种在不重启、不侵入目标JVM应用的AOP解决方案。GIT 地址 https://github.com/alibaba/jvm-sandbox
具有以下特性:1)无侵入:目标应用无需重启也无需感知沙箱的存在2)类隔离:沙箱以及沙箱的模块不会和目标应用的类相互干扰3)可插拔:沙箱以及沙箱的模块可以随时加载和卸载,不会在目标应用留下痕迹4)多租户:目标应用可以同时挂载不同租户下的沙箱并独立控制5)高兼容:支持JDK[6,11]
本文将介绍利用 JVM-SANDBOX 自定义修复 exception 的方法。
(资料图片)
故障模拟
原服务模拟抛出异常的代码如下:
import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@Slf4j@RestControllerpublic class SandboxController { @GetMapping("/test/void") public String testVoid() { error(); return "success"; } private void error() { throw new IllegalStateException("Illegal state!"); }}
此时,只要请求 /test/void 都会抛出异常。
修复示例
现在,我们提供一个热修复方案:
1. 安装jvm-sandbox。
# 下载wget https://ompc.oss.aliyuncs.com/jvm-sandbox/release/sandbox-stable-bin.zip# 解压unzip sandbox-stable-bin.zip
2. 新建工程,编写修复代码
import com.alibaba.jvm.sandbox.api.Information;import com.alibaba.jvm.sandbox.api.Module;import com.alibaba.jvm.sandbox.api.ProcessController;import com.alibaba.jvm.sandbox.api.annotation.Command;import com.alibaba.jvm.sandbox.api.listener.ext.Advice;import com.alibaba.jvm.sandbox.api.listener.ext.AdviceListener;import com.alibaba.jvm.sandbox.api.listener.ext.EventWatchBuilder;import com.alibaba.jvm.sandbox.api.resource.ModuleEventWatcher;import org.kohsuke.MetaInfServices;import javax.annotation.Resource;/** * @author zhengqian * @date 2023.02.06 */@MetaInfServices(Module.class)@Information(id = "exception-handler")public class ExceptionHandlerModule implements Module { @Resource private ModuleEventWatcher moduleEventWatcher; @Command("repairExceptionVoid") public void repairExceptionVoid() { new EventWatchBuilder(moduleEventWatcher) .onClass("xxx.xxx.controller.SandboxController") //对应类名 .onBehavior("error") // 对应方法名 .onWatch(new AdviceListener() { /** * 拦截指定方法,当这个方法抛出异常时将会被 * AdviceListener#afterThrowing()所拦截 */ @Override protected void afterThrowing(Advice advice) throws Throwable { // 在此,你可以通过ProcessController来改变原有方法的执行流程 // 这里的代码意义是:改变原方法抛出异常的行为,变更为立即返回;void返回值用null表示 ProcessController.returnImmediately(null); } }); }}
工程依赖参考
4.0.0 org.example jvm-sandbox-tool 1.0-SNAPSHOT true true ${project.name}-${project.version} org.apache.maven.plugins maven-compiler-plugin 3.8.0 1.8 UTF-8 true org.apache.maven.plugins maven-assembly-plugin attached package jar-with-dependencies com.alibaba.jvm.sandbox sandbox-module-starter 1.4.0 pom com.alibaba.jvm.sandbox sandbox-api 1.4.0 provided com.alibaba.jvm.sandbox sandbox-common-api 1.4.0 org.kohsuke.metainf-services metainf-services 1.9 provided org.apache.commons commons-lang3 3.4 commons-collections commons-collections 3.2.2 ognl ognl 3.0.8 com.google.guava guava 18.0 org.slf4j slf4j-api 1.7.24 ch.qos.logback logback-classic 1.2.1 javax.servlet javax.servlet-api 4.0.1 provided com.alibaba.fastjson2 fastjson2 2.0.23
3. 打包,启动
# 打包mvn clean package# 将打包好的内容复制到第一步sandbox-module的目录位置,注意改成你自己的目录cp target/jvm-sandbox-tool-1.0-SNAPSHOT-jar-with-dependencies.jar ~/install/jvm-sandbox/sandbox/sandbox-module/.
4. 启动
# 这里假设 27377 是目标进程号(也就是报异常的原服务)./sandbox.sh -p 27377
5. 执行修复指令
./sandbox.sh -p 27377 -d "exception-handler/repairExceptionVoid"
此时再请求 /test/void 会正常返回,不会报错。使用指令./sandbox.sh -p 27377 -S
停用sandbox后,服务恢复异常,实现了热插拔。
改为可传参的通用版本
import com.alibaba.fastjson2.JSONObject;import com.alibaba.jvm.sandbox.api.Information;import com.alibaba.jvm.sandbox.api.Module;import com.alibaba.jvm.sandbox.api.ProcessController;import com.alibaba.jvm.sandbox.api.annotation.Command;import com.alibaba.jvm.sandbox.api.http.printer.ConcurrentLinkedQueuePrinter;import com.alibaba.jvm.sandbox.api.http.printer.Printer;import com.alibaba.jvm.sandbox.api.listener.ext.Advice;import com.alibaba.jvm.sandbox.api.listener.ext.AdviceListener;import com.alibaba.jvm.sandbox.api.listener.ext.EventWatchBuilder;import com.alibaba.jvm.sandbox.api.listener.ext.EventWatcher;import com.alibaba.jvm.sandbox.api.resource.ModuleEventWatcher;import org.apache.commons.lang3.StringUtils;import org.kohsuke.MetaInfServices;import javax.annotation.Resource;import java.io.PrintWriter;import java.util.ArrayList;import java.util.Map;@MetaInfServices(Module.class)@Information(id = "exception-repair", version = "0.0.1", author = "zhengqian@rd.netease.com")public class ExceptionRepairModule extends ParamSupported implements Module { @Resource private ModuleEventWatcher moduleEventWatcher; @Command("returnObject") public void returnObject(final Map param, final PrintWriter writer) { final String cnPattern = getParameter(param, "class"); final String mnPattern = getParameter(param, "method"); final String rtPattern = getParameter(param, "return"); final String rtString = getParameter(param, "returnString"); final Printer printer = new ConcurrentLinkedQueuePrinter(writer); final EventWatcher watcher = new EventWatchBuilder(moduleEventWatcher) .onClass(cnPattern) .onBehavior(mnPattern) .onWatch(new AdviceListener() { /** * 拦截指定方法,当这个方法抛出异常时将会被 * AdviceListener#afterThrowing()所拦截 */ @Override protected void afterThrowing(Advice advice) throws Throwable { Class clazz = Class.forName(rtPattern); Object object; if (StringUtils.isEmpty(rtString)) { object = clazz.newInstance(); printer.print("repair exception, return empty object"); } else { object = JSONObject.parseObject(rtString, clazz); printer.print("repair exception, return object: " + object.toString()); } ProcessController.returnImmediately(object); } }); try { printer.println(String.format( "tracing on [%s#%s].\nPress CTRL_C abort it!", cnPattern, mnPattern )); printer.waitingForBroken(); } finally { watcher.onUnWatched(); } } @Command("returnEmptyList") public void returnList(final Map param, final PrintWriter writer) { final String cnPattern = getParameter(param, "class"); final String mnPattern = getParameter(param, "method"); final String rtPattern = getParameter(param, "return"); final Printer printer = new ConcurrentLinkedQueuePrinter(writer); final EventWatcher watcher = new EventWatchBuilder(moduleEventWatcher) .onClass(cnPattern) .onBehavior(mnPattern) .onWatch(new AdviceListener() { /** * 拦截指定方法,当这个方法抛出异常时将会被 * AdviceListener#afterThrowing()所拦截 */ @Override protected void afterThrowing(Advice advice) throws Throwable { ProcessController.returnImmediately(new ArrayList<>()); } }); try { printer.println(String.format( "tracing on [%s#%s].\nPress CTRL_C abort it!", cnPattern, mnPattern )); printer.waitingForBroken(); } finally { watcher.onUnWatched(); } }}
故障模拟
@Slf4j@RestControllerpublic class SandboxController { @GetMapping("/test/object") public SandboxReturnType testObject() { SandboxReturnType type = errorObject(); log.info("type:{}", type); return type; } private SandboxReturnType errorObject() { throw new IllegalStateException("Illegal state!"); }}
@Datapublic class SandboxReturnType { private String name;}
执行指令,可以指定作用的类、方法、以及需要返回的object(传入的是json字段串,且这里的 returnString 做了urlencode)
./sandbox.sh -p 47620 -d "exception-repair/returnObject?class=org.example.demo.controller.SandboxController&method=errorObject&return=org.example.demo.controller.SandboxReturnType&returnString=%7B%22name%22%3A%22111%22%7D"
此时,请求 /test/object 时可以正常返回传入的数据,实现热修复
{ "name": 111}
可传参的通用代码可以打包上传,需要时直接下载使用即可,不需要每次重复写代码、打包处理。
全球实时:JVM sandbox 实现热修复示例
《流浪地球2》全球爆火背后!《三体》导演:中国科幻的内核是文化自信
神十五航天员首次出舱视频公布:和地球同框 绝美
每日速看!方向盘助力失灵、AEB抽风!车主:百年凯迪拉克毁于LYRIQ 绝望
速递!Android 14来了:提升续航和流畅度
《狂飙》片头被指抄袭 网友放对比照跟国外一电影太相似:背后公司被扒
环球资讯:剖析字节案例,火山引擎 A/B 测试 DataTester 如何“嵌入”技术研发流程
Docker安装使用Kafka
每日动态!机器学习-KNN
全球热点评!网民称《水浒》应从中小学课文中清除 毒害更多人:浙江官方回应了
24岁生日当天崩了!腾讯QQ回应:服务器挤爆了 现已恢复
【全球报资讯】酒剑仙拿狙蚌埠住了 《仙剑奇侠传》五位角色入驻《和平精英》
如何注册 ChatGPT ,OpenAI
每日头条!A/B测试教程_编程入门自学教程_菜鸟教程-免费教程分享
环球即时看!24亿巨制大片 《速度与激情10》开启预售 片长130分钟
天天热点!魅族20 Pro外观偷跑:矩阵三摄 纯白机身太吸睛
世界今日报丨年轻人别以赚钱为目标!张朝阳称别把考试太当回事:不一定非上好大学
天天即时:中国在土耳其建造电站强震中未受损:稳定保障救援电力供应
实时焦点:微软公布ChatGPT版Bing不到48小时:申请用户量已超百万
天天热推荐:01-数据结构与算法-目录索引
环球快消息!keycloak~再说session和token
学习笔记——redis集群(定义、集群连接、查看集群、节点分配方式、插槽、集群中录入值、查询集群中的值、故障恢复)
滴滴一面:order by 调优10倍,思路是啥?
投诉不断 极氪被爆出现大规模动力故障 官方回应:会升级
焦点讯息:昆虫学硕士因表演双节棍获得工作 2000万粉大V感慨:掌握一门手艺很重要
当前报道:手机QQ崩了:显示无网络 你消息接收正常吗?
【环球新要闻】Moment推出1.55X变形镜头:iPhone也能拍出电影级超宽照片
十八罗汉分别叫什么?十八罗汉排名及顺序
马前泼水指的是什么生肖?马前泼水这个故事是什么意思?
巴黎恋人的结局是什么?巴黎恋人演员表
手净欲摸杯是什么意思?手净欲摸杯的出处是哪里?
环球观点:Linux 命令大全:2万字实现Linux自由
20088乐队现在怎么样?20088乐队现在怎么样了?
milo显示器是什么牌子?milo显示器怎么样?
ec文件是什么的简称?ec文件怎么打开?
神舟笔记本如何下载安装软件?神舟笔记本如何下载驱动?
tplink路由器怎么设置端口映射?tplink路由器怎么重新设置密码?
冰箱电磁阀怎么判断好坏?冰箱电磁阀的颜色代表什么?
票房榜前10稳了!《流浪地球2》总票房突破35亿 官方公布月球美术设计
每日信息:丰田皇冠遭车主集体投诉:空调管短了 漏水漏风
腾讯严惩《和平精英》外挂 一大批玩家一觉醒来发现被封号10年
高速特斯拉自动驾驶 驾驶员座位上睡觉!网友:保险赔吗?
世界实时:女子应聘人事被要求身高1米63以上 追问HR被回怼:不自信就不用了解了
最新资讯:keycloak~JWT没有被持久化_是因为你对方法论理解不到位
快喝不起了!农夫山泉涨价:纯净水、矿泉水啥区别、到底哪个好?
天天微头条丨在ChatGPT眼里 未来的汽车竟长这模样
天天快报!ChatGPT引发失业恐慌?这20种工作要避开:含医生、快递员
天天新动态:果然“超级奶爸”!李想晒六口全家福:期待五胎到来
订单充足不愁卖 国产特斯拉Model Y入门版涨价:贵了2000
环球滚动:学习笔记——redis持久化之RDB、AOF
BigDecimal加减乘除运算整合工具类
天天新资讯:4年还完20万欠款!夫妻回应剪掉名下所有信用卡 告别卡奴引网友感叹
天天热文:Win11又出严重bug:Intel用户程序崩溃 AMD躲过一劫
世界热点!1600人失业 老牌互联网巨头雅虎裁员20%:离职补偿未定
世界讯息:开窍!iPhone 15摄像头终于要升级:苹果设计让人抓狂 背部凸起更严重
环球视讯!3499元爆火!真我GT Neo5 1T版抢购一空:2023年旗舰射门员
世界最资讯丨日本国产大飞机失败:三菱重工不服输 自研新一代战机
天天看点:读Java实战(第二版)笔记06_新的日期和时间API
世界时讯:NVIDIA发布GeForce 528.49驱动:首发支持史上最强移动显卡
全球实时:网友50000元攒机 到底是不是大冤种?
今日热闻!基于高层次综合器(Vivado HLS)的硬件优化[原创www.cnblogs.com/helesheng]
你同意?张朝阳:《流浪地球2》跟好莱坞还是没法比
【天天时快讯】奇葩!哈尔滨机场一旅客为逃避安检把活蜗牛藏嘴里
环球热议:Google放大招对抗ChatGPT:结果低级答错题 市值蒸发1000亿
微头条丨单枪匹马也能拍大片!这次又让大疆给拿捏了
快资讯:史上最强AMD显卡!撼迅正式发布水冷RX 7900 XTX 还是单插槽
Spring配置类理解(Lite模式和Full模式)
环球速讯:JAVA中如何判断一个ResultSet结果集是否为空
【天天速看料】MYSQL脱敏 || 给开发人员限制权限,保证mysql数据库数据安全
重点聚焦!小白也能做应用(二)之fusion app增加B站视频页面
每日观点:法国调香师夸国产花露水清新还美丽 要卖450元 网友:六神YYDS
MATLAB 实现点云累计-坐标系转换-目标范围点云提取(附代码与代码注释)
【全球快播报】面向对象知识点汇总(小白必会)
(一)浅谈人工智能:ChatGPT
《蚁人3》女儿凯茜中文预告公布 首映礼美艳图赏
环球热消息:【一句话】@Configuration和@Component的区别
世界看热讯:《分布式技术原理与算法解析》学习笔记Day06
焦点消息!ASP.NET Core+Element+SQL Server开发校园图书管理系统(完)
全球看点:if else 代码优化实战
全球动态:网络协议-ssh基础
当前关注:重回中国!福建13岁女孩4.82秒打破鲁班锁世界纪录
今日讯!ROG新款幻14笔记本即将上市:锐龙9 7940HS 可选RTX 4060
免费用!中国信通院全球网测APP iOS版上线:支持5G/千兆接入测速
速读:71款任选 森马T恤33元清仓手慢无
动态:祝福!比尔盖茨有新女友了 身家超33亿女富婆:双方沉默 前妻也有新恋情
完美收官!《三体》电视剧最后5集被赞爆:老外满分刷屏
快看:80km续航 雅迪电动车DN2千元秒杀:2699元起还是新国标
Copula
今亮点!女子熬夜看《狂飙》:患高启强同款干眼症
世界热头条丨逆天 韩国学生用ChatGPT写论文“喜”提0分 校方:剽窃!
快资讯:再续一个月:《阿凡达:水之道》再次宣布延长上映
28款CPU性能实测:Intel实力屠榜 AMD游戏神U赢回面子
全球消息!全国首座高速公路重卡充换电站亮相:电池包350kWh 3分钟自动换电
基于图的下一代入侵检测系统
环球快资讯丨MySQL——性能优化的关注点
天天简讯:记录--Cesium+Vue实战教程——地图导航
世界关注:人工智能(Python)教程_编程入门自学教程_菜鸟教程-免费教程分享
天天要闻:安卓常用shell命令大全
环球视点!无损压缩鼻祖去世了 没有他就没有今天的Zip、PNG、PDF
当前观点:博主“科普”鲸鱼会假装搁浅吸引人来救 博物杂志辟谣:九死一生