在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

閱讀開源項(xiàng)目源碼的實(shí)用技巧(下)

jf_78858299 ? 來源:labuladong ? 作者:labuladong ? 2023-04-12 11:37 ? 次閱讀

技巧二、多猜,多搜索,可以在底層庫(標(biāo)準(zhǔn)庫、網(wǎng)絡(luò)框架等)打條件斷點(diǎn)過篩選出關(guān)鍵流程

這句話其實(shí)是高效 debug 的關(guān)鍵。初看源碼時「猜」是很重要且很有效的手段,結(jié)合 IDE 的搜索功能,能夠幫我們快速定位關(guān)鍵代碼。

為什么底層庫適合打斷點(diǎn)呢?因?yàn)槌隹创箜?xiàng)目的代碼很難搞清楚其中的細(xì)節(jié),加上各種異步、多線程的操作,很容易把代碼「跟丟」。如果把斷點(diǎn)打在底層庫的接口/方法上,就可以根據(jù)調(diào)用棧分析調(diào)用過程。

當(dāng)然,底層庫被調(diào)用的次數(shù)比較多,可能出現(xiàn)很多無關(guān)的調(diào)用,所以要結(jié)合條件斷點(diǎn)來過濾掉無關(guān)的調(diào)用。

還是用 Pulsar 舉例,我現(xiàn)在想探究 producer 發(fā)送消息的流程,那么 producer 和 broker 之間的網(wǎng)絡(luò)通信過程就是一個重要的切入點(diǎn)。

首先發(fā)現(xiàn) Pulsar 的網(wǎng)絡(luò)協(xié)議使用的是 protobuf,而且注意到PulsarApi.proto這個文件中有一個BaseCommand定義:

message BaseCommand {
    enum Type {
        CONNECT     = 2;
        SUBSCRIBE   = 4;

        PRODUCER    = 5;

        SEND        = 6;
        SEND_RECEIPT= 7;

        MESSAGE     = 9;
        ACK         = 10;

        PING = 18;
        PONG = 19;
        ...
    }
    
    required Type type = 1;

    
    optional CommandConnect connect          = 2;
    optional CommandConnected connected      = 3;
    ...
}

又發(fā)現(xiàn) Pulsar 底層靠 netty 框架實(shí)現(xiàn)網(wǎng)絡(luò)通信,那么我們可以大膽猜測, 源碼里肯定有一個大 switch 語句 ,來根據(jù) command 里面的 type 分類處理對應(yīng)的 command。

所以我們可以全局搜索一下case SEND_RECEIPT ,就找到了PulsarDecoder這個文件:

圖片

這里會根據(jù)不同的 command type 調(diào)用不同的 handle 函數(shù),所以可以認(rèn)為這里是 Pulsar 關(guān)鍵功能的入口。

而且注意這是 common 包,也就是說 client 和 broker 都會依賴這個包, 所以斷點(diǎn)打在 switch 這里就可以看到 client 和 broker 的網(wǎng)絡(luò)交互 ,每次跳轉(zhuǎn)的 case 就是網(wǎng)絡(luò)命令的交互順序:

圖片

PS:因?yàn)?ping/pong 心跳消息在調(diào)試時很煩人,所以我們可以通過條件斷點(diǎn)跳過心跳消息。另外,我們需要把 client 里面的各種 timeout 都調(diào)大一些,避免調(diào)試時出現(xiàn)超時的錯誤。

這樣,啟動我們的測試用例,僅僅通過這一個斷點(diǎn),就能搞明白 Pulsar 發(fā)消息的流程了:

當(dāng)然,如果你想探究每一步具體做了什么,就跳進(jìn)具體的 handle 函數(shù)里一步步調(diào)試即可。

技巧三、利用各種可視化工具

你比如,上面說的網(wǎng)絡(luò)通信過程,我們知道了 produce 一條消息的流程,但每條 protobuf 數(shù)據(jù)包里面到底存了什么信息呢?

關(guān)于這個問題,社區(qū)有大佬寫了一個 lua 腳本, 可以用 wireshark 解析 Pulsar 協(xié)議格式 ,具體說明在這里:

https://github.com/apache/pulsar/tree/master/wireshark

按照說明配置并啟動 wireshark 之后,可以使用如下過濾命令過濾掉無關(guān)的數(shù)據(jù)包:

tcp.port eq 6650 and pulsar and protobuf.field.name ne "ping" and protobuf.field.name ne "pong"

接下來啟動 standalone,通過 Java client 發(fā)送一條消息,就可以在 wireshark 抓到 10 個數(shù)據(jù)包,和剛才通過 debug 得到的流程是一樣的:

同時,我們還可以查看每個包的具體數(shù)據(jù),比如PARTITITONED_METADATA命令就是在查詢 topic 對應(yīng)的 partition 有多少,因?yàn)檫@里是個非分區(qū)的 topic,所以PARTITITONED_METADATA_RESPONSE返回了 0:

再比如LOOKUP命令用來查詢 broker 的 URL,因?yàn)槲覀儐拥?standalone 只有一個 broker,所以LOOKUP_RESPONSE返回的只有一個 URL:

在真實(shí)的使用場景中肯定有多個 broker,所以這個LOOKUP_RESPONSE應(yīng)該會返回多個 broker URL。

最后看一下真正發(fā)送消息的SEND命令里面具體有什么數(shù)據(jù):

圖片

可以看到這里面有 producer_name, sequence_id 等數(shù)據(jù),每條消息的 sequence_id 單調(diào)遞增,用來防止由于網(wǎng)絡(luò)重傳導(dǎo)致的消息重復(fù),和 tcp 里面的 seq 差不多的原理。

另外可以看到真正的消息數(shù)據(jù)放在數(shù)據(jù)包的最后,通過一個字段記錄數(shù)據(jù)的長度。

具體的玩法可以有很多,我這里就不一一列舉了,其實(shí)除了 wireshark 分析 Pulsar 的網(wǎng)絡(luò)通信, 還可以使用 zookeeper 的可視化工具查看 Pulsar 的元數(shù)據(jù)

比如 prettyZoo 就是一款對 zookeeper 可視化的開源工具,那么我就可以在 Pulsar standalone 啟動之后(會自動啟動 zookeeper),讓 prettyZoo 連接到 zookeeper 的端口,很直觀地查看 zookeeper 里面的節(jié)點(diǎn)數(shù)據(jù):

圖片

這里面很多數(shù)據(jù)可能不好理解,但我們手上有源碼, 這些路徑大概率是以字符串常量的形式表現(xiàn)的,那全局搜索就行了

比如這個producer-name的路徑,我們搜一下就定位出來了:

圖片

簡單瀏覽一下源碼,原來是借助 zookeeper 生成全局唯一的生產(chǎn)者名字。

最后

本文也夠長了,主要介紹了一些閱讀開源項(xiàng)目源碼的實(shí)用技巧,總結(jié)來說就是: 善于找資源,善于用工具

雖然本文是以 Pulsar 為例,但這些技巧都是通用的,可以運(yùn)用到任何比較成熟的開源項(xiàng)目上去。

如果你也有什么經(jīng)驗(yàn)分享,可以留言告訴我,掌握技巧只是漫漫長路的第一步,讓我們共同在開源社區(qū)里成長進(jìn)步。

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

    關(guān)注

    0

    文章

    341

    瀏覽量

    46886
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3408

    瀏覽量

    42720
  • DEBUG
    +關(guān)注

    關(guān)注

    3

    文章

    94

    瀏覽量

    19981
收藏 人收藏

    評論

    相關(guān)推薦

    Matepad pro12.2 已上市半個月,但是還沒有在開源網(wǎng)站看到該項(xiàng)目開源信息,違背開源精神

    Matepad pro12.2 已上市半個月,本人自己也購買了同款12+256的pad,想要同步學(xué)習(xí)這款pad的一些體驗(yàn)還不錯的功能點(diǎn),但是目前為止還沒有在開源網(wǎng)站看到該項(xiàng)目開源
    發(fā)表于 08-27 17:25

    關(guān)于Linux的源代碼閱讀問題

    ,linux開源,應(yīng)該所有庫函數(shù)都可以進(jìn)去的了。2.在Linux項(xiàng)目,沒有像MDK那樣做一個項(xiàng)目,然后規(guī)范文件分類嗎?否則,項(xiàng)目一大,文
    發(fā)表于 11-21 11:04

    機(jī)友分享 | 導(dǎo)入機(jī)智云Android開源項(xiàng)目的正確姿勢

    以下文章來源于小雨編程 ,作者小雨tt“使用機(jī)智云AIoT平臺支持項(xiàng)目自生成APP源碼,即可輕松解決Android開源項(xiàng)目啦,”開發(fā)者下載源碼
    發(fā)表于 09-28 10:58

    【HiSpark系列】潤和 HiHope 社區(qū) 開源項(xiàng)目集合

    Demo App的源碼https://gitee.com/hihopeorg/GOpenSource_AppKit目前相關(guān)的開源代碼都放在了這里,感興趣的可以看一
    發(fā)表于 10-22 09:52

    C語言開源項(xiàng)目

    值得學(xué)習(xí)的C語言開源項(xiàng)目- 1. WebbenchWebbench是一個在linux使用的非常簡單的網(wǎng)站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設(shè)定的URL,測試網(wǎng)站在壓力下工
    發(fā)表于 08-20 06:15

    下載編譯源碼的要點(diǎn)和搭建源碼閱讀環(huán)境的方法

    下載編譯源碼的要點(diǎn)和搭建源碼閱讀環(huán)境的方法。下載編譯源碼,一方面是為了搭建源碼閱讀環(huán)境,另一方面
    發(fā)表于 01-10 06:49

    STM32項(xiàng)目開發(fā)中超級實(shí)用技巧分享

    STM32項(xiàng)目開發(fā)中超級實(shí)用技巧一. 利用軟啟動打補(bǔ)丁二. 優(yōu)化等級盡量選擇不優(yōu)化三. 合理利用開關(guān)總中斷所有的熱愛都要不遺余力,真正喜歡它便給它更高的優(yōu)先級,和更多的時間吧!關(guān)于STM32其它
    發(fā)表于 01-21 06:22

    分享一個超級實(shí)用的源碼閱讀小技巧

    工欲善其事必先利其器; 我發(fā)現(xiàn)函數(shù)調(diào)用圖可以讓我們更加直觀地了解到源碼函數(shù)直接的調(diào)用和層次關(guān)系,提高閱讀源碼的效率 。 1 前言 看源碼的時候,心血來潮想弄一
    的頭像 發(fā)表于 05-29 11:50 ?2113次閱讀
    分享一個超級實(shí)用的<b class='flag-5'>源碼</b><b class='flag-5'>閱讀</b>小技巧

    優(yōu)秀的 Verilog/FPGA開源項(xiàng)目介紹(一)

    的參考價值。 這里再介紹一開源協(xié)議的區(qū)別,方便大家在閱讀使用這些開源項(xiàng)目時尊重規(guī)則。 詳情查看:https://suisuisi.blog
    的頭像 發(fā)表于 10-11 15:31 ?9421次閱讀
    優(yōu)秀的 Verilog/FPGA<b class='flag-5'>開源</b><b class='flag-5'>項(xiàng)目</b>介紹(一)

    模擬閱讀開源分享

    電子發(fā)燒友網(wǎng)站提供《模擬閱讀開源分享.zip》資料免費(fèi)下載
    發(fā)表于 11-14 11:21 ?0次下載
    模擬<b class='flag-5'>閱讀</b>器<b class='flag-5'>開源</b>分享

    矩陣顯示器上的新聞閱讀開源項(xiàng)目

    電子發(fā)燒友網(wǎng)站提供《矩陣顯示器上的新聞閱讀開源項(xiàng)目.zip》資料免費(fèi)下載
    發(fā)表于 02-08 10:46 ?0次下載
    矩陣顯示器上的新聞<b class='flag-5'>閱讀</b>器<b class='flag-5'>開源</b><b class='flag-5'>項(xiàng)目</b>

    閱讀開源項(xiàng)目源碼實(shí)用技巧(上)

    本文分享一在使用或者學(xué)習(xí)開源項(xiàng)目源碼的過程中的一些經(jīng)驗(yàn)技巧。 因?yàn)槲易罱谘芯?Apache Pulsar 這款消息隊列,所以就以這個項(xiàng)目
    的頭像 發(fā)表于 04-12 11:34 ?1185次閱讀
    <b class='flag-5'>閱讀</b><b class='flag-5'>開源</b><b class='flag-5'>項(xiàng)目</b><b class='flag-5'>源碼</b>的<b class='flag-5'>實(shí)用技巧</b>(上)

    Java算法大全源碼開源源碼

    Java算法大全源碼開源源碼
    發(fā)表于 06-07 14:58 ?1次下載

    如何去閱讀源碼,我總結(jié)了18條心法

    在一個優(yōu)秀的開源項(xiàng)目中,設(shè)計模式處處存在,所以在你開始閱讀源碼之前最好先了解一常見的一些設(shè)計模式。當(dāng)你了解了一些設(shè)計模式以后,在
    的頭像 發(fā)表于 07-17 16:00 ?889次閱讀
    如何去<b class='flag-5'>閱讀</b><b class='flag-5'>源碼</b>,我總結(jié)了18條心法

    浙大博導(dǎo)開源飛控planner源碼

    浙大博導(dǎo)開源飛控planner源碼
    發(fā)表于 06-12 11:43 ?4次下載
    主站蜘蛛池模板: 91大神免费视频 | 性欧美xxxx | 美女扒开尿口给男人爽免费视频 | 亚洲欧美日韩在线精品2021 | 91热成人精品国产免费 | 污污视频网址 | xxxx人成高清免费图片 | 日韩黄a级成人毛片 | 97天天摸天天碰天天爽 | 理论在线视频 | 久久e| 综合7799亚洲伊人爱爱网 | 啪啪网站色大全免费 | 四虎永久免费影院 | 国产精品美女久久久久网 | 国产精品一一在线观看 | 国产女人视频 | 国产午夜精品久久久久免费视小说 | 亚洲 欧美 精品专区 极品 | 国产片在线 | 人人人人草 | 亚洲 另类色区 欧美日韩 | 日本特黄特色视频 | 两人性潮高免费视频看 | 手机看片日韩在线 | 欧美操bb| 性感美女毛片 | 日本最新免费网站 | 久操免费在线视频 | 上课被同桌强行摸下面小黄文 | 全部在线播放免费毛片 | 黄色国产| 你懂的在线免费视频 | 久久久久久人精品免费费看 | 欧美性黑人十极品hd | 黄色工厂在线播放 | 色婷婷亚洲十月十月色天 | 美女扒开尿口给男人桶 | 久久98精品久久久久久婷婷 | 国产黄视频网站 | 中出丰满大乳中文字幕 |