色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

閱讀開源項目源碼的實用技巧(下)

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

技巧二、多猜,多搜索,可以在底層庫(標準庫、網絡框架等)打條件斷點過篩選出關鍵流程

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

為什么底層庫適合打斷點呢?因為出看大項目的代碼很難搞清楚其中的細節,加上各種異步、多線程的操作,很容易把代碼「跟丟」。如果把斷點打在底層庫的接口/方法上,就可以根據調用棧分析調用過程。

當然,底層庫被調用的次數比較多,可能出現很多無關的調用,所以要結合條件斷點來過濾掉無關的調用。

還是用 Pulsar 舉例,我現在想探究 producer 發送消息的流程,那么 producer 和 broker 之間的網絡通信過程就是一個重要的切入點。

首先發現 Pulsar 的網絡協議使用的是 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;
    ...
}

又發現 Pulsar 底層靠 netty 框架實現網絡通信,那么我們可以大膽猜測, 源碼里肯定有一個大 switch 語句 ,來根據 command 里面的 type 分類處理對應的 command。

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

圖片

這里會根據不同的 command type 調用不同的 handle 函數,所以可以認為這里是 Pulsar 關鍵功能的入口。

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

圖片

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

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

當然,如果你想探究每一步具體做了什么,就跳進具體的 handle 函數里一步步調試即可。

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

你比如,上面說的網絡通信過程,我們知道了 produce 一條消息的流程,但每條 protobuf 數據包里面到底存了什么信息呢?

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

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

按照說明配置并啟動 wireshark 之后,可以使用如下過濾命令過濾掉無關的數據包:

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

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

同時,我們還可以查看每個包的具體數據,比如PARTITITONED_METADATA命令就是在查詢 topic 對應的 partition 有多少,因為這里是個非分區的 topic,所以PARTITITONED_METADATA_RESPONSE返回了 0:

再比如LOOKUP命令用來查詢 broker 的 URL,因為我們啟動的 standalone 只有一個 broker,所以LOOKUP_RESPONSE返回的只有一個 URL:

在真實的使用場景中肯定有多個 broker,所以這個LOOKUP_RESPONSE應該會返回多個 broker URL。

最后看一下真正發送消息的SEND命令里面具體有什么數據:

圖片

可以看到這里面有 producer_name, sequence_id 等數據,每條消息的 sequence_id 單調遞增,用來防止由于網絡重傳導致的消息重復,和 tcp 里面的 seq 差不多的原理。

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

具體的玩法可以有很多,我這里就不一一列舉了,其實除了 wireshark 分析 Pulsar 的網絡通信, 還可以使用 zookeeper 的可視化工具查看 Pulsar 的元數據

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

圖片

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

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

圖片

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

最后

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

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • IDE
    IDE
    +關注

    關注

    0

    文章

    343

    瀏覽量

    47039
  • 開源
    +關注

    關注

    3

    文章

    3471

    瀏覽量

    42936
  • DEBUG
    +關注

    關注

    3

    文章

    94

    瀏覽量

    20094
收藏 人收藏

    評論

    相關推薦

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

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

    關于Linux的源代碼閱讀問題

    ,linux開源,應該所有庫函數都可以進去的了。2.在Linux項目,沒有像MDK那樣做一個項目,然后規范文件分類嗎?否則,項目一大,文
    發表于 11-21 11:04

    機友分享 | 導入機智云Android開源項目的正確姿勢

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

    【HiSpark系列】潤和 HiHope 社區 開源項目集合

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

    C語言開源項目

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

    下載編譯源碼的要點和搭建源碼閱讀環境的方法

    下載編譯源碼的要點和搭建源碼閱讀環境的方法。下載編譯源碼,一方面是為了搭建源碼閱讀環境,另一方面
    發表于 01-10 06:49

    STM32項目開發中超級實用技巧分享

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

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

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

    優秀的 Verilog/FPGA開源項目介紹(一)

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

    模擬閱讀開源分享

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

    矩陣顯示器上的新聞閱讀開源項目

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

    閱讀開源項目源碼實用技巧(上)

    本文分享一在使用或者學習開源項目源碼的過程中的一些經驗技巧。 因為我最近在研究 Apache Pulsar 這款消息隊列,所以就以這個項目
    的頭像 發表于 04-12 11:34 ?1253次閱讀
    <b class='flag-5'>閱讀</b><b class='flag-5'>開源</b><b class='flag-5'>項目</b><b class='flag-5'>源碼</b>的<b class='flag-5'>實用技巧</b>(上)

    Java算法大全源碼開源源碼

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

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

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

    浙大博導開源飛控planner源碼

    浙大博導開源飛控planner源碼
    發表于 06-12 11:43 ?5次下載
    主站蜘蛛池模板: 日本无码免费久久久精品 | 中文字幕在线观看网址 | 2019天天射干网站 | 日韩1区1区产品乱码芒果榴莲 | 一色狗影院 | 国产AV亚洲精品久久久久软件 | 蜜桃婷婷狠狠久久综合9色 蜜桃视频一区二区 | 漂亮妈妈中文字幕版 | 免费毛片在线播放 | 久久性综合亚洲精品电影网 | 国产AV亚洲一区精午夜麻豆 | 久久国产成人午夜AV影院无码 | 国产精品久久久久久亚洲影视 | 亚洲午夜精品A片久久不卡蜜桃 | 99re久久精品在线播放 | 亚洲国产日韩欧美高清片a 亚洲国产日韩a精品乱码 | 男人J放进女人屁股免费观看 | 胖老太与人牲交BBWBBW高潮 | 姑娘视频日本在线播放 | 国内精品久久久久影院老司 | 国偷自产视频一区二区久 | 欧美高清vivoesond在线播放 | 欧美国产成人在线 | 亚洲地址一地址二地址三 | 亚洲 日韩 在线 国产 视频 | 美女被撕开胸罩狂揉大乳 | 最懂男人心论坛 | 最近2019中文字幕免费版视频 | 欧洲人交xxx69 | 欧美视频精品一区二区三区 | 欧美亚洲精品一区二三区8V | 蜜芽在线影片 | 色综合久久88一加勒比 | 精品欧美18videosex欧美 | 无码一区二区三区 | 岛国大片在线观看完整版 | 男人的天堂久久精品激情a 男人的天堂黄色片 | 护士一级片 | yellow在线观看免费高清的日本 | 老师湿乎乎两半嫩 | 青青青视频在线 |