• <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

            久久久久亚洲精品天堂| 精品久久久久久综合日本| 国产精品亚洲综合久久| 亚洲中文精品久久久久久不卡| 精品人妻伦九区久久AAA片69| 久久综合狠狠综合久久| 岛国搬运www久久| 久久久久久久波多野结衣高潮| 精品久久久久久国产| 四虎国产精品成人免费久久| 国产精品久久精品| 久久AV高潮AV无码AV| 久久国产精品无码网站| 久久久久久久亚洲Av无码| 久久青青国产| 精品免费久久久久国产一区| 色妞色综合久久夜夜| 亚洲精品综合久久| 国产精品99久久精品爆乳| AV无码久久久久不卡网站下载| 一97日本道伊人久久综合影院| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | AA级片免费看视频久久| 国产69精品久久久久9999APGF| 国产福利电影一区二区三区久久老子无码午夜伦不 | 蜜臀av性久久久久蜜臀aⅴ麻豆 | 国产精品美女久久久免费 | 精品熟女少妇aⅴ免费久久| 日韩精品无码久久久久久| 中文字幕久久精品| 亚洲狠狠综合久久| 欧美一区二区三区久久综合| 色婷婷狠狠久久综合五月| 久久精品无码专区免费青青 | 精品国产乱码久久久久久1区2区| 欧美大战日韩91综合一区婷婷久久青草| 99久久免费国产特黄| 久久99国产精品二区不卡| 91久久精品国产91性色也| 精品无码人妻久久久久久| 久久高潮一级毛片免费|