亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

從PHP遷移至Golang - 熱更新篇

i_garfileo / 1094人閱讀

摘要:上篇大致提到的的熱更新,本篇將詳細(xì)論述。軟件的熱更新就是指在保持系統(tǒng)正常運(yùn)行的情況下對(duì)系統(tǒng)進(jìn)行更新升級(jí)。同樣地,熱更新也可以采取類似的處理。注包方式的熱更新本文暫不討論。

上篇大致提到的Golang的熱更新,本篇將詳細(xì)論述。

1、什么是熱更新

網(wǎng)絡(luò)上有這么一個(gè)例子來(lái)形容熱更新,我覺(jué)得很形象很貼切:

一架行駛在高速上的大卡車,行駛過(guò)程中突然遭遇爆胎,熱更新則是要求在不停車的情況下將車胎修補(bǔ)好,且補(bǔ)胎過(guò)程中卡車需要保持正常行駛。

軟件的熱更新就是指在保持系統(tǒng)正常運(yùn)行的情況下對(duì)系統(tǒng)進(jìn)行更新升級(jí)。常見(jiàn)的情況有:系統(tǒng)服務(wù)升級(jí)、修復(fù)現(xiàn)有邏輯、服務(wù)配置更新等。

2、熱更新原理

先來(lái)看下Nginx熱更新是如何做的?
Nginx支持運(yùn)行中接收信號(hào),方便開(kāi)發(fā)者控制進(jìn)程。

1)首先備份原有的Nginx二進(jìn)制文件,并用新編譯好的Nginx二進(jìn)制文件替換舊的

2)然后向master進(jìn)程發(fā)送USR2信號(hào)。此時(shí)Nginx進(jìn)程會(huì)啟動(dòng)一個(gè)新版本Nginx,該新版本Nginx進(jìn)程會(huì)發(fā)起一個(gè)新的master進(jìn)程與work進(jìn)程。即此時(shí)會(huì)有兩個(gè)Nginx實(shí)例在運(yùn)行,一起處理新來(lái)的請(qǐng)求。

3)再向原master進(jìn)程發(fā)送WINCH信號(hào),它會(huì)逐漸關(guān)閉相關(guān)work進(jìn)程,此時(shí)原master進(jìn)程仍保持監(jiān)聽(tīng)新請(qǐng)求但不會(huì)發(fā)送至其下work進(jìn)程,而是交給新的work進(jìn)程

4)最后等到所有原work進(jìn)程全部關(guān)閉,向原master進(jìn)程發(fā)送QUIT信號(hào),終止原master進(jìn)程,至此,完成Nginx熱升級(jí)。

:在*nix系統(tǒng)中,信號(hào)(Signal)是一種進(jìn)程間通信機(jī)制,它給應(yīng)用程序提供一種異步的軟件中斷,使應(yīng)用程序有機(jī)會(huì)接受其他程序或終端發(fā)送的命令(即信號(hào))。

同樣地,Golang熱更新也可以采取類似的處理。如上篇所述,都是利用用戶自定義信號(hào)USR2

:Plugin包方式的Golang熱更新本文暫不討論。

3、熱更新實(shí)現(xiàn)

Golang熱更新可以細(xì)分為服務(wù)熱『更新』(即熱升級(jí),類比Nginx的restart命令)與配置文件熱更新(類比Nginx的reload命令)。接下來(lái)從實(shí)現(xiàn)細(xì)節(jié)處依次討論。

3.1 服務(wù)熱更新

大致流程如下:

1)Golang服務(wù)進(jìn)程運(yùn)行時(shí)監(jiān)聽(tīng)USR2信號(hào)

2)進(jìn)程收到USR2信號(hào)后,fork子進(jìn)程(啟動(dòng)新版本服務(wù)),并將當(dāng)前socket句柄等進(jìn)程環(huán)境交給它

3)新進(jìn)程開(kāi)始監(jiān)聽(tīng)socket請(qǐng)求

4)等待舊服務(wù)連接停止

主要代碼示例如下:
監(jiān)聽(tīng)USR2信號(hào)

func (a *app) signalHandler(wg *sync.WaitGroup) {
    ch := make(chan os.Signal, 10)
    signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM, syscall.SIGUSR2)
    for {
        sig := <-ch
        switch sig {
        case syscall.SIGINT, syscall.SIGTERM:
            // 確保接收到INT/TERM信號(hào)時(shí)可以觸發(fā)Golang標(biāo)準(zhǔn)的進(jìn)程終止行為
            signal.Stop(ch)
            a.term(wg)
            return
        case syscall.SIGUSR2:
            err := a.preStartProcess()
            if err != nil {
                a.errors <- err
            }
            // 發(fā)起新進(jìn)程
            if _, err := a.net.StartProcess(); err != nil {
                a.errors <- err
            }
        }
    }
}

復(fù)制當(dāng)前進(jìn)程socket連接,發(fā)起新進(jìn)程

execSpec := &syscall.ProcAttr{
Env: os.Environ(),
Files: []uintptr{os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd()},
}
fork, err := syscall.ForkExec(os.Args[0], os.Args, execSpec)
...

詳細(xì)源碼可見(jiàn):https://scalingo.com/articles...

以上僅為代碼示例,目前已經(jīng)成熟的開(kāi)源實(shí)現(xiàn)主要有:endless和facebook的grace,原理基本類似,fork一個(gè)子進(jìn)程,子進(jìn)程監(jiān)聽(tīng)原有父進(jìn)程socket端口,父進(jìn)程優(yōu)雅退出。

在實(shí)際的生產(chǎn)環(huán)境中推薦使用以上開(kāi)源庫(kù),關(guān)于熱更新開(kāi)源庫(kù)的使用非常方便,下面是facebook的grace庫(kù)的例子:
引入github.com/facebookgo/grace/gracehttp

func main() {
    app := gin.New()// 項(xiàng)目中時(shí)候的是gin框架
    router.Route(app)
    var server *http.Server
    server = &http.Server{
        Addr:    ":8080",
        Handler: app,
    }
    gracehttp.Serve(server)
}

利用go build命令編譯,生成服務(wù)的可執(zhí)行文件。
然后再用shell封裝一下服務(wù)命令,生成restat.sh命令文件

#!/bin/sh

ps aux | grep wingo
count=`ps -ef | grep "wingo" | grep -v "grep" | wc -l`
echo ""

if [ 0 == $count ]; then
    echo "Wingo starting..."
    sudo ./wingo &
    echo "Wingo started"
else
    echo "Wingo Restarting..."
    sudo kill -USR2 $(ps -ef | grep "wingo" | grep -v grep | awk "{print $2}")
    echo "Wingo Restarted"
fi

sleep 1

ps aux | grep wingo

:其中wingo為服務(wù)的二進(jìn)制名稱。

于是,便可通過(guò)執(zhí)行./restart.sh命令,達(dá)到對(duì)服務(wù)的熱升級(jí)目的。

3.2 配置文件熱更新

配置文件熱更新是指在不停止服務(wù)的情況下,重新加載服務(wù)所有配置文件。
與3.1服務(wù)熱升級(jí)原理一樣,利用用戶自定義信號(hào):USR1,即可實(shí)現(xiàn)服務(wù)的配置文件熱更新。

1)服務(wù)監(jiān)聽(tīng)USR1信號(hào)

2)服務(wù)接收到USR1信號(hào)后,停止接受新的連接,等待當(dāng)前連接停止,重新載入配置文件,重啟服務(wù)器,從而實(shí)現(xiàn)相對(duì)平滑的不停服的更改。

主要代碼實(shí)現(xiàn):

// LoadAllConf 調(diào)用加載配置文件函數(shù)
// load為具體加載配置文件方法
func LoadAllConf(load func(bool)) {
    load(true)
    listenSIGUSR1(load)
}

// listenSIGUSR1 監(jiān)聽(tīng)SIGUSR1信號(hào)
func listenSIGUSR1(f func(bool)) {
    s := make(chan os.Signal, 1)
    signal.Notify(s, syscall.SIGUSR1)
    go func() {
        for {
            <-s
            f(false)
            log.Println("Reloaded")
        }
    }()
}

詳細(xì)源碼可見(jiàn):https://www.openmymind.net/Go...

利用go build命令編譯,生成服務(wù)的可執(zhí)行文件。
然后再用shell封裝一下配置重載命令,生成reload.sh命令文件

#!/bin/sh

ps aux | grep wingo
echo ""

echo "Wingo Reloading..."
sudo kill -USR1 $(ps -ef | grep "wingo" | grep -v grep | awk "{print $2}")
echo "Wingo Reloaded"
echo ""

sleep 1

ps aux | grep wingo

于是,便可通過(guò)執(zhí)行./reload.sh命令,達(dá)到對(duì)服務(wù)的配置文件熱升級(jí)目的。

4、總結(jié)

本文主要描述了Golang服務(wù)熱升級(jí)與配置文件熱更新原理與主要代碼實(shí)現(xiàn),本質(zhì)上也不是什么新內(nèi)容,如果之前讀過(guò)《Unix環(huán)境高級(jí)編程》,就會(huì)覺(jué)得很親切。底層原理基本上是利用了信號(hào)這個(gè)軟件中斷機(jī)制,在運(yùn)行中改變常駐進(jìn)程的行為。

References

https://scalingo.com/articles...
http://kuangchanglang.com/gol...
https://blog.csdn.net/black_O...
https://www.openmymind.net/Go...
https://blog.csdn.net/qq_1543...
https://wrfly.kfd.me/posts/%E...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/29722.html

相關(guān)文章

  • PHP遷移Golang - 基礎(chǔ)

    摘要:但是,隨著微服務(wù)架構(gòu)的興起以及容器時(shí)代的到來(lái),這種情況又再次加劇。最重要的是,在微服務(wù)與容器領(lǐng)域有很好的基礎(chǔ),后期系統(tǒng)可完美實(shí)現(xiàn)微服務(wù)化與容器化。 1、Why Not PHP 使用PHP構(gòu)建的WEB程序,隨著業(yè)務(wù)發(fā)展到一定體量之后,都不得不面臨以下一些問(wèn)題: 業(yè)務(wù)功能不斷擴(kuò)張,如何避免某單一業(yè)務(wù)功能故障影響整體,維持系統(tǒng)健壯性 業(yè)務(wù)邏輯復(fù)雜度不斷上升,如何解耦與模塊化,降低系統(tǒng)復(fù)雜性...

    Kerr1Gan 評(píng)論0 收藏0
  • 途牛原創(chuàng)|途牛周刊

    摘要:的本質(zhì)是團(tuán)隊(duì)博客,關(guān)注互聯(lián)網(wǎng)創(chuàng)業(yè)技術(shù),每周推薦篇優(yōu)質(zhì)文章。堅(jiān)持爭(zhēng)取做到每周更新,與讀者一起進(jìn)步。第十一期第十期第九期第八期第七期第六期第五期第四期第三期切換至,第二期發(fā)布。創(chuàng)刊,用發(fā)布了第一次。 Tuniu Weekly Inspired By 《灣區(qū)日?qǐng)?bào)》 我們團(tuán)隊(duì)也想基于這種模式,讓大家感受到技術(shù)的人文。 《Tuniu Weekly》就這樣產(chǎn)生了。 《Tuniu Weekly》...

    ThreeWords 評(píng)論0 收藏0
  • [開(kāi)源] LaravelPlus - 基于 Laravel 魔改,為方便實(shí)際業(yè)務(wù)使用 - 開(kāi)發(fā)中

    摘要:目的為了減少重復(fù)和新項(xiàng)目的配置麻煩等問(wèn)題,就是為了騙星星如現(xiàn)有的生成工具雖然好用,但是不太喜歡樣式和代碼結(jié)構(gòu)。有些本地,測(cè)試,線上的配置需要頻繁改動(dòng)的需要。 目的 為了減少重復(fù) CURD 和新項(xiàng)目的配置麻煩等問(wèn)題,(就是為了騙星星:LaravelPlus )如: 現(xiàn)有的 infyomlabs/laravel-generator CODE 生成工具雖然好用,但是不太喜歡樣式和代碼結(jié)構(gòu)。...

    weknow619 評(píng)論0 收藏0
  • TiDB 助力東南亞領(lǐng)先電商 Shopee 業(yè)務(wù)升級(jí)

    摘要:作者介紹劉春輝,洪超,一業(yè)務(wù)場(chǎng)景是東南亞和臺(tái)灣地區(qū)領(lǐng)先的電子商務(wù)平臺(tái),覆蓋新加坡馬來(lái)西亞菲律賓印度尼西亞泰國(guó)越南和臺(tái)灣等七個(gè)市場(chǎng)。母公司為首家在紐約證券交易所上市的東南亞互聯(lián)網(wǎng)企業(yè)。 作者介紹劉春輝,Shopee DBA洪超,Shopee DBA 一、業(yè)務(wù)場(chǎng)景 Shopee(https://shopee.com/)是東南亞和臺(tái)灣地區(qū)領(lǐng)先的電子商務(wù)平臺(tái),覆蓋新加坡、馬來(lái)西亞、菲律賓、印...

    hoohack 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<