欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語(yǔ)言連接服務(wù)器,go服務(wù)端

go語(yǔ)言如何連接sql server數(shù)據(jù)庫(kù)

高級(jí)!能用上go語(yǔ)言了嗎?不會(huì)是Android Studio吧?!

創(chuàng)新互聯(lián)建站專注于賽罕網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供賽罕營(yíng)銷型網(wǎng)站建設(shè),賽罕網(wǎng)站制作、賽罕網(wǎng)頁(yè)設(shè)計(jì)、賽罕網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)公司服務(wù),打造賽罕網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供賽罕網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

如果是Apk是連不上SQL的,訪問WebService,手機(jī)做SQL服務(wù)一般用WEB,不用WAP,手機(jī)可以直接訪問WEB,無論什么編寫的,如果是特殊需要,那就用WebService去返回查詢結(jié)果

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

寫在最前面:由于現(xiàn)在游戲基本上采用全球大區(qū)的模式,全球玩家在同一個(gè)大區(qū)進(jìn)行游戲,傳統(tǒng)的單服模式已經(jīng)不能夠滿足當(dāng)前的服務(wù)需求,所以現(xiàn)在游戲服務(wù)器都在往微服務(wù)架構(gòu)發(fā)展。當(dāng)前我們游戲也是利用微服務(wù)架構(gòu)來實(shí)現(xiàn)全球玩家同服游戲。

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

每次重連后,客戶端向SLB發(fā)送建立連接,SLB都會(huì)重新分配一個(gè)網(wǎng)關(guān)節(jié)點(diǎn),導(dǎo)致客戶端連接到其他網(wǎng)關(guān),重連失敗。

會(huì)話保持的作用是什么?

開啟SLB會(huì)話保持功能后,SLB會(huì)記錄客戶端的IP地址,在一定時(shí)間內(nèi),自動(dòng)將同一個(gè)IP的連接轉(zhuǎn)發(fā)到上次連接的網(wǎng)關(guān)。

在網(wǎng)絡(luò)不穩(wěn)定的情況下,游戲容易心跳或者發(fā)包超時(shí),開啟會(huì)話保持,能解決大部分情況下的重連問題。

但是在切換網(wǎng)絡(luò)的時(shí)候,手機(jī)網(wǎng)絡(luò)從Wifi切換成4G,自身IP會(huì)變,這時(shí)候連接必定和服務(wù)器斷開,需要重新建立連接。由于IP已經(jīng)變化,SLB不能識(shí)別到是同一個(gè)客戶端發(fā)出的請(qǐng)求,會(huì)將連接轉(zhuǎn)發(fā)到其他網(wǎng)關(guān)節(jié)點(diǎn)。所以使用TCP連接的情況下,SLB開啟會(huì)話保持并不能解決所有的重連問題。

另外某些時(shí)刻,手機(jī)頻繁開啟和斷開WI-FI,有時(shí)候可能不會(huì)斷開網(wǎng)絡(luò),這并不是因?yàn)?G切換WI-FI時(shí)網(wǎng)絡(luò)沒斷開,從4G切換到Wi-Fi網(wǎng)絡(luò),因?yàn)镮P變了,服務(wù)器不能識(shí)別到新的IP,連接肯定是斷開的。這時(shí)候網(wǎng)絡(luò)沒斷開,主要是因?yàn)楝F(xiàn)在智能手機(jī)會(huì)對(duì)4G和Wi-Fi網(wǎng)絡(luò)做個(gè)權(quán)重判斷,當(dāng)Wi-Fi網(wǎng)絡(luò)頻繁打開關(guān)閉時(shí),手機(jī)會(huì)判斷Wi-Fi網(wǎng)絡(luò)不穩(wěn)定,所有流量都走4G。所以網(wǎng)絡(luò)沒斷開是因?yàn)橐恢笔褂?G連接,才沒有斷開。想要驗(yàn)證,只需要切換Wi-Fi時(shí),把4G網(wǎng)絡(luò)關(guān)閉,這樣流量就必定走Wi-Fi。

上面說過,四層的TCP協(xié)議主要是基于IP來實(shí)現(xiàn)會(huì)話保持。但是切換網(wǎng)絡(luò)的時(shí)候客戶端的IP會(huì)變。所以要解決切換網(wǎng)絡(luò)時(shí)的重連問題,只有兩個(gè)方法:1. 當(dāng)客戶端成功連接網(wǎng)關(guān)節(jié)點(diǎn)后,記錄下網(wǎng)關(guān)節(jié)點(diǎn)的IP,下次重連后不經(jīng)過SLB,直接向網(wǎng)關(guān)節(jié)點(diǎn)發(fā)送連接請(qǐng)求。2.使用 SLB的七層(HTTP)轉(zhuǎn)發(fā)服務(wù)。

當(dāng)客戶端經(jīng)過SLB將連接轉(zhuǎn)發(fā)到網(wǎng)關(guān)時(shí),二次握手驗(yàn)證成功后向客戶端發(fā)送自己節(jié)點(diǎn)的IP,這樣客戶端下次連接的時(shí)候就能直接連接網(wǎng)關(guān)節(jié)點(diǎn)。但是這樣會(huì)暴露網(wǎng)關(guān)的IP地址,為安全留下隱患。

如果不希望暴露網(wǎng)關(guān)的IP地址,就需要增加一層代理層,SLB將客戶端請(qǐng)求轉(zhuǎn)發(fā)到代理層,代理層再根據(jù)客戶端帶有的key,轉(zhuǎn)發(fā)到正確的網(wǎng)關(guān)節(jié)點(diǎn)上。增加一層代理層,不僅會(huì)增加請(qǐng)求的響應(yīng)時(shí)間,還會(huì)增加整體框架的復(fù)雜度。

阿里云的七層SLB會(huì)話保持服務(wù),主要是基于cookie的會(huì)話保持。客戶端在往服務(wù)器發(fā)送HTTP請(qǐng)求后,服務(wù)器會(huì)返回客戶端一個(gè)Response,SLB會(huì)在這時(shí)候,將經(jīng)過的Response插入或者重寫cookie。客戶端獲取到這個(gè)cookie,下次請(qǐng)求時(shí)會(huì)帶上cookie,SLB判斷Request的Headers里面有cookie,就將連接轉(zhuǎn)發(fā)到之前的網(wǎng)關(guān)節(jié)點(diǎn)。

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

什么是WebSocket?

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

SLB對(duì)WebSocket的支持

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

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

客戶端發(fā)送Request消息

服務(wù)器返回Response消息

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

如果返回成功,Websocket就會(huì)回調(diào)onopen事件

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

websocket的協(xié)議格式:

參數(shù)說明如下:

阿里云的SLB開啟HTTP監(jiān)聽后,會(huì)檢查過往的Request和Response請(qǐng)求,收到服務(wù)器返回的Response后,會(huì)往Response插入一個(gè)Cookie

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

客戶端斷開連接后,下次發(fā)送請(qǐng)求需要往Headers插入Cookie字段

分別在阿里云的兩臺(tái)ECS實(shí)例上部署WS服務(wù)器,打開8000端口,開啟一個(gè)SLB服務(wù),SLB服務(wù)選擇HTTP方式監(jiān)聽,并且打開會(huì)話保持功能,Cookie處理方式選擇植入Cookie。Demo服務(wù)器沒有做HTTP健康監(jiān)聽的處理,健康檢查這塊可以先關(guān)掉。

在兩臺(tái)ECS上啟動(dòng)WS服務(wù)器,然后本地運(yùn)行客戶端,分別測(cè)試兩臺(tái)服務(wù)器是否能正常連接,測(cè)試完畢后,測(cè)試SLB能否正常工作。服務(wù)器和SLB都正常的情況下,運(yùn)行客戶端,客戶端會(huì)得到以下結(jié)果

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

收到的三次serverId也都是同樣的值,說明三次都是同一個(gè)ECS上的服務(wù)器響應(yīng)。

至此,驗(yàn)證成功。

Websocket+SLB會(huì)話保持能夠解決超時(shí)重連和切換網(wǎng)絡(luò)時(shí)重連的問題。

參考:

阿里云會(huì)話保持

解答Wi-Fi與4G網(wǎng)絡(luò)切換的困惑

WebSocket的實(shí)現(xiàn)原理

阿里云SLB對(duì)WebSocket的支持

HTTP Headers和Cookie

go語(yǔ)言TCP連接池rocket049/connpool使用

安裝:

go get -v -u github.com/rocket049/connpool

go get -v -u gitee.com/rocket049/connpool

rocket049/connpool 包是本人用go語(yǔ)言開發(fā)的,提供一個(gè)通用的TCP連接池,初始化參數(shù)包括最高連接數(shù)、超時(shí)秒數(shù)、連接函數(shù),放回連接池的連接被重新取出時(shí),如果已經(jīng)超時(shí),將會(huì)自動(dòng)重新連接;如果沒有超時(shí),連接將被復(fù)用。

可調(diào)用的函數(shù):

調(diào)用示例:

為什么go語(yǔ)言適合開發(fā)網(wǎng)游服務(wù)器端

前段時(shí)間在golang-China讀到這個(gè)貼:

個(gè)人覺得golang十分適合進(jìn)行網(wǎng)游服務(wù)器端開發(fā),寫下這篇文章總結(jié)一下。

從網(wǎng)游的角度看:

要成功的運(yùn)營(yíng)一款網(wǎng)游,很大程度上依賴于玩家自發(fā)形成的社區(qū)。只有玩家自發(fā)形成一個(gè)穩(wěn)定的生態(tài)系統(tǒng),游戲才能持續(xù)下去,避免鬼城的出現(xiàn)。而這就需要多次大量導(dǎo)入用戶,在同時(shí)在線用戶量達(dá)到某個(gè)臨界點(diǎn)的時(shí)候,才有可能完成。因此,多人同時(shí)在線十分有必要。

再來看網(wǎng)游的常見玩法,除了排行榜這類統(tǒng)計(jì)和數(shù)據(jù)匯總的功能外,基本沒有需要大量CPU時(shí)間的應(yīng)用。以前的項(xiàng)目里,即時(shí)戰(zhàn)斗產(chǎn)生的各種傷害計(jì)算對(duì)CPU的消耗也不大。玩家要完成一次操作,需要通過客戶端-服務(wù)器端-客戶端這樣一個(gè)來回,為了獲得高響應(yīng)速度,滿足玩家體驗(yàn),服務(wù)器端的處理也不能占用太多時(shí)間。所以,每次請(qǐng)求對(duì)應(yīng)的CPU占用是比較小的。

網(wǎng)游的IO主要分兩個(gè)方面,一個(gè)是網(wǎng)絡(luò)IO,一個(gè)是磁盤IO。網(wǎng)絡(luò)IO方面,可以分成美術(shù)資源的IO和游戲邏輯指令的IO,這里主要分析游戲邏輯的IO。游戲邏輯的IO跟CPU占用的情況相似,每次請(qǐng)求的字節(jié)數(shù)很小,但由于多人同時(shí)在線,因此并發(fā)數(shù)相當(dāng)高。另外,地圖信息的廣播也會(huì)帶來比較頻繁的網(wǎng)絡(luò)通信。磁盤IO方面,主要是游戲數(shù)據(jù)的保存。采用不同的數(shù)據(jù)庫(kù),會(huì)有比較大的區(qū)別。以前的項(xiàng)目里,就經(jīng)歷了從MySQL轉(zhuǎn)向MongoDB這種內(nèi)存數(shù)據(jù)庫(kù)的過程,磁盤IO不再是瓶頸。總體來說,還是用內(nèi)存做一級(jí)緩沖,避免大量小數(shù)據(jù)塊讀寫的方案。

針對(duì)網(wǎng)游的這些特點(diǎn),golang的語(yǔ)言特性十分適合開發(fā)游戲服務(wù)器端。

首先,go語(yǔ)言提供goroutine機(jī)制作為原生的并發(fā)機(jī)制。每個(gè)goroutine所需的內(nèi)存很少,實(shí)際應(yīng)用中可以啟動(dòng)大量的goroutine對(duì)并發(fā)連接進(jìn)行響應(yīng)。goroutine與gevent中的greenlet很相像,遇到IO阻塞的時(shí)候,調(diào)度器就會(huì)自動(dòng)切換到另一個(gè)goroutine執(zhí)行,保證CPU不會(huì)因?yàn)镮O而發(fā)生等待。而goroutine與gevent相比,沒有了python底層的GIL限制,就不需要利用多進(jìn)程來榨取多核機(jī)器的性能了。通過設(shè)置最大線程數(shù),可以控制go所啟動(dòng)的線程,每個(gè)線程執(zhí)行一個(gè)goroutine,讓CPU滿負(fù)載運(yùn)行。

同時(shí),go語(yǔ)言為goroutine提供了獨(dú)到的通信機(jī)制channel。channel發(fā)生讀寫的時(shí)候,也會(huì)掛起當(dāng)前操作channel的goroutine,是一種同步阻塞通信。這樣既達(dá)到了通信的目的,又實(shí)現(xiàn)同步,用CSP模型的觀點(diǎn)看,并發(fā)模型就是通過一組進(jìn)程和進(jìn)程間的事件觸發(fā)解決任務(wù)的。雖然說,主流的編程語(yǔ)言之間,只要是圖靈完備的,他們就都能實(shí)現(xiàn)相同的功能。但go語(yǔ)言提供的這種協(xié)程間通信機(jī)制,十分優(yōu)雅地揭示了協(xié)程通信的本質(zhì),避免了以往鎖的顯式使用帶給程序員的心理負(fù)擔(dān),確是一大優(yōu)勢(shì)。進(jìn)行網(wǎng)游開發(fā)的程序員,可以將游戲邏輯按照單線程阻塞式的寫,不需要額外考慮線程調(diào)度的問題,以及線程間數(shù)據(jù)依賴的問題。因?yàn)椋€程間的channel通信,已經(jīng)表達(dá)了線程間的數(shù)據(jù)依賴關(guān)系了,而go的調(diào)度器會(huì)給予妥善的處理。

另外,go語(yǔ)言提供的gc機(jī)制,以及對(duì)指針的保護(hù)式使用,可以大大減輕程序員的開發(fā)壓力,提高開發(fā)效率。

展望未來,我期待go語(yǔ)言社區(qū)能夠提供更多的goroutine間的隔離機(jī)制。個(gè)人十分推崇erlang社區(qū)的脆崩哲學(xué),推動(dòng)應(yīng)用發(fā)生預(yù)期外行為時(shí),盡早崩潰,再fork出新進(jìn)程處理新的請(qǐng)求。對(duì)于協(xié)程機(jī)制,需要由程序員保證執(zhí)行的函數(shù)不會(huì)發(fā)生死循環(huán),導(dǎo)致線程卡死。如果能夠定制goroutine所執(zhí)行函數(shù)的最大CPU執(zhí)行時(shí)間,及所能使用的最大內(nèi)存空間,對(duì)于提升系統(tǒng)的魯棒性,大有裨益。

go語(yǔ)言怎么連接oracle數(shù)據(jù)庫(kù)

//假設(shè)的GOPATH指向C:\gohome

0. 執(zhí)行 go get github.com/wendal/go-oci8 ,然后肯定是報(bào)錯(cuò)了,沒關(guān)系,代碼會(huì)下載下來.

1. 首先,你需要安裝mingw到C:\mingw

2. 然后,到Oracle官網(wǎng),下載OCI及其SDK,解壓到instantclient_11_2 -- 當(dāng)前最新版

3. 從我的go-oci8庫(kù)的windows文件夾,拷貝pkg-config.exe到C:\mingw\bin\,拷貝oci8.pc到C:\mingw\lib\pkg-config\

4. 設(shè)置環(huán)境變量 PATH ,值為 原有PATH;C:\instantclient_11_2;C:\mingw\bin;

5. 設(shè)置環(huán)境變量 PKG_CONFIG_PATH,值為 C:\mingw\lib\pkg-config

6. 接下來,就最重要的,就是再執(zhí)行一次,這次應(yīng)該能成功的: go get github.com/wendal/go-oci8

7. 測(cè)試一下:

cd %GOPATH%/src/github.com/wendal/go-oci8/example

go run oracle.go

#提醒一句, oracle.go里面的寫的密碼是system/123456, 實(shí)例名XE

go語(yǔ)言聊天室實(shí)現(xiàn)(六)創(chuàng)建HTTP連接,并升級(jí)為長(zhǎng)連接

我們?cè)趍ian函數(shù)中,首先初始化配置文件,然后新建http連接。

這個(gè)連接創(chuàng)建之后,監(jiān)聽服務(wù)器的9999端口。如果url的路徑后綴為 "/ws",就轉(zhuǎn)發(fā)到ws/ws.go中的IndexHandler方法中。

這個(gè)方法中首先我們創(chuàng)建一個(gè)websocket的Upgrader實(shí)例,然后我們使用Upgrader的upgrade方法來升級(jí)一下我們的連接為長(zhǎng)連接。

升級(jí)完成之后會(huì)返回一個(gè)*websocket.Conn的連接,我們之后所有的關(guān)于連接的操作,都是基于該conn的。

在該連接完成之后,我們將連接存放到一個(gè)名為Client的map中,以便之后管理更為方便。

之后,我們啟動(dòng)一個(gè)goroutine來讀取連接中發(fā)送的信息內(nèi)容,再根據(jù)內(nèi)容進(jìn)行相應(yīng)的操作。

分享名稱:go語(yǔ)言連接服務(wù)器,go服務(wù)端
文章來源:http://www.chinadenli.net/article40/heisho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站關(guān)鍵詞優(yōu)化網(wǎng)頁(yè)設(shè)計(jì)公司標(biāo)簽優(yōu)化App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)