這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
使用beego架構進行整個社區的restful api的開發,尋找資料後決定使用github.com/gorilla/websocket 作為websocket的包,
定義websocket的屬性
var upgrader = websocket.Upgrader{ReadBufferSize: 1024,WriteBufferSize: 1024,}
都是按照官方的例子來,期間也參考了beego的一個聊天室的執行個體。
ws, err := upgrader.Upgrade(this.Ctx.ResponseWriter, this.Ctx.Request, nil)defer ws.Close()
因為是使用beego架構,所以執行個體化websocket的時候,傳輸的參數是使用beego的擷取方式
執行個體化ws以後,使用了一個for迴圈,等待接收資料,並且對資料進行處理
_, p, err := ws.ReadMessage()
這裡我沒有對內容進行判斷,所以第一個參數,返回的資料類型,我直接拋棄了,因為功能很簡單,所以也就不做資料類型驗證,對資料進行一堆處理之後,返回json
if err = ws.WriteJSON(resMap); err != nil {fmt.Println(err)ws.Close()break}
測試方便,把報錯資訊直接打出,ws包帶著返回json的方式,直接把map傳遞過來就可以了,如果報錯一定要直接ws.Close() 不然會被後台資訊淹沒掉
其實用法很簡單,麻煩的是公司的nginx版本太低,部署的時候先升級了nginx,然後做了個反向 Proxy,監聽了指令碼的連接埠,
設定了cgi的存活時間,否則是按照php的設定來的,所以單獨給websocket程式的段增加了期間
因為程式邏輯裡還有一個延遲等待的功能,開始是使用一個time.sleep來實現,後來讀了go語言程式設計後,學會了一招,可以用channel來做處理。
設定nginx的方法
因為部署在php的伺服器上,所以直接使用supertctl做了一個進程監控,讓go作為一個後台進程運行,然後使用nginx做了一個反向 Proxy,設定如下
首先。修改nginx.conf檔案, 要在 http 裡面添加配置,也就是 跟server同級
map $http_upgrade $connection_upgrade { default upgrade; '' close;} #limit_zone crawler $binary_remote_addr 10m;upstream websocket { server 127.0.0.1:8198;}
設定反向 Proxy 我的是監聽本機8198連接埠
然後設定 訪問的目錄
location /backapi/ { proxy_set_header Host $host; proxy_pass http://websocket; proxy_http_version 1.1; proxy_read_timeout 86400s; keepalive_timeout 86400s; #proxy_redirect off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
設定了nginx擷取到對目錄的訪問的時候,調用go的指令碼進行解析,並且設定了讀取的時間為86400秒,防止ngxin對用戶端自動關閉