• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            戰(zhàn)魂小筑

            討論群:309800774 知乎關(guān)注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            本文主要研究游戲服務(wù)器帶狀態(tài)的熱更新需求 http的無狀態(tài)熱更新需求已經(jīng)有成熟方案, 故不在本文描述范圍

            基本概念

            • Golang的熱更新采用什么機(jī)制?

              使用go1.8提供的plugin包機(jī)制實(shí)現(xiàn)

            • plugin包本身設(shè)計的目的是熱更新么?

              plugin包其實(shí)只是支持將代碼分別編譯為多個動態(tài)庫,動態(tài)加載后運(yùn)行 并不能完全支持類似C/C++的動態(tài)庫方式處理代碼

            • 帶狀態(tài)的進(jìn)程熱更新的基本概念及范圍是什么?

              數(shù)據(jù)部分(model)不更新, 只更新邏輯部分(函數(shù))

            • 表格和配置更新算熱更新么?

              算, 但不是本文描述范圍

            • 熱更新能在windows上使用么?

              不支持

            代碼及結(jié)構(gòu)

            • 我能將原來一個exe的代碼編譯為so提供給plugin使用么?

              可以, 但是必須仍然保留main包作為插件入口, 并在main包內(nèi)添加提供給plugin調(diào)用入口.

            • 如果動態(tài)庫中沒有main包, 編譯出的so能用么?

              不能, 包必須包含main, 否則輸出的是.a的文件, plugin包加載會報錯

            • 動態(tài)庫中, 非main包的的代碼修改能做熱更新么?

              不能!(崩潰了吧, 我提了一個issue: https://github.com/golang/go/issues/20554)

              如果確實(shí)做了修改, 底層會報錯: plugin was built with a different version of package

              解決方法: 修改plugin包底層實(shí)現(xiàn)并重新編譯 打開runtime/plugin.go, 注釋以下代碼 for _, pkghash := range md.pkghashes { if pkghash.linktimehash != *pkghash.runtimehash { return "", nil, pkghash.modulename } } 執(zhí)行/usr/local/go/run.bash 重編譯+測試

            • 代碼中哪些可以被更新? 方法可以被更新么? 閉包呢?

              只能更新?lián)碛徐o態(tài)地址的結(jié)構(gòu).例如: 包級別函數(shù)(類似于靜態(tài)函數(shù))

              例如: svc_0.so里有一個Foo函數(shù), svc_1.so修改了Foo函數(shù)實(shí)現(xiàn), 熱更新可實(shí)現(xiàn)

              閉包=函數(shù)+捕獲變量, 實(shí)際上是一個動態(tài)結(jié)構(gòu), 沒有靜態(tài)地址, 無法被更新

              各種包級別變量, 結(jié)構(gòu)體變量, 結(jié)構(gòu)體方法, 局部變量均不能被熱更新, 但是變量值不會被影響

              新增結(jié)構(gòu)可以被運(yùn)行

            • 使用結(jié)構(gòu)體方法調(diào)用了包級別函數(shù), 包級別函數(shù)能被更新么?

              可以, 雖然方法不能被更新, 但方法被調(diào)用的包級別函數(shù)的地址是固定的, 所以可以被熱更新

            • init包初始化函數(shù)能用么? 能被熱更新么?

              官方這樣描述:

              When a plugin is first opened, the init functions of all packages not already part of the program are called. The main function is not run. A plugin is only initialized once, and cannot be closed

              插件第一次被打開時, 其關(guān)聯(lián)的, 沒有成為程序的一部分的所有的包的init函數(shù)將被調(diào)用. 插件的main函數(shù)不會被調(diào)用. 插件只會被初始化一次, 不能被關(guān)閉

              因此, 需要手動將init函數(shù)改成自己的函數(shù), 統(tǒng)一在so的main包里調(diào)用

            編譯

            • 如何編譯獲得plugin包支持的動態(tài)庫

              SVCNAME=$1 SVCVER=$2 TIMESTAMP=`date '+%Y%m%d_%H%M%S'` go build -v -buildmode=plugin --ldflags="-pluginpath=${SVCNAME}_${TIMESTAMP}" -o ${SVCNAME}_${SVCVER}.so ${SVCNAME}

              -buildmode=plugin是重要參數(shù)

              --ldflags里的-pluginpath的作用是: 每次編譯的內(nèi)部識別路徑都是不同的, 避免重復(fù)加載的警告

              參考: https://github.com/golang/go/issues/19004

            久久综合久久鬼色| 久久伊人色| 久久精品国产91久久综合麻豆自制 | 久久99国产综合精品| 国产成人精品久久免费动漫 | 日本亚洲色大成网站WWW久久| 一本一道久久a久久精品综合| 久久精品无码一区二区无码| 超级碰久久免费公开视频| 日产久久强奸免费的看| 国产精品久久99| 2021最新久久久视精品爱| 青草影院天堂男人久久| 国产精品99久久久精品无码| 91精品无码久久久久久五月天| 日批日出水久久亚洲精品tv| 国产成人无码久久久精品一| 日本久久久久久久久久| yellow中文字幕久久网| 久久免费的精品国产V∧| 婷婷久久综合九色综合九七| 狠狠色丁香久久婷婷综| 囯产极品美女高潮无套久久久| 久久精品国产精品亚洲人人| 久久人人爽人人爽人人片AV不| 亚洲伊人久久综合影院| 久久久久久av无码免费看大片 | 国产三级观看久久| 狠狠干狠狠久久| 久久精品成人免费看| 久久久久久综合一区中文字幕| 亚洲精品无码久久千人斩| 亚洲欧美成人久久综合中文网 | 99精品国产综合久久久久五月天| 久久精品国产欧美日韩| 一本久久久久久久| 国产精品伊人久久伊人电影| 91精品国产高清久久久久久91 | 漂亮人妻被中出中文字幕久久| 久久嫩草影院免费看夜色| 美女久久久久久|