gin websocket 簡單分散式實現
main.go
import (
"github.com/gin-gonic/gin"
)
func main() {
...
// 連線ws會先發Get,正常返回101
r.GET("/ws", func(c *gin.Context) {
WsHandler(c.Writer, c.Request)
})
...
r.Run()
}
handler.go
websocket接入:
import "github.com/gorilla/websocket"
var wsupgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
HandshakeTimeout: 5 * time.Second,
// 取消ws跨域校驗
CheckOrigin: func(r *http.Request) bool {
return true
},
}
// 處理ws請求
func WsHandler(w http.ResponseWriter, r *http.Request) {
var conn *websocket.Conn
var err error
conn, err = wsupgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Println("Failed to set websocket upgrade: %+v", err)
return
}
// 必須死迴圈,gin通過協程呼叫該handler函式,一旦退出函式,ws會被主動銷燬
for {
// recieve
t, reply, err := conn.ReadMessage()
if err != nil {
break
}
// todo:業務操作
}
}
分散式擴充套件,使用rds或者kafka等解耦合
當ws建立連線後,可輪詢共享記憶體(rds)是否有新訊息,若有新訊息,則往ws寫資料。
配合客戶端重連機制,很好實現分散式長連線IM和PUSH擴充套件。
// 業務操作呼叫寫rds
func SendMsg2Rds(uid int64, msg *WsMsg) {
// list 或者 pubsub 結構
}
// 業務操作呼叫讀rds
func ReadMsgFromRds(uid int64) *WsMsg {
// list 或者 pubsub 結構
}
// 協程輪詢rds:go RevAndSend
func RevAndSend(uid int64,ws *websocket.Conn) {
for {
// 若ws斷開,則break
if msg := ReadMsgFromRds(uid); msg != nil {
// 向rds寫資料
ws.WriteMessage(websocket.TextMessage, []byte(msg.ToJson()))
}
}
}
websocket 握手協議
客戶端會傳送Get請求,帶有核心欄位:
Upgrade: websocket
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
服務端會將101作為返回碼返回,作為握手成功的標示
相關文章
- PHP 實現簡單阻塞分散式鎖PHP分散式
- 部署超簡單的 Golong 分散式 WebSocket 微服務Go分散式Web微服務
- 如何實現簡單的分散式鏈路功能?分散式
- [開源] Golang 實現的分散式 WebSocket 微服務Golang分散式Web微服務
- C# WebSocket的簡單使用【使用Fleck實現】C#Web
- SpringBoot基於資料庫實現簡單的分散式鎖Spring Boot資料庫分散式
- Spring Boot中使用WebSocket總結(三):使用訊息佇列實現分散式WebSocketSpring BootWeb佇列分散式
- go實現簡易分散式系統Go分散式
- 使用WebSocket實現一個簡單的頁面聊天Web
- 分散式WebSocket架構分散式Web架構
- 分散式鎖簡單入門以及三種實現方式介紹分散式
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- SpringBoot2 整合 WebSocket 簡單實現聊天室功能Spring BootWeb
- IW聊聊使用RedisTemplat實現簡單的分散式鎖的問題vawRedis分散式
- 簡單聊聊WebSocketWeb
- 用node實現一個簡單的聊天室——websocket實踐Web
- Gin與Mysql實現簡單Restful風格API實戰示例詳解PRHCMySqlRESTAPI
- 深入淺出Websocket(二)分散式Websocket叢集Web分散式
- Gin 框架的簡單搭建框架
- 基於 WebSocket 的 PPT 遠端控制器簡單實現Web
- 分散式系列七: zookeeper簡單用法分散式
- Redisson分散式鎖的簡單使用Redis分散式
- WebSocket 簡單瞭解Web
- 簡單的websocket demoWeb
- Dapr實現一個簡單的基於.net分散式事務之Saga模式分散式模式
- ZooKeeper學習筆記四:使用ZooKeeper實現一個簡單的分散式鎖筆記分散式
- 實現分散式鎖分散式
- LightDB分散式實現分散式
- 分散式鎖實現分散式
- 基於Websocket的簡易webshell實現Webshell
- Feacar分散式事務框架簡單使用分散式框架
- Hadoop--HDFS完全分散式(簡單版)Hadoop分散式
- websocket+node實現一個最簡單的即時通訊功能Web
- WebSocket就是這麼簡單Web
- 分散式下的WebSocket解決方案分散式Web
- 第17章-golang實現簡易的分散式系統Golang分散式
- 分散式鎖----Redis實現分散式Redis
- Redis實現分散式鎖Redis分散式