• <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 開(kāi)源項(xiàng)目:https://github.com/davyxu

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

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

            基本概念

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

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

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

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

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

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

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

              算, 但不是本文描述范圍

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

              不支持

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

            • 我能將原來(lái)一個(gè)exe的代碼編譯為so提供給plugin使用么?

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

            • 如果動(dòng)態(tài)庫(kù)中沒(méi)有main包, 編譯出的so能用么?

              不能, 包必須包含main, 否則輸出的是.a的文件, plugin包加載會(huì)報(bào)錯(cuò)

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

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

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

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

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

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

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

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

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

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

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

              可以, 雖然方法不能被更新, 但方法被調(diào)用的包級(jí)別函數(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

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

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

            編譯

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

              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)部識(shí)別路徑都是不同的, 避免重復(fù)加載的警告

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

            国产精品99久久精品爆乳| 久久免费视频6| 青青草国产成人久久91网| 久久91精品综合国产首页| 色播久久人人爽人人爽人人片AV| 久久无码人妻一区二区三区午夜| 国内精品久久久久影院免费| 狠狠色丁香久久婷婷综合蜜芽五月| 欧洲人妻丰满av无码久久不卡| 国产精品久久久久久影院| 午夜精品久久久久| 精品久久久久久无码中文字幕 | 久久久久亚洲av无码专区导航| 亚洲国产成人久久综合一| 伊人久久综合无码成人网 | 77777亚洲午夜久久多喷| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久精品无码午夜福利理论片 | 久久精品亚洲男人的天堂| 精品久久777| 亚洲va久久久噜噜噜久久天堂| 亚洲欧美国产精品专区久久| 国产成人AV综合久久| 蜜桃麻豆www久久| 国产精品福利一区二区久久| 久久久久亚洲AV无码麻豆| 精品久久久久久国产| 亚洲欧美成人久久综合中文网 | 91精品国产高清91久久久久久| 亚洲午夜久久久久妓女影院| 青青草原综合久久大伊人| 三级片免费观看久久| 亚洲精品国产自在久久| 久久综合五月丁香久久激情| 久久嫩草影院免费看夜色| 国产真实乱对白精彩久久| 久久久久国产视频电影| 日韩精品久久久久久久电影| 精品久久久久久久国产潘金莲| 国产精品美女久久福利网站| 中文字幕日本人妻久久久免费|