记一次细思极恐的FastJson差点引发的大面积故障
阿里妹导读
作者记录了一次FastJson差点引发的大面积故障的排查过程和解决方案。
一、首先讲讲工程背景
Java就不说了,阿里在国内Java应用上堪称鼻祖,集团各种工具对Java的支持都比较完备;
Kotlin有很多语法上的优势,同样的代码Java 10行,Kotlin可能只需要5行,此外支持协程(coroutines),编写非阻塞异步代码看起来像是同步的,能很好地处理IO密集型任务。但是Kotlin毕竟非正统,集团很多工具对Kotlin的支持性比较一般;
groovy的语法规则更加特殊,工程里用的不是特别多,所以基本都是需要开发时用大模型去解决,没有特意去研究;
二、问题现象
三、排查过程
1. 怀疑FastJson版本
2. 怀疑kotlin相关依赖
3. 翻阅到相似的例子
4. ☆ 锁定关键报错位置
5. 有问题的代码(自测)
有kotlin运行环境的同学可以尝试运行下面的代码自测。
注意:经测试这段代码在FastJson 2.0.53版本可以正常运行,其他版本同学们可以再自测下。
class KotlinErrorTest {@Testfun testFastJson() {val jsonObj = JSONObject().apply {this["accessorUuid"] = "accessorUuid"this["orgId"] = 4343Lthis["resumeTaskId"] = "resumeUrl"this["resumeBody"] = {}}// 这里 toJSONString 破坏了 kotlin_error 这个变量JSON.toJSONString(jsonObj)// 定义一个对象A,并序列化val testA = A("1")val strA = JSON.toJSONString(testA)// 反序列化拿data class A的字段时会直接返回null,导致 default constructor not foundval objA = JSON.parseObject(strA, A::class.java)println(objA)}data class A(val a: String)@Testfun testLambda() {val x = { s: String -> s + "000" }val y = x("111")println(y)}}
四、总结&反思
再次膜拜一下掘金大佬:https://juejin.cn/post/6929740384734019597
CentOS到Alinux操作系统迁移
2020年12月08日,CentOS官方宣布了停止维护CentOS Linux的计划,操作系统迁移解决方案为企业提供ECS实例运行的操作系统EOL(生命周期结束)后的替换或升级服务。
点击阅读原文查看详情。