哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一行l(wèi)og日志,引發(fā)了P1的線(xiàn)上事故

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 作者:芋道源碼 ? 2022-11-07 15:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


線(xiàn)上事故回顧

前段時(shí)間同事新增了一個(gè)特別簡(jiǎn)單的功能,晚上上線(xiàn)前review代碼時(shí)想到公司拼搏進(jìn)取的價(jià)值觀臨時(shí)他加一行 log 日志,覺(jué)得就一行簡(jiǎn)單的日志基本上沒(méi)啥問(wèn)題,結(jié)果剛上完線(xiàn)后一堆報(bào)警,趕緊回滾了代碼,找到問(wèn)題刪除了添加日志的代碼,重新上線(xiàn)完畢。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

情景還原

?

定義了一個(gè) CountryDTO

?

publicclassCountryDTO{
privateStringcountry;

publicvoidsetCountry(Stringcountry){
this.country=country;
}

publicStringgetCountry(){
returnthis.country;
}

publicBooleanisChinaName(){
returnthis.country.equals("中國(guó)");
}
}

?

定義測(cè)試類(lèi) FastJonTest

?

publicclassFastJonTest{
@Test
publicvoidtestSerialize(){
CountryDTOcountryDTO=newCountryDTO();
Stringstr=JSON.toJSONString(countryDTO);
System.out.println(str);
}
}

運(yùn)行時(shí)報(bào)空指針錯(cuò)誤:

64775822-5d7b-11ed-a3b6-dac502259ad0.png空指針

通過(guò)報(bào)錯(cuò)信息可以看出來(lái)是序列化的過(guò)程中執(zhí)行了isChinaName()方法,這時(shí)候this.country變量為空,那么問(wèn)題來(lái)了:

  • 序列化為什么會(huì)執(zhí)行isChinaName()呢?
  • 引申一下,序列化過(guò)程中會(huì)執(zhí)行那些方法呢?

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

源碼分析

通過(guò) debug 觀察調(diào)用鏈路的堆棧信息

652d8e80-5d7b-11ed-a3b6-dac502259ad0.png65920e46-5d7b-11ed-a3b6-dac502259ad0.jpg

調(diào)用鏈中的ASMSerializer_1_CountryDTO.writeFastJson使用asm技術(shù)動(dòng)態(tài)生成了一個(gè)類(lèi)ASMSerializer_1_CountryDTO

?

asm技術(shù)其中一項(xiàng)使用場(chǎng)景就是通過(guò)到動(dòng)態(tài)生成類(lèi)用來(lái)代替java反射,從而避免重復(fù)執(zhí)行時(shí)的反射開(kāi)銷(xiāo)

?

JavaBeanSerizlier序列化原理

通過(guò)下圖看出序列化的過(guò)程中,主要是調(diào)用JavaBeanSerializer類(lèi)的write()方法。

65b3b3de-5d7b-11ed-a3b6-dac502259ad0.pngObjectSerializer實(shí)現(xiàn)類(lèi)JavaBeanSerializer

JavaBeanSerializer主要是通過(guò)getObjectWriter()方法獲取,通過(guò)對(duì)getObjectWriter()執(zhí)行過(guò)程的調(diào)試,找到比較關(guān)鍵的com.alibaba.fastjson.serializer.SerializeConfig#createJavaBeanSerializer方法,進(jìn)而找到 com.alibaba.fastjson.util.TypeUtils#computeGetters

publicstaticListcomputeGetters(Classclazz,//
JSONTypejsonType,//
MapaliasMap,//
MapfieldCacheMap,//
booleansorted,//
PropertyNamingStrategypropertyNamingStrategy//
){
//省略部分代碼....
Method[]methods=clazz.getMethods();
for(Methodmethod:methods){
//省略部分代碼...
if(method.getReturnType().equals(Void.TYPE)){
continue;
}
if(method.getParameterTypes().length!=0){
continue;
}
//省略部分代碼...
JSONFieldannotation=TypeUtils.getAnnotation(method,JSONField.class);
//省略部分代碼...
if(annotation!=null){
if(!annotation.serialize()){
continue;
}
if(annotation.name().length()!=0){
//省略部分代碼...
}
}
if(methodName.startsWith("get")){
//省略部分代碼...
}
if(methodName.startsWith("is")){
//省略部分代碼...
}
}
}

從代碼中大致分為三種情況:

  • @JSONField(.serialize = false, name = "xxx")注解
  • getXxx() : get開(kāi)頭的方法
  • isXxx():is開(kāi)頭的方法

序列化流程圖

65d61064-5d7b-11ed-a3b6-dac502259ad0.png序列化流程圖

示例代碼

/**
*case1:@JSONField(serialize=false)
*case2:getXxx()返回值為void
*case3:isXxx()返回值不等于布爾類(lèi)型
*case4:@JSONType(ignores="xxx")
*/
@JSONType(ignores="otherName")
publicclassCountryDTO{
privateStringcountry;

publicvoidsetCountry(Stringcountry){
this.country=country;
}

publicStringgetCountry(){
returnthis.country;
}

publicstaticvoidqueryCountryList(){
System.out.println("queryCountryList()執(zhí)行!!");
}

publicBooleanisChinaName(){
System.out.println("isChinaName()執(zhí)行!!");
returntrue;
}

publicStringgetEnglishName(){
System.out.println("getEnglishName()執(zhí)行!!");
return"lucy";
}

publicStringgetOtherName(){
System.out.println("getOtherName()執(zhí)行!!");
return"lucy";
}

/**
*case1:@JSONField(serialize=false)
*/
@JSONField(serialize=false)
publicStringgetEnglishName2(){
System.out.println("getEnglishName2()執(zhí)行!!");
return"lucy";
}

/**
*case2:getXxx()返回值為void
*/
publicvoidgetEnglishName3(){
System.out.println("getEnglishName3()執(zhí)行!!");
}

/**
*case3:isXxx()返回值不等于布爾類(lèi)型
*/
publicStringisChinaName2(){
System.out.println("isChinaName2()執(zhí)行!!");
return"isChinaName2";
}
}

運(yùn)行結(jié)果為:

isChinaName()執(zhí)行!!
getEnglishName()執(zhí)行!!
{"chinaName":true,"englishName":"lucy"}

代碼規(guī)范

可以看出來(lái)序列化的規(guī)則還是很多的,比如有時(shí)需要關(guān)注返回值,有時(shí)需要關(guān)注參數(shù)個(gè)數(shù),有時(shí)需要關(guān)注@JSONType注解,有時(shí)需要關(guān)注@JSONField注解;當(dāng)一個(gè)事物的判別方式有多種的時(shí)候,由于團(tuán)隊(duì)人員掌握知識(shí)點(diǎn)的程度不一樣,這個(gè)方差很容易導(dǎo)致代碼問(wèn)題,所以盡量有一種推薦方案。

這里推薦使用@JSONField(serialize = false)來(lái)顯式的標(biāo)注方法不參與序列化,下面是使用@JSONField注解后的代碼,是不是一眼就能看出來(lái)哪些方法不需要參與序列化了。

publicclassCountryDTO{
privateStringcountry;

publicvoidsetCountry(Stringcountry){
this.country=country;
}

publicStringgetCountry(){
returnthis.country;
}

@JSONField(serialize=false)
publicstaticvoidqueryCountryList(){
System.out.println("queryCountryList()執(zhí)行!!");
}

publicBooleanisChinaName(){
System.out.println("isChinaName()執(zhí)行!!");
returntrue;
}

publicStringgetEnglishName(){
System.out.println("getEnglishName()執(zhí)行!!");
return"lucy";
}

@JSONField(serialize=false)
publicStringgetOtherName(){
System.out.println("getOtherName()執(zhí)行!!");
return"lucy";
}

@JSONField(serialize=false)
publicStringgetEnglishName2(){
System.out.println("getEnglishName2()執(zhí)行!!");
return"lucy";
}

@JSONField(serialize=false)
publicvoidgetEnglishName3(){
System.out.println("getEnglishName3()執(zhí)行!!");
}

@JSONField(serialize=false)
publicStringisChinaName2(){
System.out.println("isChinaName2()執(zhí)行!!");
return"isChinaName2";
}
}

三個(gè)頻率高的序列化的情況

65fbca66-5d7b-11ed-a3b6-dac502259ad0.png三個(gè)頻率高的序列化的情況

以上流程基本遵循,發(fā)現(xiàn)問(wèn)題 --> 原理分析 --> 解決問(wèn)題 --> 升華(編程規(guī)范)。

  • 圍繞業(yè)務(wù)上:解決問(wèn)題 -> 如何選擇一種好的額解決方案 -> 好的解決方式如何擴(kuò)展 n 個(gè)系統(tǒng)應(yīng)用;
  • 圍繞技術(shù)上:解決單個(gè)問(wèn)題,順著單個(gè)問(wèn)題掌握這條線(xiàn)上的原理。

但其實(shí)這段代碼我并不滿(mǎn)意,原因是和 FastJson 依賴(lài)太高了。我想要的效果是,不依賴(lài)任何特定的 JSON 序列化框架。當(dāng)我需要替換掉它的時(shí)候,隨時(shí)可以替換掉。

并且在寫(xiě)代碼時(shí),不要過(guò)于依賴(lài)日志。打日志只需要打緊要且關(guān)鍵的信息即可,不要什么日志都打,我曾見(jiàn)過(guò)一個(gè)系統(tǒng),一個(gè)小時(shí),把 128G 磁盤(pán)跑滿(mǎn)的管理系統(tǒng)。幾乎沒(méi)啥并發(fā),但幾乎每個(gè)請(qǐng)求都輸出幾 M 的日志,這件事我后面會(huì)單獨(dú)拿出來(lái)講講。

關(guān)于@JSONField@JSONType等特性注解,后面我會(huì)在團(tuán)隊(duì)內(nèi)規(guī)范并給出新的解耦方案,把它們移除掉。



審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4975

    瀏覽量

    74349
  • 日志
    +關(guān)注

    關(guān)注

    0

    文章

    148

    瀏覽量

    11092

原文標(biāo)題:一行l(wèi)og日志,引發(fā)了P1的線(xiàn)上事故

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    武漢市政協(xié)副主席梁鳴一行赴華礪智調(diào)研

    4月14日上午,武漢市政協(xié)副主席梁鳴一行赴華礪智調(diào)研,聚焦人工智能與自動(dòng)駕駛?cè)诤习l(fā)展。
    的頭像 發(fā)表于 04-15 11:50 ?126次閱讀

    法本電子一行蒞臨華為參觀交流

    1月8日,法本董事長(zhǎng)Alen、法本電子CEO Sam率代表團(tuán)一行前往華為坂田基地,開(kāi)展“法本走進(jìn)華為”專(zhuān)題交流活動(dòng),共話(huà)合作新機(jī)遇。
    的頭像 發(fā)表于 01-10 14:38 ?967次閱讀

    單納秒激光P1/P2/P3刻劃實(shí)現(xiàn)>99.3%GFF的倒置鈣鈦礦模組

    是通過(guò)P1、P2、P3激光刻劃實(shí)現(xiàn)子電池間的電學(xué)串聯(lián),以減少互連損耗。鈣鈦礦P1激光劃線(xiàn)測(cè)試儀是款專(zhuān)為鈣鈦礦太陽(yáng)能電池
    的頭像 發(fā)表于 12-22 09:03 ?537次閱讀
    單納秒激光<b class='flag-5'>P1</b>/<b class='flag-5'>P</b>2/<b class='flag-5'>P</b>3刻劃實(shí)現(xiàn)&amp;gt;99.3%GFF的倒置鈣鈦礦模組

    MediaTek發(fā)布天璣座艙P1 Ultra芯片

    MediaTek 正式發(fā)布旗下全新座艙芯片——天璣座艙 P1 Ultra。天璣座艙 P1 Ultra 憑借先進(jìn)的生成式 AI 技術(shù)和 4nm 制程工藝,帶來(lái)同級(jí)優(yōu)異的算力突破與智能座艙體驗(yàn),首批搭載該芯片的車(chē)型也即將上市。
    的頭像 發(fā)表于 11-26 11:48 ?575次閱讀

    韓國(guó)交通部部長(zhǎng)一行參訪(fǎng)小馬智

    10月17日,韓國(guó)國(guó)土交通部部長(zhǎng)金潤(rùn)德一行抵達(dá)北京亦莊參觀小馬智,并試乘了無(wú)人駕駛Robotaxi。小馬智副總裁高天帶隊(duì)接待了代表團(tuán)一行。隨團(tuán)參訪(fǎng)成員包括韓國(guó)國(guó)土交通部移動(dòng)出行與汽
    的頭像 發(fā)表于 10-24 16:59 ?1593次閱讀

    P1電表:歐洲能源管理的工業(yè)級(jí)“解碼引擎”

    下,智能電表上不起眼的P1端口,成了破解精細(xì)化能源管理難題的關(guān)鍵入口。 什么是P1電表? P1電表是種專(zhuān)業(yè)級(jí)能源監(jiān)測(cè)設(shè)備,通過(guò)智能電表上的標(biāo)準(zhǔn)化P
    的頭像 發(fā)表于 10-13 16:00 ?694次閱讀
    <b class='flag-5'>P1</b>電表:歐洲能源管理的工業(yè)級(jí)“解碼引擎”

    廣西政府領(lǐng)導(dǎo)一行到訪(fǎng)西井科技

    近日,廣西壯族自治區(qū)人民政府副秘書(shū)長(zhǎng),自治區(qū)大數(shù)據(jù)發(fā)展局黨組書(shū)記、局長(zhǎng)趙志剛一行到訪(fǎng)西井科技上??偛俊?/div>
    的頭像 發(fā)表于 07-26 15:30 ?1272次閱讀

    東鴻ES-P1P1智能電表的&quot;數(shù)據(jù)破壁者&quot;

    東鴻ES-P1電能追蹤器解決歐洲P1電表數(shù)據(jù)獲取難題。即插即用接口,直連歐洲電表P1端口。無(wú)線(xiàn)同步實(shí)時(shí)用電數(shù)據(jù)至本地設(shè)備,隨時(shí)查看能耗趨勢(shì)與成本分析,為節(jié)能管理提供智能化方案。產(chǎn)品兼容歐洲主流電表標(biāo)準(zhǔn),安裝便捷且保障數(shù)據(jù)安全,適
    的頭像 發(fā)表于 06-23 17:33 ?1183次閱讀

    上海雷克薩斯一行到訪(fǎng)中汽中心

    近日,雷克薩斯(上海)新能源有限公司(以下簡(jiǎn)稱(chēng)“上海雷克薩斯”)總經(jīng)理加藤武郎一行到訪(fǎng)中汽中心,與中汽中心黨委副書(shū)記王曉杉進(jìn)行了座談交流。
    的頭像 發(fā)表于 06-13 15:18 ?1170次閱讀

    中汽中心一行到訪(fǎng)理想汽車(chē)

    近日,中汽中心副總經(jīng)理周華一行赴理想汽車(chē)走訪(fǎng)交流,受到理想汽車(chē)總裁馬東輝等領(lǐng)導(dǎo)的熱情接待。
    的頭像 發(fā)表于 06-11 13:45 ?898次閱讀

    全棧開(kāi)發(fā)進(jìn)階指南:LuatOS-log庫(kù)從入門(mén)到實(shí)戰(zhàn)!

    本文將帶你深入探索LuatOS系統(tǒng)中log庫(kù)的核心原理與實(shí)戰(zhàn)技巧,通過(guò)代碼示例解析日志管理、錯(cuò)誤追蹤及性能優(yōu)化的最佳實(shí)踐,助力全棧工程師構(gòu)建更穩(wěn)健的物聯(lián)網(wǎng)應(yīng)用。 今天,我們起來(lái)認(rèn)識(shí)LuatOS
    的頭像 發(fā)表于 05-15 16:12 ?2994次閱讀
    全棧開(kāi)發(fā)進(jìn)階指南:LuatOS-<b class='flag-5'>log</b>庫(kù)從入門(mén)到實(shí)戰(zhàn)!

    全球能源巨頭沙特阿美一行到訪(fǎng)維智科技

    近日,場(chǎng)意義非凡的交流在上海維智科技總部展開(kāi)。全球能源巨頭沙特阿美執(zhí)行副總裁兼首席技術(shù)官Ahmed Al-Khowaiter、中東知名科技投資基金 P7 管理人Raed Twaily一行到訪(fǎng),雙方圍繞時(shí)空人工智能技術(shù)的全球化應(yīng)
    的頭像 發(fā)表于 05-14 09:41 ?993次閱讀

    解鎖LuatOS-log庫(kù):全棧工程師的日志管理實(shí)戰(zhàn)課!

    針對(duì)全棧開(kāi)發(fā)者設(shè)計(jì)的實(shí)戰(zhàn)教程,本文聚焦LuatOS平臺(tái)log庫(kù)的高效使用,從基礎(chǔ)配置到高級(jí)調(diào)試策略,手把手教你搭建可擴(kuò)展的日志系統(tǒng),提升項(xiàng)目維護(hù)效率。 今天,我們起來(lái)認(rèn)識(shí)LuatOS的log
    的頭像 發(fā)表于 05-12 15:23 ?1624次閱讀
    解鎖LuatOS-<b class='flag-5'>log</b>庫(kù):全棧工程師的<b class='flag-5'>日志</b>管理實(shí)戰(zhàn)課!

    打造AI工控新高度:基于此芯P1的EVB設(shè)計(jì)方案

    此芯P1的EVB設(shè)計(jì)方案以其強(qiáng)大的算力、豐富的接口和低功耗特性,為AI工控、邊緣計(jì)算等領(lǐng)域提供了全新的解決方案。如果您正在尋找款高性能、靈活適配的計(jì)算平臺(tái),此芯P1無(wú)疑是您的不二之選。
    的頭像 發(fā)表于 05-12 11:30 ?900次閱讀
    打造AI工控新高度:基于此芯<b class='flag-5'>P1</b>的EVB設(shè)計(jì)方案

    浙江大學(xué)師生一行蒞臨行芯科技參觀交流

    日前,浙江大學(xué)竺可楨學(xué)院師生一行來(lái)到杭州芯科技有限公司參觀交流。
    的頭像 發(fā)表于 05-06 10:28 ?1214次閱讀
    锦州市| 阿鲁科尔沁旗| 乐都县| 元朗区| 利川市| 瑞金市| 将乐县| 郧西县| 石首市| 郧西县| 海伦市| 循化| 伊宁市| 大厂| 晴隆县| 尉氏县| 安庆市| 金塔县| 博爱县| 大洼县| 越西县| 濮阳县| 喀喇| 汕头市| 抚顺县| 永德县| 辽中县| 日土县| 宁德市| 轮台县| 天长市| 南郑县| 东阳市| 台中县| 华容县| 龙井市| 尼木县| 青浦区| 云梦县| 军事| 高雄县|