應(yīng)用于搭建 Web 服務(wù)器,存儲集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、南部網(wǎng)站維護、網(wǎng)站推廣。
Go 是谷歌的編程語言,而不是社區(qū)的。在這位博主看來,雖然 Go 語言擁有一個貢獻者社區(qū),但是它并不是社區(qū)的項目,只是谷歌的一個項目。所以只要是谷歌反對的東西,沒有人可以把這個東西加到 Go 語言中。
InfoQ 記者也第一時間聯(lián)系了《Go 并發(fā)編程實戰(zhàn)》作者、前輕松籌大數(shù)據(jù)負責(zé)人郝林,他的觀點是:Go 語言是大家的,只有偽愛好者才會談舍棄。在郝林看來,Go 語言官方團隊在谷歌內(nèi)部實屬一個很小的團隊,但其成員幾乎個個都是技術(shù)大神。
很多社區(qū)成員為 Go 語言貢獻了很多重要并且有價值的東西,這些從貢獻者和提交者的多樣性就可以看出來。但谷歌作為整個 Go 社區(qū)的守門人,它獨自決定什么東西可以被 Go 語言接受,什么不能被接受。
在 Go 語言模塊系統(tǒng)上發(fā)生的一件事情,谷歌 Go 語言核心團隊的一名成員放棄了由外部 Go 社區(qū)開發(fā)的一個模塊系統(tǒng),因為它使用了另一種不同的模型。Go 語言擁有一個貢獻者社區(qū),但是它并不是一個社區(qū)項目。
Go語言主要用作服務(wù)器端開發(fā)。
其定位是用來開發(fā)“大型軟件”的,適合于需要很多程序員一起開發(fā),并且開發(fā)周期較長的大型軟件和支持云計算的網(wǎng)絡(luò)服務(wù)。
Go語言融合了傳統(tǒng)編譯型語言的高效性和腳本語言的易用性和富于表達性,不僅提高了項目的開發(fā)速度,而且后期維護起來也非常輕松。
編譯器
當(dāng)前有兩個Go編譯器分支,分別為官方編譯器gc和gccgo。官方編譯器在初期使用C寫成,后用Go重寫從而實現(xiàn)自舉。Gccgo是一個使用標(biāo)準(zhǔn)GCC作為后端的Go編譯器。
官方編譯器支持跨平臺編譯(但不支持CGO),允許將源代碼編譯為可在目標(biāo)系統(tǒng)、架構(gòu)上執(zhí)行的二進制文件。
go語言之所以能成為我國最火的語言,是因為編寫服務(wù)端高并發(fā)程序的優(yōu)勢。我大中華區(qū)但凡pv,日活高點的網(wǎng)站,應(yīng)用,誰沒點這個需求。
這個領(lǐng)域中最優(yōu)的幾個:golang,erlang,rust。日常生活中人類社交是當(dāng)今社會上的必然性,人們也伴隨著科技時代的發(fā)展,智能電子產(chǎn)品的使用中也必然少不了語言輸入,文字的編輯,語言轉(zhuǎn)換的便利都均可來源于go語音輸入法。
寫在最前面:由于現(xiàn)在游戲基本上采用全球大區(qū)的模式,全球玩家在同一個大區(qū)進行游戲,傳統(tǒng)的單服模式已經(jīng)不能夠滿足當(dāng)前的服務(wù)需求,所以現(xiàn)在游戲服務(wù)器都在往微服務(wù)架構(gòu)發(fā)展。當(dāng)前我們游戲也是利用微服務(wù)架構(gòu)來實現(xiàn)全球玩家同服游戲。
玩家每次斷線(包括切換網(wǎng)絡(luò)/超時斷線)后應(yīng)該會重新連接服務(wù)器,重連成功的話可以繼續(xù)當(dāng)前情景繼續(xù)游戲,但是之前寫的底層重連機制一直不能生效,導(dǎo)致每次玩家斷線后重連都失敗,要從賬號登陸開始重新登陸,該文章寫在已經(jīng)定位了重連問題是由SLB引起后,提出的解決方案。
每次重連后,客戶端向SLB發(fā)送建立連接,SLB都會重新分配一個網(wǎng)關(guān)節(jié)點,導(dǎo)致客戶端連接到其他網(wǎng)關(guān),重連失敗。
會話保持的作用是什么?
開啟SLB會話保持功能后,SLB會記錄客戶端的IP地址,在一定時間內(nèi),自動將同一個IP的連接轉(zhuǎn)發(fā)到上次連接的網(wǎng)關(guān)。
在網(wǎng)絡(luò)不穩(wěn)定的情況下,游戲容易心跳或者發(fā)包超時,開啟會話保持,能解決大部分情況下的重連問題。
但是在切換網(wǎng)絡(luò)的時候,手機網(wǎng)絡(luò)從Wifi切換成4G,自身IP會變,這時候連接必定和服務(wù)器斷開,需要重新建立連接。由于IP已經(jīng)變化,SLB不能識別到是同一個客戶端發(fā)出的請求,會將連接轉(zhuǎn)發(fā)到其他網(wǎng)關(guān)節(jié)點。所以使用TCP連接的情況下,SLB開啟會話保持并不能解決所有的重連問題。
另外某些時刻,手機頻繁開啟和斷開WI-FI,有時候可能不會斷開網(wǎng)絡(luò),這并不是因為4G切換WI-FI時網(wǎng)絡(luò)沒斷開,從4G切換到Wi-Fi網(wǎng)絡(luò),因為IP變了,服務(wù)器不能識別到新的IP,連接肯定是斷開的。這時候網(wǎng)絡(luò)沒斷開,主要是因為現(xiàn)在智能手機會對4G和Wi-Fi網(wǎng)絡(luò)做個權(quán)重判斷,當(dāng)Wi-Fi網(wǎng)絡(luò)頻繁打開關(guān)閉時,手機會判斷Wi-Fi網(wǎng)絡(luò)不穩(wěn)定,所有流量都走4G。所以網(wǎng)絡(luò)沒斷開是因為一直使用4G連接,才沒有斷開。想要驗證,只需要切換Wi-Fi時,把4G網(wǎng)絡(luò)關(guān)閉,這樣流量就必定走Wi-Fi。
上面說過,四層的TCP協(xié)議主要是基于IP來實現(xiàn)會話保持。但是切換網(wǎng)絡(luò)的時候客戶端的IP會變。所以要解決切換網(wǎng)絡(luò)時的重連問題,只有兩個方法:1. 當(dāng)客戶端成功連接網(wǎng)關(guān)節(jié)點后,記錄下網(wǎng)關(guān)節(jié)點的IP,下次重連后不經(jīng)過SLB,直接向網(wǎng)關(guān)節(jié)點發(fā)送連接請求。2.使用 SLB的七層(HTTP)轉(zhuǎn)發(fā)服務(wù)。
當(dāng)客戶端經(jīng)過SLB將連接轉(zhuǎn)發(fā)到網(wǎng)關(guān)時,二次握手驗證成功后向客戶端發(fā)送自己節(jié)點的IP,這樣客戶端下次連接的時候就能直接連接網(wǎng)關(guān)節(jié)點。但是這樣會暴露網(wǎng)關(guān)的IP地址,為安全留下隱患。
如果不希望暴露網(wǎng)關(guān)的IP地址,就需要增加一層代理層,SLB將客戶端請求轉(zhuǎn)發(fā)到代理層,代理層再根據(jù)客戶端帶有的key,轉(zhuǎn)發(fā)到正確的網(wǎng)關(guān)節(jié)點上。增加一層代理層,不僅會增加請求的響應(yīng)時間,還會增加整體框架的復(fù)雜度。
阿里云的七層SLB會話保持服務(wù),主要是基于cookie的會話保持。客戶端在往服務(wù)器發(fā)送HTTP請求后,服務(wù)器會返回客戶端一個Response,SLB會在這時候,將經(jīng)過的Response插入或者重寫cookie。客戶端獲取到這個cookie,下次請求時會帶上cookie,SLB判斷Request的Headers里面有cookie,就將連接轉(zhuǎn)發(fā)到之前的網(wǎng)關(guān)節(jié)點。
HTTP是短鏈接,我們游戲是長連接,所以用HTTP肯定不合適。但是可以考慮基于HTTP的WebSocket。
什么是WebSocket?
WSS(Web Socket Secure)是WebSocket的加密版本。
SLB對WebSocket的支持
查看阿里云SLB文檔對WS的支持,說明SLB是支持WS協(xié)議的,并且SLB對于WS無需配置,只需要選用HTTP監(jiān)聽時,就能夠轉(zhuǎn)發(fā)WS協(xié)議。說明WS協(xié)議在SLB這邊看來就是一個HTTP,這樣WS走的也是七層的轉(zhuǎn)發(fā)服務(wù)。只要SLB能夠正常識別WS握手協(xié)議里Request的cookie和正常識別服務(wù)器返回的Response并且往里面插入cookie,就可以利用會話保持解決重連問題。
Go語言實現(xiàn)WS服務(wù)器有兩種方法,一種是利用golang.org/x/net下的websocket包,另外一種方法就是自己解讀Websocket協(xié)議來實現(xiàn),由于WS協(xié)議一樣是基于TCP協(xié)議之上,完全可以通過監(jiān)聽TCP端口來實現(xiàn)。
客戶端發(fā)送Request消息
服務(wù)器返回Response消息
其中服務(wù)器返回的Sec-WebSocket-Accept字段,主要是用于客戶端需要驗證服務(wù)器是否支持WS。RFC6455文檔中規(guī)定,在WebSocket通信協(xié)議中服務(wù)端為了證實已經(jīng)接收了握手,它需要把兩部分的數(shù)據(jù)合并成一個響應(yīng)。一部分信息來自客戶端握手的Sec-WebSocket-Keyt頭字段:Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==。對于這個字段,服務(wù)端必須得到這個值(頭字段中經(jīng)過base64編碼的值減去前后的空格)并與GUID"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"組合成一個字符串,這個字符串對于不懂WebSocket協(xié)議的網(wǎng)絡(luò)終端來說是不能使用的。這個組合經(jīng)過SHA-1掩碼,base64編碼后在服務(wù)端的握手中返回。如果這個Sec-WebSocket-Accept計算錯誤瀏覽器會提示:Sec-WebSocket-Accept dismatch
如果返回成功,Websocket就會回調(diào)onopen事件
游戲服務(wù)器的使用的TCP協(xié)議,是在協(xié)議的包頭使用4Byte來聲明本協(xié)議長度,然后將協(xié)議一次性發(fā)送。但是在WS協(xié)議是通過Frame形式發(fā)送的,會將一條消息分為幾個frame,按照先后順序傳輸出去。這樣做會有幾個好處:
websocket的協(xié)議格式:
參數(shù)說明如下:
阿里云的SLB開啟HTTP監(jiān)聽后,會檢查過往的Request和Response請求,收到服務(wù)器返回的Response后,會往Response插入一個Cookie
客戶端收到服務(wù)器的Response后,可以在Header中查到有個“Set-Cookie”字段,里面是SLB插入的Cookie值
客戶端斷開連接后,下次發(fā)送請求需要往Headers插入Cookie字段
分別在阿里云的兩臺ECS實例上部署WS服務(wù)器,打開8000端口,開啟一個SLB服務(wù),SLB服務(wù)選擇HTTP方式監(jiān)聽,并且打開會話保持功能,Cookie處理方式選擇植入Cookie。Demo服務(wù)器沒有做HTTP健康監(jiān)聽的處理,健康檢查這塊可以先關(guān)掉。
在兩臺ECS上啟動WS服務(wù)器,然后本地運行客戶端,分別測試兩臺服務(wù)器是否能正常連接,測試完畢后,測試SLB能否正常工作。服務(wù)器和SLB都正常的情況下,運行客戶端,客戶端會得到以下結(jié)果
收到的三次Cookie都相同,說明Cookie是有正常植入工作的,并且三次都被SLB正確抓取了。
收到的三次serverId也都是同樣的值,說明三次都是同一個ECS上的服務(wù)器響應(yīng)。
至此,驗證成功。
Websocket+SLB會話保持能夠解決超時重連和切換網(wǎng)絡(luò)時重連的問題。
參考:
阿里云會話保持
解答Wi-Fi與4G網(wǎng)絡(luò)切換的困惑
WebSocket的實現(xiàn)原理
阿里云SLB對WebSocket的支持
HTTP Headers和Cookie
很多朋友可能知道Go語言的優(yōu)勢在哪,卻不知道Go語言適合用于哪些地方。
1、 Go語言作為服務(wù)器編程語言,很適合處理日志、數(shù)據(jù)打包、虛擬機處理、文件系統(tǒng)、分布式系統(tǒng)、數(shù)據(jù)庫代理等;網(wǎng)絡(luò)編程方面。Go語言廣泛應(yīng)用于Web應(yīng)用、API應(yīng)用、下載應(yīng)用等;除此之外,Go語言還可用于內(nèi)存數(shù)據(jù)庫和云平臺領(lǐng)域,目前國外很多云平臺都是采用Go開發(fā)。
2、 其實Go語言主要用作服務(wù)器端開發(fā)。其定位是用來開發(fā)"大型軟件"的,適合于很多程序員一起開發(fā)大型軟件,并且開發(fā)周期長,支持云計算的網(wǎng)絡(luò)服務(wù)。Go語言能夠讓程序員快速開發(fā),并且在軟件不斷的增長過程中,它能讓程序員更容易地進行維護和修改。它融合了傳統(tǒng)編譯型語言的高效性和腳本語言的易用性和富于表達性。
3、 Go語言成功案例。Nsq:Nsq是由Go語言開發(fā)的高性能、高可用消息隊列系統(tǒng),性能非常高,每天能處理數(shù)十億條的消息;
4、 Docker:基于lxc的一個虛擬打包工具,能夠?qū)崿F(xiàn)PAAS平臺的組建。
5、 Packer:用來生成不同平臺的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者
6、 Skynet:分布式調(diào)度框架。
7、 Doozer:分布式同步工具,類似ZooKeeper。
8、 Heka:mazila開源的日志處理系統(tǒng)。
9、 Cbfs:couchbase開源的分布式文件系統(tǒng)。
10、 Tsuru:開源的PAAS平臺,和SAE實現(xiàn)的功能一模一樣。
11、 Groupcache:memcahe作者寫的用于Google下載系統(tǒng)的緩存系統(tǒng)。
12、 God:類似redis的緩存系統(tǒng),但是支持分布式和擴展性。
13、 Gor:網(wǎng)絡(luò)流量抓包和重放工具。
以上的就是關(guān)于go語言能做什么的內(nèi)容介紹了。
文章題目:阿里云服務(wù)器go語言 阿里云 編譯服務(wù)器
本文鏈接:http://vcdvsql.cn/article18/dopgggp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計公司、用戶體驗、ChatGPT、網(wǎng)站內(nèi)鏈、虛擬主機
聲明:本網(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)