go語言sha1編碼 go語言代碼規范

WebSocket+SLB(負載均衡)會話保持解決重連問題

寫在最前面:由于現在游戲基本上采用全球大區的模式,全球玩家在同一個大區進行游戲,傳統的單服模式已經不能夠滿足當前的服務需求,所以現在游戲服務器都在往微服務架構發展。當前我們游戲也是利用微服務架構來實現全球玩家同服游戲。

成都創新互聯公司是一家專注于網站設計制作、成都做網站與策劃設計,陳倉網站建設哪家好?成都創新互聯公司做網站,專注于網站建設10余年,網設計領域的專業建站公司;建站業務涵蓋:陳倉等地區。陳倉做網站價格咨詢:13518219792

玩家每次斷線(包括切換網絡/超時斷線)后應該會重新連接服務器,重連成功的話可以繼續當前情景繼續游戲,但是之前寫的底層重連機制一直不能生效,導致每次玩家斷線后重連都失敗,要從賬號登陸開始重新登陸,該文章寫在已經定位了重連問題是由SLB引起后,提出的解決方案。

每次重連后,客戶端向SLB發送建立連接,SLB都會重新分配一個網關節點,導致客戶端連接到其他網關,重連失敗。

會話保持的作用是什么?

開啟SLB會話保持功能后,SLB會記錄客戶端的IP地址,在一定時間內,自動將同一個IP的連接轉發到上次連接的網關。

在網絡不穩定的情況下,游戲容易心跳或者發包超時,開啟會話保持,能解決大部分情況下的重連問題。

但是在切換網絡的時候,手機網絡從Wifi切換成4G,自身IP會變,這時候連接必定和服務器斷開,需要重新建立連接。由于IP已經變化,SLB不能識別到是同一個客戶端發出的請求,會將連接轉發到其他網關節點。所以使用TCP連接的情況下,SLB開啟會話保持并不能解決所有的重連問題。

另外某些時刻,手機頻繁開啟和斷開WI-FI,有時候可能不會斷開網絡,這并不是因為4G切換WI-FI時網絡沒斷開,從4G切換到Wi-Fi網絡,因為IP變了,服務器不能識別到新的IP,連接肯定是斷開的。這時候網絡沒斷開,主要是因為現在智能手機會對4G和Wi-Fi網絡做個權重判斷,當Wi-Fi網絡頻繁打開關閉時,手機會判斷Wi-Fi網絡不穩定,所有流量都走4G。所以網絡沒斷開是因為一直使用4G連接,才沒有斷開。想要驗證,只需要切換Wi-Fi時,把4G網絡關閉,這樣流量就必定走Wi-Fi。

上面說過,四層的TCP協議主要是基于IP來實現會話保持。但是切換網絡的時候客戶端的IP會變。所以要解決切換網絡時的重連問題,只有兩個方法:1. 當客戶端成功連接網關節點后,記錄下網關節點的IP,下次重連后不經過SLB,直接向網關節點發送連接請求。2.使用 SLB的七層(HTTP)轉發服務。

當客戶端經過SLB將連接轉發到網關時,二次握手驗證成功后向客戶端發送自己節點的IP,這樣客戶端下次連接的時候就能直接連接網關節點。但是這樣會暴露網關的IP地址,為安全留下隱患。

如果不希望暴露網關的IP地址,就需要增加一層代理層,SLB將客戶端請求轉發到代理層,代理層再根據客戶端帶有的key,轉發到正確的網關節點上。增加一層代理層,不僅會增加請求的響應時間,還會增加整體框架的復雜度。

阿里云的七層SLB會話保持服務,主要是基于cookie的會話保持。客戶端在往服務器發送HTTP請求后,服務器會返回客戶端一個Response,SLB會在這時候,將經過的Response插入或者重寫cookie。客戶端獲取到這個cookie,下次請求時會帶上cookie,SLB判斷Request的Headers里面有cookie,就將連接轉發到之前的網關節點。

HTTP是短鏈接,我們游戲是長連接,所以用HTTP肯定不合適。但是可以考慮基于HTTP的WebSocket。

什么是WebSocket?

WSS(Web Socket Secure)是WebSocket的加密版本。

SLB對WebSocket的支持

查看阿里云SLB文檔對WS的支持,說明SLB是支持WS協議的,并且SLB對于WS無需配置,只需要選用HTTP監聽時,就能夠轉發WS協議。說明WS協議在SLB這邊看來就是一個HTTP,這樣WS走的也是七層的轉發服務。只要SLB能夠正常識別WS握手協議里Request的cookie和正常識別服務器返回的Response并且往里面插入cookie,就可以利用會話保持解決重連問題。

Go語言實現WS服務器有兩種方法,一種是利用golang.org/x/net下的websocket包,另外一種方法就是自己解讀Websocket協議來實現,由于WS協議一樣是基于TCP協議之上,完全可以通過監聽TCP端口來實現。

客戶端發送Request消息

服務器返回Response消息

其中服務器返回的Sec-WebSocket-Accept字段,主要是用于客戶端需要驗證服務器是否支持WS。RFC6455文檔中規定,在WebSocket通信協議中服務端為了證實已經接收了握手,它需要把兩部分的數據合并成一個響應。一部分信息來自客戶端握手的Sec-WebSocket-Keyt頭字段:Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==。對于這個字段,服務端必須得到這個值(頭字段中經過base64編碼的值減去前后的空格)并與GUID"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"組合成一個字符串,這個字符串對于不懂WebSocket協議的網絡終端來說是不能使用的。這個組合經過SHA-1掩碼,base64編碼后在服務端的握手中返回。如果這個Sec-WebSocket-Accept計算錯誤瀏覽器會提示:Sec-WebSocket-Accept dismatch

如果返回成功,Websocket就會回調onopen事件

游戲服務器的使用的TCP協議,是在協議的包頭使用4Byte來聲明本協議長度,然后將協議一次性發送。但是在WS協議是通過Frame形式發送的,會將一條消息分為幾個frame,按照先后順序傳輸出去。這樣做會有幾個好處:

websocket的協議格式:

參數說明如下:

阿里云的SLB開啟HTTP監聽后,會檢查過往的Request和Response請求,收到服務器返回的Response后,會往Response插入一個Cookie

客戶端收到服務器的Response后,可以在Header中查到有個“Set-Cookie”字段,里面是SLB插入的Cookie值

客戶端斷開連接后,下次發送請求需要往Headers插入Cookie字段

分別在阿里云的兩臺ECS實例上部署WS服務器,打開8000端口,開啟一個SLB服務,SLB服務選擇HTTP方式監聽,并且打開會話保持功能,Cookie處理方式選擇植入Cookie。Demo服務器沒有做HTTP健康監聽的處理,健康檢查這塊可以先關掉。

在兩臺ECS上啟動WS服務器,然后本地運行客戶端,分別測試兩臺服務器是否能正常連接,測試完畢后,測試SLB能否正常工作。服務器和SLB都正常的情況下,運行客戶端,客戶端會得到以下結果

收到的三次Cookie都相同,說明Cookie是有正常植入工作的,并且三次都被SLB正確抓取了。

收到的三次serverId也都是同樣的值,說明三次都是同一個ECS上的服務器響應。

至此,驗證成功。

Websocket+SLB會話保持能夠解決超時重連和切換網絡時重連的問題。

參考:

阿里云會話保持

解答Wi-Fi與4G網絡切換的困惑

WebSocket的實現原理

阿里云SLB對WebSocket的支持

HTTP Headers和Cookie

go語言簡體中文編碼包怎么用

二進制包安裝的話:如果安裝在了默認位置例如/usr/local/go (Windows系統:c:\Go)這個時候可以不需要設置GOROOT,如果改變了安裝的這個默認目錄,那么就需要設置GOROOT

GOROOT的概念有點Go安裝目錄的意思

GOPATH是一個開發環境目錄的意思,下面必須包含bin、pkg、src,然后再src下面新建項目就可以了

你在沒有設置GOPATH的情況下,也可以把項目建在GOROOT/src下面,其實和GOPATH的概念類似

請教,golang中的hmac驗證應該怎樣寫

package main

import (

"crypto/hmac"

"crypto/sha1"

"fmt"

"io"

)

func main() {

//sha1

h := sha1.New()

io.WriteString(h, "aaaaaa")

fmt.Printf("%x\n", h.Sum(nil))

//hmac ,use sha1

key := []byte("123456")

mac := hmac.New(sha1.New, key)

mac.Write([]byte("aaaaaa"))

fmt.Printf("%x\n", mac.Sum(nil))

}

網頁標題:go語言sha1編碼 go語言代碼規范
文章網址:http://m.kartarina.com/article22/dogesjc.html

成都網站建設公司_創新互聯,為您提供網站排名微信公眾號品牌網站制作小程序開發企業網站制作域名注冊

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站建設
主站蜘蛛池模板: 亚洲AV无码一区二区三区性色| 亚洲AV日韩AV永久无码久久| 免费A级毛片无码久久版| 最新中文字幕AV无码不卡| 亚洲国产精品无码久久一线| 伊人无码精品久久一区二区| 一本大道久久东京热无码AV| 久久无码高潮喷水| 日韩人妻无码一区二区三区 | 中文字幕韩国三级理论无码| 精品乱码一区内射人妻无码| 亚洲中文字幕无码中文| 国产成年无码久久久久毛片| 人妻系列无码专区久久五月天| 久久久久亚洲av无码专区| 国产精品无码无片在线观看| av无码东京热亚洲男人的天堂| av大片在线无码免费| 日韩精品久久无码人妻中文字幕| 一本大道无码人妻精品专区| 毛片亚洲AV无码精品国产午夜| 无码不卡av东京热毛片| 亚洲AV区无码字幕中文色| 亚洲国产精品无码av| 中文字幕AV中文字无码亚| 亚洲精品一级无码鲁丝片 | 国产精品爽爽V在线观看无码 | 人妻丰满熟妇av无码区不卡| 中国少妇无码专区| av无码人妻一区二区三区牛牛| 亚洲无码日韩精品第一页| 国产精品一级毛片无码视频| 国产精品爆乳奶水无码视频| 夜夜精品无码一区二区三区| 亚洲av中文无码| 日本无码小泬粉嫩精品图| 人妻系列AV无码专区| 国产白丝无码免费视频| 免费精品无码AV片在线观看| 亚洲A∨无码一区二区三区| av大片在线无码免费|