部署簡單。Go 編譯生成的是一個靜態(tài)可執(zhí)行文件,除了 glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標(biāo)機器上只需要一個基礎(chǔ)的系統(tǒng)和必要的管理、監(jiān)控工具,完全不需要操心應(yīng)用所需的各種包、庫的依賴關(guān)系,大大減輕了維護的負擔(dān)。這和 Python 有著巨大的區(qū)別。由于歷史的原因,Python 的部署工具生態(tài)相當(dāng)混亂【比如 setuptools, distutils, pip, buildout 的不同適用場合以及兼容性問題】。官方 PyPI 源又經(jīng)常出問題,需要搭建私有鏡像,而維護這個鏡像又要花費不少時間和精力。
為新華等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及新華網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、新華網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
并發(fā)性好。Goroutine 和 channel 使得編寫高并發(fā)的服務(wù)端軟件變得相當(dāng)容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個 Go 應(yīng)用也能有效的利用多個 CPU 核,并行執(zhí)行的性能好。這和 Python 也是天壤之比。多線程和多進程的服務(wù)端程序編寫起來并不簡單,而且由于全局鎖 GIL 的原因,多線程的 Python 程序并不能有效利用多核,只能用多進程的方式部署;如果用標(biāo)準(zhǔn)庫里的 multiprocessing 包又會對監(jiān)控和管理造成不少的挑戰(zhàn)【我們用的 supervisor 管理進程,對 fork 支持不好】。部署 Python 應(yīng)用的時候通常是每個 CPU 核部署一個應(yīng)用,這會造成不少資源的浪費,比如假設(shè)某個 Python 應(yīng)用啟動后需要占用 100MB 內(nèi)存,而服務(wù)器有 32 個 CPU 核,那么留一個核給系統(tǒng)、運行 31 個應(yīng)用副本就要浪費 3GB 的內(nèi)存資源。
良好的語言設(shè)計。從學(xué)術(shù)的角度講 Go 語言其實非常平庸,不支持許多高級的語言特性;但從工程的角度講,Go 的設(shè)計是非常優(yōu)秀的:規(guī)范足夠簡單靈活,有其他語言基礎(chǔ)的程序員都能迅速上手。更重要的是 Go 自帶完善的工具鏈,大大提高了團隊協(xié)作的一致性。比如 gofmt 自動排版 Go 代碼,很大程度上杜絕了不同人寫的代碼排版風(fēng)格不一致的問題。把編輯器配置成在編輯存檔的時候自動運行 gofmt,這樣在編寫代碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的代碼。此外還有 gofix, govet 等非常有用的工具。
執(zhí)行性能好。雖然不如 C 和 Java,但通常比原生 Python 應(yīng)用還是高一個數(shù)量級的,適合編寫一些瓶頸業(yè)務(wù)。內(nèi)存占用也非常省。
近幾年誕生了很多微服務(wù)框架,比如JAVA的Spring Cloud、Dubbo;Golang的GoKit和GoMicro以及NodeJs的Seneca。幾乎每種主流語言都有其對應(yīng)的微服務(wù)框架。
Go在微服務(wù)框架中有其獨特的優(yōu)勢,至于優(yōu)勢在哪,自行g(shù)oogle。
1、GoKit框架
這是一個工具包的集合,可以幫助攻城獅構(gòu)建強大、可靠和可維護的微服務(wù)。提供了用于實現(xiàn)系統(tǒng)監(jiān)控和彈性模式組件的庫,例如日志、跟蹤、限流、熔斷等。
基于這個框架的應(yīng)用程序架構(gòu)由三個主要的部分組成:
傳輸層:用于網(wǎng)絡(luò)通信,服務(wù)通常使用HTTP或者gRPC等網(wǎng)絡(luò)傳輸協(xié)議,或者使用NATS等發(fā)布訂閱系統(tǒng)相互通信。
接口層:是服務(wù)器和客戶端的基本構(gòu)建塊。每個對外提供的接口方法都會定義為一個Endpoint,一遍在服務(wù)器和客戶端之間進行網(wǎng)絡(luò)通信,每個端點使用傳輸層通過HTTP或gRPC等具體通信模式對外提供服務(wù)
服務(wù)成:具體的業(yè)務(wù)邏輯實現(xiàn)
2、GoMicro框架
這是一個基于Go語言實現(xiàn)的插件化RPC微服務(wù)框架。提供了服務(wù)發(fā)現(xiàn)、負載均衡、同步傳輸、異步通信以及事件驅(qū)動等機制,嘗試簡化分布式系統(tǒng)之間的通信,讓開發(fā)者更專注于自身業(yè)務(wù)邏輯的開發(fā)。
GoMicro的設(shè)計哲學(xué)是可插拔的架構(gòu)理念,提供了可快速構(gòu)建系統(tǒng)的組件,并且可以根據(jù)自身的需求對GoMicro提供的默認實現(xiàn)進行定制。所有插件都可在倉庫github.com/micro/go-plugins 中找到。
1、下載go的zip文件。并且一定要把文件解壓到c:\go目錄下。
2、配置windows的高級環(huán)境變量。包括:GOROOT、GOOS、GOBIN、GOARCH。并且在path變量里面把c:\go\bin加入。以便可以在命令行直接運行g(shù)o命令。
舉例:我的機器:
GOPATH= c:\go;c:\go\src;F:\workspace\goSample01;
GOBIN=c:\go\bin;F:\workspace\goSample01\bin;
其中,c:\go是go的安裝路徑;
F:\workspace\goSample01是我寫的go語言項目的工程目錄;
F:\workspace\goSample01\bin是go語言項目的工程目錄下的可執(zhí)行文件路徑;
3、在完成環(huán)境變量配置后,打開一個命令行窗口,直接輸入go,然后回車,看看是否出現(xiàn)go的幫助信息。如果出現(xiàn),那么go的基本環(huán)境就OK了。
注意:這個基本環(huán)境不包含開發(fā)工具,也不能直接編譯帶C代碼的go程序。
4、(可選)為了支持Import遠程包,最好裝個gomingw。下載地址:。如果下的是壓縮包,請把它解壓到C盤。例如,C:\gowin-env。里面有個Console.bat是以后使用go get的環(huán)境。舉例:有個文件a.go,里面import(
"fmt"
"github.com/astaxie/beedb"
_ "github.com/ziutek/mymysql/godrv"
為了編譯該a.go文件,需要啟動Console.bat,然后在該命令行窗口,進入c:\go\src目錄下,執(zhí)行g(shù)o getgithub.com/astaxie/beedb
Go get github.com/ziutek/mymysql/godrv .
Go會自動下載該遠程包并編譯和安裝這些包。
配置goclipse(可選)
(如果不喜歡eclipse開發(fā)工具,請?zhí)^這個配置。)
1、下載并安裝goclipse插件。Goclipse是go語言for eclipse的插件,下載地址:
2、啟動eclipse并創(chuàng)建go項目。然后寫個最簡單的helloworld.go文件,并運行。代碼如下:
packagemainimport"fmt"func main(){ fmt.Printf("hello, world")}
配置gocode(可選)
如果不需要go語法輔助和eclipse里面的(按ALT+/)彈出go語言自動輔助功能,請?zhí)^這個配置。
1、下載gocode的zip文件,解壓后放在go的bin目錄下。
2、下載并安裝Git軟件。并且在path里面配置git的執(zhí)行路徑。例如c:\git\bin
3、在命令行執(zhí)行:go build .\gocode。如果一切正常,那么將會編譯生成一個gocode.exe文件在go的bin目錄下。如果編譯失敗,那么就轉(zhuǎn)第4步。
4、如果第3步直接編譯gocode源文件成功,那就直接到第5步。否則,就需要通過git下載gocode源文件,然后再編譯。在命令行執(zhí)行:go get -u github.com/nsf/gocode 。就會生成gocode.exe文件。
5、在goclipse插件里面指定gocode的路徑。就可以在elcipse里面調(diào)用gocode來幫助寫編碼了。
從開發(fā)工具這塊看,go語言還不夠成熟,開發(fā)工具都還不完善,有待改進。
下載go-tour教程源代碼(可選)
Google有個在線運行g(shù)o語言的教程(),很不錯。支持在web上直接運行大部分的go程序,想了解這個教程的源代碼的朋友可以通過以下方式獲取。如果沒興趣,可以跳過這個步驟。
Go語言。他主要是在一些網(wǎng)頁版的服務(wù)器中用于系統(tǒng)編程的一種語言。他是谷歌開發(fā)的一種編程語言。在一定程度上,谷歌有一定的壟斷作用。不能隨隨便便的在語言當(dāng)中添加其他的語言成分。
前段時間在golang-China讀到這個貼:
個人覺得golang十分適合進行網(wǎng)游服務(wù)器端開發(fā),寫下這篇文章總結(jié)一下。
從網(wǎng)游的角度看:
要成功的運營一款網(wǎng)游,很大程度上依賴于玩家自發(fā)形成的社區(qū)。只有玩家自發(fā)形成一個穩(wěn)定的生態(tài)系統(tǒng),游戲才能持續(xù)下去,避免鬼城的出現(xiàn)。而這就需要多次大量導(dǎo)入用戶,在同時在線用戶量達到某個臨界點的時候,才有可能完成。因此,多人同時在線十分有必要。
再來看網(wǎng)游的常見玩法,除了排行榜這類統(tǒng)計和數(shù)據(jù)匯總的功能外,基本沒有需要大量CPU時間的應(yīng)用。以前的項目里,即時戰(zhàn)斗產(chǎn)生的各種傷害計算對CPU的消耗也不大。玩家要完成一次操作,需要通過客戶端-服務(wù)器端-客戶端這樣一個來回,為了獲得高響應(yīng)速度,滿足玩家體驗,服務(wù)器端的處理也不能占用太多時間。所以,每次請求對應(yīng)的CPU占用是比較小的。
網(wǎng)游的IO主要分兩個方面,一個是網(wǎng)絡(luò)IO,一個是磁盤IO。網(wǎng)絡(luò)IO方面,可以分成美術(shù)資源的IO和游戲邏輯指令的IO,這里主要分析游戲邏輯的IO。游戲邏輯的IO跟CPU占用的情況相似,每次請求的字節(jié)數(shù)很小,但由于多人同時在線,因此并發(fā)數(shù)相當(dāng)高。另外,地圖信息的廣播也會帶來比較頻繁的網(wǎng)絡(luò)通信。磁盤IO方面,主要是游戲數(shù)據(jù)的保存。采用不同的數(shù)據(jù)庫,會有比較大的區(qū)別。以前的項目里,就經(jīng)歷了從MySQL轉(zhuǎn)向MongoDB這種內(nèi)存數(shù)據(jù)庫的過程,磁盤IO不再是瓶頸。總體來說,還是用內(nèi)存做一級緩沖,避免大量小數(shù)據(jù)塊讀寫的方案。
針對網(wǎng)游的這些特點,golang的語言特性十分適合開發(fā)游戲服務(wù)器端。
首先,go語言提供goroutine機制作為原生的并發(fā)機制。每個goroutine所需的內(nèi)存很少,實際應(yīng)用中可以啟動大量的goroutine對并發(fā)連接進行響應(yīng)。goroutine與gevent中的greenlet很相像,遇到IO阻塞的時候,調(diào)度器就會自動切換到另一個goroutine執(zhí)行,保證CPU不會因為IO而發(fā)生等待。而goroutine與gevent相比,沒有了python底層的GIL限制,就不需要利用多進程來榨取多核機器的性能了。通過設(shè)置最大線程數(shù),可以控制go所啟動的線程,每個線程執(zhí)行一個goroutine,讓CPU滿負載運行。
同時,go語言為goroutine提供了獨到的通信機制channel。channel發(fā)生讀寫的時候,也會掛起當(dāng)前操作channel的goroutine,是一種同步阻塞通信。這樣既達到了通信的目的,又實現(xiàn)同步,用CSP模型的觀點看,并發(fā)模型就是通過一組進程和進程間的事件觸發(fā)解決任務(wù)的。雖然說,主流的編程語言之間,只要是圖靈完備的,他們就都能實現(xiàn)相同的功能。但go語言提供的這種協(xié)程間通信機制,十分優(yōu)雅地揭示了協(xié)程通信的本質(zhì),避免了以往鎖的顯式使用帶給程序員的心理負擔(dān),確是一大優(yōu)勢。進行網(wǎng)游開發(fā)的程序員,可以將游戲邏輯按照單線程阻塞式的寫,不需要額外考慮線程調(diào)度的問題,以及線程間數(shù)據(jù)依賴的問題。因為,線程間的channel通信,已經(jīng)表達了線程間的數(shù)據(jù)依賴關(guān)系了,而go的調(diào)度器會給予妥善的處理。
另外,go語言提供的gc機制,以及對指針的保護式使用,可以大大減輕程序員的開發(fā)壓力,提高開發(fā)效率。
展望未來,我期待go語言社區(qū)能夠提供更多的goroutine間的隔離機制。個人十分推崇erlang社區(qū)的脆崩哲學(xué),推動應(yīng)用發(fā)生預(yù)期外行為時,盡早崩潰,再fork出新進程處理新的請求。對于協(xié)程機制,需要由程序員保證執(zhí)行的函數(shù)不會發(fā)生死循環(huán),導(dǎo)致線程卡死。如果能夠定制goroutine所執(zhí)行函數(shù)的最大CPU執(zhí)行時間,及所能使用的最大內(nèi)存空間,對于提升系統(tǒng)的魯棒性,大有裨益。
當(dāng)前文章:go語言獲取服務(wù)器搭配 go語言開發(fā)手冊
本文地址:http://m.newbst.com/article12/hjjhgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、營銷型網(wǎng)站建設(shè)、網(wǎng)站排名、網(wǎng)站策劃、網(wǎng)頁設(shè)計公司、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)