真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Dubbo還有這樣的bug,你能忍?-創(chuàng)新互聯(lián)

本文場(chǎng)景基于dubbo-2.5.3版本。

站在用戶的角度思考問題,與客戶深入溝通,找到阜新網(wǎng)站設(shè)計(jì)與阜新網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋阜新地區(qū)。

如果你對(duì)StackOverflowError有一定的了解,就可以知道出現(xiàn)這個(gè)問題的主要原因就是調(diào)用棧太深,比如常見的無限遞歸調(diào)用。那本文要介紹的Dubbo拋出的這個(gè)StackOverflowError又是什么原因呢?且往下看。

重現(xiàn)問題

話不多說,直入主題。這次碰到的StackOverflowError非常好重現(xiàn),只需要如下簡短的代碼即可。需要注意的是這里調(diào)用的是com.alibaba.dubbo.common.json.JSON,而不是fastjson中的com.alibaba.fastjson.JSON:

Dubbo還有這樣的bug,你能忍?

Dubbo還有這樣的bug,你能忍?

運(yùn)行這段代碼能得到如下異常:

Dubbo還有這樣的bug,你能忍?

Dubbo還有這樣的bug,你能忍?

分析原因

由這個(gè)異常堆棧信息,我們很容易知道在GenericJSONConverter中的第73行和129行之間出現(xiàn)了無限遞歸調(diào)用,打開dubbo源碼并debug,發(fā)現(xiàn)在調(diào)用GenericJSONConverter中的writeValue()方法時(shí),首先會(huì)判斷需要序列化的對(duì)象的類型。當(dāng)對(duì)象是如下類型時(shí)會(huì)特殊處理:

  1. 原生類型或者封裝類型;

  2. JSONNode類型;

  3. 枚舉;

  4. 數(shù)組;

  5. Map;

  6. 集合類型;

如果需要序列化的對(duì)象是其他類型,比如這里的Locale類型,序列化邏輯如下所示:

Dubbo還有這樣的bug,你能忍?

Dubbo還有這樣的bug,你能忍?

通過這段源碼的分析,我們大概可以知道Locale的屬性中肯定有Locale類型的屬性。由于有Locale類型的屬性,導(dǎo)致繼續(xù)調(diào)用GenericJSONConverter中的writeValue()方法,從而無限遞歸下去,讓我們繼續(xù)Debug源碼驗(yàn)證這個(gè)猜想。

Debug到String pns[] = w.getPropertyNames();,我們通過查看Locale的屬性pns[]可以驗(yàn)證我們前面的猜想,如下圖所示。Locale屬性availableLocales的類型還是Locale,從而出現(xiàn)死循環(huán)直到拋出StackOverflowError:

Dubbo還有這樣的bug,你能忍?

Dubbo還有這樣的bug,你能忍?

解決問題

那么如何解決這個(gè)問題呢?很簡單,不要使用dubbo中的JSON,改為使用fastjson中的JSON,或者jackson和GSON都可以:

Dubbo Fix

筆者翻看dubbo issue歷史,發(fā)現(xiàn)dubbo在2018-05-09修復(fù)了這個(gè)問題,對(duì)應(yīng)的dubbo版本是2.6.3,描述為:add Locale serialize & deserialize support。pull地址如下:https://github.com/apache/dubbo/pull/1761/commits。

修復(fù)的代碼片段如下所示,主要改動(dòng)點(diǎn)有:

  1. 如果序列化對(duì)象是Locale類型,那么序列化方式就是調(diào)用toString()方法;

  2. 如果反序列化目標(biāo)對(duì)象類型是Locale,那么將value以下劃線分割,然后構(gòu)造Locale對(duì)象,用法參考:JSON.parse("zhCN", Locale.class);

Dubbo還有這樣的bug,你能忍?

Dubbo還有這樣的bug,你能忍?

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


當(dāng)前題目:Dubbo還有這樣的bug,你能忍?-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://weahome.cn/article/ghgjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部