日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

基于websocket单台机器支持百万连接分布式聊天(IM)系统

發(fā)布時(shí)間:2023/12/10 windows 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于websocket单台机器支持百万连接分布式聊天(IM)系统 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文將介紹如何實(shí)現(xiàn)一個(gè)基于websocket分布式聊天(IM)系統(tǒng)。

使用golang實(shí)現(xiàn)websocket通訊,單機(jī)可以支持百萬連接,使用gin框架、nginx負(fù)載、可以水平部署、程序內(nèi)部相互通訊、使用grpc通訊協(xié)議。

本文內(nèi)容比較長,如果直接想clone項(xiàng)目體驗(yàn)直接進(jìn)入項(xiàng)目體驗(yàn) goWebSocket項(xiàng)目下載 ,文本從介紹webSocket是什么開始,然后開始介紹這個(gè)項(xiàng)目,以及在Nginx中配置域名做webSocket的轉(zhuǎn)發(fā),然后介紹如何搭建一個(gè)分布式系統(tǒng)。

目錄

  • 1、項(xiàng)目說明
    • 1.1 goWebSocket
    • 1.2 項(xiàng)目體驗(yàn)
  • 2、介紹webSocket
    • 2.1 webSocket 是什么
    • 2.2 webSocket的兼容性
    • 2.3 為什么要用webSocket
    • 2.4 webSocket建立過程
  • 3、如何實(shí)現(xiàn)基于webSocket的長連接系統(tǒng)
    • 3.1 使用go實(shí)現(xiàn)webSocket服務(wù)端
      • 3.1.1 啟動端口監(jiān)聽
      • 3.1.2 升級協(xié)議
      • 3.1.3 客戶端連接的管理
      • 3.1.4 注冊客戶端的socket的寫的異步處理程序
      • 3.1.5 注冊客戶端的socket的讀的異步處理程序
      • 3.1.6 接收客戶端數(shù)據(jù)并處理
      • 3.1.7 使用路由的方式處理客戶端的請求數(shù)據(jù)
      • 3.1.8 防止內(nèi)存溢出和Goroutine不回收
    • 3.2 使用javaScript實(shí)現(xiàn)webSocket客戶端
      • 3.2.1 啟動并注冊監(jiān)聽程序
      • 3.2.2 發(fā)送數(shù)據(jù)
  • 4、goWebSocket 項(xiàng)目
    • 4.1 項(xiàng)目說明
    • 4.2 項(xiàng)目依賴
    • 4.3 項(xiàng)目啟動
  • 5、webSocket項(xiàng)目Nginx配置
    • 5.1 為什么要配置Nginx
    • 5.2 nginx配置
    • 5.3 問題處理
  • 6、壓測
    • 6.1 Linux內(nèi)核優(yōu)化
    • 6.2 壓測準(zhǔn)備
    • 6.3 壓測數(shù)據(jù)
  • 7、如何基于webSocket實(shí)現(xiàn)一個(gè)分布式Im
    • 7.1 說明
    • 7.2 架構(gòu)
    • 7.3 分布式系統(tǒng)部署
  • 8、回顧和反思
    • 8.1 在其它系統(tǒng)應(yīng)用
    • 8.2 需要完善、優(yōu)化
    • 8.3 總結(jié)
  • 9、參考文獻(xiàn)

1、項(xiàng)目說明

1.1 goWebSocket

本文將介紹如何實(shí)現(xiàn)一個(gè)基于websocket聊天(IM)分布式系統(tǒng)。

使用golang實(shí)現(xiàn)websocket通訊,單機(jī)支持百萬連接,使用gin框架、nginx負(fù)載、可以水平部署、程序內(nèi)部相互通訊、使用grpc通訊協(xié)議。

  • 一般項(xiàng)目中webSocket使用的架構(gòu)圖

1.2 項(xiàng)目體驗(yàn)

  • 項(xiàng)目地址 gowebsocket
  • IM-聊天首頁 或者在新的窗口打開 http://im.91vh.com/home/index
  • 打開連接以后進(jìn)入聊天界面
  • 多人群聊可以同時(shí)打開兩個(gè)窗口

2、介紹webSocket

2.1 webSocket 是什么

WebSocket 協(xié)議在2008年誕生,2011年成為國際標(biāo)準(zhǔn)。所有瀏覽器都已經(jīng)支持了。

它的最大特點(diǎn)就是,服務(wù)器可以主動向客戶端推送信息,客戶端也可以主動向服務(wù)器發(fā)送信息,是真正的雙向平等對話,屬于服務(wù)器推送技術(shù)的一種。

  • HTTP和WebSocket在通訊過程的比較

  • HTTP和webSocket都支持配置證書,ws:// 無證書 wss:// 配置證書的協(xié)議標(biāo)識

2.2 webSocket的兼容性

  • 瀏覽器的兼容性,開始支持webSocket的版本

  • 服務(wù)端的支持

golang、java、php、node.js、python、nginx 都有不錯(cuò)的支持

  • Android和IOS的支持

Android可以使用java-webSocket對webSocket支持

iOS 4.2及更高版本具有WebSockets支持

2.3 為什么要用webSocket

  • 從業(yè)務(wù)上出發(fā),需要一個(gè)主動通達(dá)客戶端的能力

目前大多數(shù)的請求都是使用HTTP,都是由客戶端發(fā)起一個(gè)請求,有服務(wù)端處理,然后返回結(jié)果,不可以服務(wù)端主動向某一個(gè)客戶端主動發(fā)送數(shù)據(jù)

  • 大多數(shù)場景我們需要主動通知用戶,如:聊天系統(tǒng)、用戶完成任務(wù)主動告訴用戶、一些運(yùn)營活動需要通知到在線的用戶
  • 可以獲取用戶在線狀態(tài)
  • 在沒有長連接的時(shí)候通過客戶端主動輪詢獲取數(shù)據(jù)
  • 可以通過一種方式實(shí)現(xiàn),多種不同平臺(H5/Android/IOS)去使用

2.4 webSocket建立過程

  • 客戶端先發(fā)起升級協(xié)議的請求

客戶端發(fā)起升級協(xié)議的請求,采用標(biāo)準(zhǔn)的HTTP報(bào)文格式,在報(bào)文中添加頭部信息

Connection: Upgrade表明連接需要升級

Upgrade: websocket需要升級到 websocket協(xié)議

Sec-WebSocket-Version: 13 協(xié)議的版本為13

Sec-WebSocket-Key: I6qjdEaqYljv3+9x+GrhqA== 這個(gè)是base64 encode 的值,是瀏覽器隨機(jī)生成的,與服務(wù)器響應(yīng)的 Sec-WebSocket-Accept對應(yīng)

# Request Headers Connection: Upgrade Host: im.91vh.com Origin: http://im.91vh.com Pragma: no-cache Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits Sec-WebSocket-Key: I6qjdEaqYljv3+9x+GrhqA== Sec-WebSocket-Version: 13 Upgrade: websocket

  • 服務(wù)器響應(yīng)升級協(xié)議

服務(wù)端接收到升級協(xié)議的請求,如果服務(wù)端支持升級協(xié)議會做如下響應(yīng)

返回:

Status Code: 101 Switching Protocols 表示支持切換協(xié)議

# Response Headers Connection: upgrade Date: Fri, 09 Aug 2019 07:36:59 GMT Sec-WebSocket-Accept: mB5emvxi2jwTUhDdlRtADuBax9E= Server: nginx/1.12.1 Upgrade: websocket
  • 升級協(xié)議完成以后,客戶端和服務(wù)器就可以相互發(fā)送數(shù)據(jù)

3、如何實(shí)現(xiàn)基于webSocket的長連接系統(tǒng)

3.1 使用go實(shí)現(xiàn)webSocket服務(wù)端

3.1.1 啟動端口監(jiān)聽

  • websocket需要監(jiān)聽端口,所以需要在golang 成功的 main 函數(shù)中用協(xié)程的方式去啟動程序
  • main.go 實(shí)現(xiàn)啟動
go websocket.StartWebSocket()
  • init_acc.go 啟動程序
// 啟動程序 func StartWebSocket() {http.HandleFunc("/acc", wsPage)http.ListenAndServe(":8089", nil) }

3.1.2 升級協(xié)議

  • 客戶端是通過http請求發(fā)送到服務(wù)端,我們需要對http協(xié)議進(jìn)行升級為websocket協(xié)議
  • 對http請求協(xié)議進(jìn)行升級 golang 庫gorilla/websocket 已經(jīng)做得很好了,我們直接使用就可以了
  • 在實(shí)際使用的時(shí)候,建議每個(gè)連接使用兩個(gè)協(xié)程處理客戶端請求數(shù)據(jù)和向客戶端發(fā)送數(shù)據(jù),雖然開啟協(xié)程會占用一些內(nèi)存,但是讀取分離,減少收發(fā)數(shù)據(jù)堵塞的可能
  • init_acc.go
func wsPage(w http.ResponseWriter, req *http.Request) {// 升級協(xié)議conn, err := (&websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {fmt.Println("升級協(xié)議", "ua:", r.Header["User-Agent"], "referer:", r.Header["Referer"])return true}}).Upgrade(w, req, nil)if err != nil {http.NotFound(w, req)return}fmt.Println("webSocket 建立連接:", conn.RemoteAddr().String())currentTime := uint64(time.Now().Unix())client := NewClient(conn.RemoteAddr().String(), conn, currentTime)go client.read()go client.write()// 用戶連接事件clientManager.Register <- client }

3.1.3 客戶端連接的管理

  • 當(dāng)前程序有多少用戶連接,還需要對用戶廣播的需要,這里我們就需要一個(gè)管理者(clientManager),處理這些事件:
  • 記錄全部的連接、登錄用戶的可以通過 appId+uuid 查到用戶連接
  • 使用map存儲,就涉及到多協(xié)程并發(fā)讀寫的問題,所以需要加讀寫鎖
  • 定義四個(gè)channel ,分別處理客戶端建立連接、用戶登錄、斷開連接、全員廣播事件
// 連接管理 type ClientManager struct {Clients map[*Client]bool // 全部的連接ClientsLock sync.RWMutex // 讀寫鎖Users map[string]*Client // 登錄的用戶 // appId+uuidUserLock sync.RWMutex // 讀寫鎖Register chan *Client // 連接連接處理Login chan *login // 用戶登錄處理Unregister chan *Client // 斷開連接處理程序Broadcast chan []byte // 廣播 向全部成員發(fā)送數(shù)據(jù) }// 初始化 func NewClientManager() (clientManager *ClientManager) {clientManager = &ClientManager{Clients: make(map[*Client]bool),Users: make(map[string]*Client),Register: make(chan *Client, 1000),Login: make(chan *login, 1000),Unregister: make(chan *Client, 1000),Broadcast: make(chan []byte, 1000),}return }

3.1.4 注冊客戶端的socket的寫的異步處理程序

  • 防止發(fā)生程序崩潰,所以需要捕獲異常
  • 為了顯示異常崩潰位置這里使用string(debug.Stack())打印調(diào)用堆棧信息
  • 如果寫入數(shù)據(jù)失敗了,可能連接有問題,就關(guān)閉連接
  • client.go
// 向客戶端寫數(shù)據(jù) func (c *Client) write() {defer func() {if r := recover(); r != nil {fmt.Println("write stop", string(debug.Stack()), r)}}()defer func() {clientManager.Unregister <- cc.Socket.Close()fmt.Println("Client發(fā)送數(shù)據(jù) defer", c)}()for {select {case message, ok := <-c.Send:if !ok {// 發(fā)送數(shù)據(jù)錯(cuò)誤 關(guān)閉連接fmt.Println("Client發(fā)送數(shù)據(jù) 關(guān)閉連接", c.Addr, "ok", ok)return}c.Socket.WriteMessage(websocket.TextMessage, message)}} }

3.1.5 注冊客戶端的socket的讀的異步處理程序

  • 循環(huán)讀取客戶端發(fā)送的數(shù)據(jù)并處理
  • 如果讀取數(shù)據(jù)失敗了,關(guān)閉channel
  • client.go
// 讀取客戶端數(shù)據(jù) func (c *Client) read() {defer func() {if r := recover(); r != nil {fmt.Println("write stop", string(debug.Stack()), r)}}()defer func() {fmt.Println("讀取客戶端數(shù)據(jù) 關(guān)閉send", c)close(c.Send)}()for {_, message, err := c.Socket.ReadMessage()if err != nil {fmt.Println("讀取客戶端數(shù)據(jù) 錯(cuò)誤", c.Addr, err)return}// 處理程序fmt.Println("讀取客戶端數(shù)據(jù) 處理:", string(message))ProcessData(c, message)} }

3.1.6 接收客戶端數(shù)據(jù)并處理

  • 約定發(fā)送和接收請求數(shù)據(jù)格式,為了js處理方便,采用了json的數(shù)據(jù)格式發(fā)送和接收數(shù)據(jù)(人類可以閱讀的格式在工作開發(fā)中使用是比較方便的)

  • 登錄發(fā)送數(shù)據(jù)示例:

{"seq":"1565336219141-266129","cmd":"login","data":{"userId":"馬遠(yuǎn)","appId":101}}
  • 登錄響應(yīng)數(shù)據(jù)示例:
{"seq":"1565336219141-266129","cmd":"login","response":{"code":200,"codeMsg":"Success","data":null}}
  • websocket是雙向的數(shù)據(jù)通訊,可以連續(xù)發(fā)送,如果發(fā)送的數(shù)據(jù)需要服務(wù)端回復(fù),就需要一個(gè)seq來確定服務(wù)端的響應(yīng)是回復(fù)哪一次的請求數(shù)據(jù)

  • cmd 是用來確定動作,websocket沒有類似于http的url,所以規(guī)定 cmd 是什么動作

  • 目前的動作有:login/heartbeat 用來發(fā)送登錄請求和連接保活(長時(shí)間沒有數(shù)據(jù)發(fā)送的長連接容易被瀏覽器、移動中間商、nginx、服務(wù)端程序斷開)

  • 為什么需要AppId,UserId是表示用戶的唯一字段,設(shè)計(jì)的時(shí)候?yàn)榱俗龀赏ㄓ眯?#xff0c;設(shè)計(jì)AppId用來表示用戶在哪個(gè)平臺登錄的(web、app、ios等),方便后續(xù)擴(kuò)展

  • request_model.go 約定的請求數(shù)據(jù)格式

/************************ 請求數(shù)據(jù) **************************/ // 通用請求數(shù)據(jù)格式 type Request struct {Seq string `json:"seq"` // 消息的唯一IdCmd string `json:"cmd"` // 請求命令字Data interface{} `json:"data,omitempty"` // 數(shù)據(jù) json }// 登錄請求數(shù)據(jù) type Login struct {ServiceToken string `json:"serviceToken"` // 驗(yàn)證用戶是否登錄AppId uint32 `json:"appId,omitempty"`UserId string `json:"userId,omitempty"` }// 心跳請求數(shù)據(jù) type HeartBeat struct {UserId string `json:"userId,omitempty"` }
  • response_model.go
/************************ 響應(yīng)數(shù)據(jù) **************************/ type Head struct {Seq string `json:"seq"` // 消息的IdCmd string `json:"cmd"` // 消息的cmd 動作Response *Response `json:"response"` // 消息體 }type Response struct {Code uint32 `json:"code"`CodeMsg string `json:"codeMsg"`Data interface{} `json:"data"` // 數(shù)據(jù) json }

3.1.7 使用路由的方式處理客戶端的請求數(shù)據(jù)

  • 使用路由的方式處理由客戶端發(fā)送過來的請求數(shù)據(jù)
  • 以后添加請求類型以后就可以用類是用http相類似的方式(router-controller)去處理
  • acc_routers.go
// Websocket 路由 func WebsocketInit() {websocket.Register("login", websocket.LoginController)websocket.Register("heartbeat", websocket.HeartbeatController) }

3.1.8 防止內(nèi)存溢出和Goroutine不回收

  • 定時(shí)任務(wù)清除超時(shí)連接
    沒有登錄的連接和登錄的連接6分鐘沒有心跳則斷開連接

client_manager.go

// 定時(shí)清理超時(shí)連接 func ClearTimeoutConnections() {currentTime := uint64(time.Now().Unix())for client := range clientManager.Clients {if client.IsHeartbeatTimeout(currentTime) {fmt.Println("心跳時(shí)間超時(shí) 關(guān)閉連接", client.Addr, client.UserId, client.LoginTime, client.HeartbeatTime)client.Socket.Close()}} }
  • 讀寫的Goroutine有一個(gè)失敗,則相互關(guān)閉
    write()Goroutine寫入數(shù)據(jù)失敗,關(guān)閉c.Socket.Close()連接,會關(guān)閉read()Goroutine
    read()Goroutine讀取數(shù)據(jù)失敗,關(guān)閉close(c.Send)連接,會關(guān)閉write()Goroutine
  • 客戶端主動關(guān)閉
    關(guān)閉讀寫的Goroutine
    從ClientManager刪除連接
  • 監(jiān)控用戶連接、Goroutine數(shù)
    十個(gè)內(nèi)存溢出有九個(gè)和Goroutine有關(guān)
    添加一個(gè)http的接口,可以查看系統(tǒng)的狀態(tài),防止Goroutine不回收
    查看系統(tǒng)狀態(tài)
  • Nginx 配置不活躍的連接釋放時(shí)間,防止忘記關(guān)閉的連接
  • 使用 pprof 分析性能、耗時(shí)

3.2 使用javaScript實(shí)現(xiàn)webSocket客戶端

3.2.1 啟動并注冊監(jiān)聽程序

  • js 建立連接,并處理連接成功、收到數(shù)據(jù)、斷開連接的事件處理
ws = new WebSocket("ws://127.0.0.1:8089/acc");ws.onopen = function(evt) {console.log("Connection open ..."); };ws.onmessage = function(evt) {console.log( "Received Message: " + evt.data);data_array = JSON.parse(evt.data);console.log( data_array); };ws.onclose = function(evt) {console.log("Connection closed."); };

3.2.2 發(fā)送數(shù)據(jù)

  • 需要注意:連接建立成功以后才可以發(fā)送數(shù)據(jù)
  • 建立連接以后由客戶端向服務(wù)器發(fā)送數(shù)據(jù)示例
登錄: ws.send('{"seq":"2323","cmd":"login","data":{"userId":"11","appId":101}}');心跳: ws.send('{"seq":"2324","cmd":"heartbeat","data":{}}');ping 查看服務(wù)是否正常: ws.send('{"seq":"2325","cmd":"ping","data":{}}');關(guān)閉連接: ws.close();

4、goWebSocket 項(xiàng)目

4.1 項(xiàng)目說明

  • 本項(xiàng)目是基于webSocket實(shí)現(xiàn)的分布式IM系統(tǒng)

  • 客戶端隨機(jī)分配用戶名,所有人進(jìn)入一個(gè)聊天室,實(shí)現(xiàn)群聊的功能

  • 單臺機(jī)器(24核128G內(nèi)存)支持百萬客戶端連接

  • 支持水平部署,部署的機(jī)器之間可以相互通訊

  • 項(xiàng)目架構(gòu)圖

4.2 項(xiàng)目依賴

  • 本項(xiàng)目只需要使用 redis 和 golang
  • 本項(xiàng)目使用govendor管理依賴,克隆本項(xiàng)目就可以直接使用
# 主要使用到的包 github.com/gin-gonic/gin@v1.4.0 github.com/go-redis/redis github.com/gorilla/websocket github.com/spf13/viper google.golang.org/grpc github.com/golang/protobuf

4.3 項(xiàng)目啟動

  • 克隆項(xiàng)目
git clone git@github.com:link1st/gowebsocket.git # 或 git clone https://github.com/link1st/gowebsocket.git
  • 修改項(xiàng)目配置
cd gowebsocket cd config mv app.yaml.example app.yaml # 修改項(xiàng)目監(jiān)聽端口,redis連接等(默認(rèn)127.0.0.1:3306) vim app.yaml # 返回項(xiàng)目目錄,為以后啟動做準(zhǔn)備 cd ..
  • 配置文件說明
app:logFile: log/gin.log # 日志文件位置httpPort: 8080 # http端口webSocketPort: 8089 # webSocket端口rpcPort: 9001 # 分布式部署程序內(nèi)部通訊端口httpUrl: 127.0.0.1:8080webSocketUrl: 127.0.0.1:8089redis:addr: "localhost:6379"password: ""DB: 0poolSize: 30minIdleConns: 30
  • 啟動項(xiàng)目
go run main.go
  • 進(jìn)入IM聊天地址
    http://127.0.0.1:8080/home/index
  • 到這里,就可以體驗(yàn)到基于webSocket的IM系統(tǒng)

5、webSocket項(xiàng)目Nginx配置

5.1 為什么要配置Nginx

  • 使用nginx實(shí)現(xiàn)內(nèi)外網(wǎng)分離,對外只暴露Nginx的Ip(一般的互聯(lián)網(wǎng)企業(yè)會在nginx之前加一層LVS做負(fù)載均衡),減少入侵的可能
  • 使用Nginx可以利用Nginx的負(fù)載功能,前端再使用的時(shí)候只需要連接固定的域名,通過Nginx將流量分發(fā)了到不同的機(jī)器
  • 同時(shí)我們也可以使用Nginx的不同的負(fù)載策略(輪詢、weight、ip_hash)

5.2 nginx配置

  • 使用域名 im.91vh.com 為示例,參考配置
  • 一級目錄im.91vh.com/acc 是給webSocket使用,是用nginx stream轉(zhuǎn)發(fā)功能(nginx 1.3.31 開始支持,使用Tengine配置也是相同的),轉(zhuǎn)發(fā)到golang 8089 端口處理
  • 其它目錄是給HTTP使用,轉(zhuǎn)發(fā)到golang 8080 端口處理
upstream go-im {server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=10s;keepalive 16; }upstream go-acc {server 127.0.0.1:8089 weight=1 max_fails=2 fail_timeout=10s;keepalive 16; }server {listen 80 ;server_name im.91vh.com;index index.html index.htm ;location /acc {proxy_set_header Host $host;proxy_pass http://go-acc;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;proxy_set_header Connection "";proxy_redirect off;proxy_intercept_errors on;client_max_body_size 10m;}location /{proxy_set_header Host $host;proxy_pass http://go-im;proxy_http_version 1.1;proxy_set_header Connection "";proxy_redirect off;proxy_intercept_errors on;client_max_body_size 30m;}access_log /link/log/nginx/access/im.log;error_log /link/log/nginx/access/im.error.log; }

5.3 問題處理

  • 運(yùn)行nginx測試命令,查看配置文件是否正確
/link/server/tengine/sbin/nginx -t
  • 如果出現(xiàn)錯(cuò)誤
nginx: [emerg] unknown "connection_upgrade" variable configuration file /link/server/tengine/conf/nginx.conf test failed
  • 處理方法
  • nginx.com添加
http{fastcgi_temp_file_write_size 128k; ..... # 需要添加的內(nèi)容#support websocketmap $http_upgrade $connection_upgrade {default upgrade;'' close;}.....gzip on;}
  • 原因:Nginx代理webSocket的時(shí)候就會遇到Nginx的設(shè)計(jì)問題 End-to-end and Hop-by-hop Headers

6、壓測

6.1 Linux內(nèi)核優(yōu)化

  • 設(shè)置文件打開句柄數(shù)
ulimit -n 1000000
  • 設(shè)置sockets連接參數(shù)
vim /etc/sysctl.conf net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 0

6.2 壓測準(zhǔn)備

  • 待壓測,如果大家有壓測的結(jié)果歡迎補(bǔ)充

  • 后續(xù)會出專門的教程,從申請機(jī)器、寫壓測用例、內(nèi)核優(yōu)化、得出壓測數(shù)據(jù)

  • 關(guān)于壓測請移步 go-stress-testing,從申請機(jī)器開始,優(yōu)化內(nèi)核,部署項(xiàng)目壓測,解釋壓測的原理

6.3 壓測數(shù)據(jù)

  • 項(xiàng)目在實(shí)際使用的時(shí)候,每個(gè)連接約占 24Kb內(nèi)存,一個(gè)Goroutine 約占11kb
  • 支持百萬連接需要22G內(nèi)存
在線用戶數(shù)cup內(nèi)存I/Onet.out
1W
10W
100W

7、如何基于webSocket實(shí)現(xiàn)一個(gè)分布式Im

7.1 說明

  • 參考本項(xiàng)目源碼

  • gowebsocket v1.0.0 單機(jī)版Im系統(tǒng)

  • gowebsocket v2.0.0 分布式Im系統(tǒng)

  • 為了方便演示,IM系統(tǒng)和webSocket(acc)系統(tǒng)合并在一個(gè)系統(tǒng)中

  • IM系統(tǒng)接口:
    獲取全部在線的用戶,查詢單前服務(wù)的全部用戶+集群中服務(wù)的全部用戶
    發(fā)送消息,這里采用的是http接口發(fā)送(微信網(wǎng)頁版發(fā)送消息也是http接口),這里考慮主要是兩點(diǎn):
    1.服務(wù)分離,讓acc系統(tǒng)盡量的簡單一點(diǎn),不摻雜其它業(yè)務(wù)邏輯
    2.發(fā)送消息是走h(yuǎn)ttp接口,不使用webSocket連接,才用收和發(fā)送數(shù)據(jù)分離的方式,可以加快收發(fā)數(shù)據(jù)的效率

7.2 架構(gòu)

  • 項(xiàng)目啟動注冊和用戶連接時(shí)序圖

  • 其它系統(tǒng)(IM、任務(wù))向webSocket(acc)系統(tǒng)連接的用戶發(fā)送消息時(shí)序圖

7.3 分布式系統(tǒng)部署

  • 用水平部署兩個(gè)項(xiàng)目(gowebsocket和gowebsocket1)演示分部署
  • 項(xiàng)目之間如何相互通訊:項(xiàng)目啟動以后將項(xiàng)目Ip、rpcPort注冊到redis中,讓其它項(xiàng)目可以發(fā)現(xiàn),需要通訊的時(shí)候使用gRpc進(jìn)行通訊
  • gowebsocket
# app.yaml 配置文件信息 app:logFile: log/gin.loghttpPort: 8080webSocketPort: 8089rpcPort: 9001httpUrl: im.91vh.comwebSocketUrl: im.91vh.com# 在啟動項(xiàng)目 go run main.go
  • gowebsocket1
# 將第一個(gè)項(xiàng)目拷貝一份 cp -rf gowebsocket gowebsocket1 # app.yaml 修改配置文件 app:logFile: log/gin.loghttpPort: 8081webSocketPort: 8090rpcPort: 9002httpUrl: im.91vh.comwebSocketUrl: im.91vh.com# 在啟動第二個(gè)項(xiàng)目 go run main.go
  • Nginx配置

在之前Nginx配置項(xiàng)中添加第二臺機(jī)器的Ip和端口

upstream go-im {server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=10s;server 127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=10s;keepalive 16; }upstream go-acc {server 127.0.0.1:8089 weight=1 max_fails=2 fail_timeout=10s;server 127.0.0.1:8090 weight=1 max_fails=2 fail_timeout=10s;keepalive 16; }
  • 配置完成以后重啟Nginx
  • 重啟以后請求,驗(yàn)證是否符合預(yù)期:

查看請求是否落在兩個(gè)項(xiàng)目上
實(shí)驗(yàn)兩個(gè)用戶分別連接不同的項(xiàng)目(gowebsocket和gowebsocket1)是否也可以相互發(fā)送消息

  • 關(guān)于分布式部署

本項(xiàng)目只是演示了這個(gè)項(xiàng)目如何分布式部署,以及分布式部署以后模塊如何進(jìn)行相互通訊
完全解決系統(tǒng)沒有單點(diǎn)的故障,還需 Nginx集群、redis cluster等

8、回顧和反思

8.1 在其它系統(tǒng)應(yīng)用

  • 本系統(tǒng)設(shè)計(jì)的初衷就是:和客戶端保持一個(gè)長連接、對外部系統(tǒng)兩個(gè)接口(查詢用戶是否在線、給在線的用戶推送消息),實(shí)現(xiàn)業(yè)務(wù)的分離
  • 只有和業(yè)務(wù)分離可,才可以供多個(gè)業(yè)務(wù)使用,而不是每個(gè)業(yè)務(wù)都建立一個(gè)長連接

8.2 已經(jīng)實(shí)現(xiàn)的功能

  • gin log日志(請求日志+debug日志)
  • 讀取配置文件 完成
  • 定時(shí)腳本,清理過期未心跳連接 完成
  • http接口,獲取登錄、連接數(shù)量 完成
  • http接口,發(fā)送push、查詢有多少人在線 完成
  • grpc 程序內(nèi)部通訊,發(fā)送消息 完成
  • appIds 一個(gè)用戶在多個(gè)平臺登錄
  • 界面,把所有在線的人拉倒一個(gè)群里面,發(fā)送消息 完成
  • 單聊、群聊 完成
  • 實(shí)現(xiàn)分布式,水平擴(kuò)張 完成
  • 壓測腳本
  • 文檔整理
  • 文檔目錄、百萬長連接的實(shí)現(xiàn)、為什么要實(shí)現(xiàn)一個(gè)IM、怎么實(shí)現(xiàn)一個(gè)Im
  • 架構(gòu)圖以及擴(kuò)展

IM實(shí)現(xiàn)細(xì)節(jié):

  • 定義文本消息結(jié)構(gòu) 完成
  • html發(fā)送文本消息 完成
  • 接口接收文本消息并發(fā)送給全體 完成
  • html接收到消息 顯示到界面 完成
  • 界面優(yōu)化 需要持續(xù)優(yōu)化
  • 有人加入以后廣播全體 完成
  • 定義加入聊天室的消息結(jié)構(gòu) 完成
  • 引入機(jī)器人 待定

8.2 需要完善、優(yōu)化

  • 登錄,使用微信登錄 獲取昵稱、頭像等
  • 有賬號系統(tǒng)、資料系統(tǒng)
  • 界面優(yōu)化、適配手機(jī)端
  • 消息 文本消息(支持表情)、圖片、語音、視頻消息
  • 微服務(wù)注冊、發(fā)現(xiàn)、熔斷等
  • 添加配置項(xiàng),單臺機(jī)器最大連接數(shù)量

8.3 總結(jié)

  • 雖然實(shí)現(xiàn)了一個(gè)分布式在聊天的IM,但是有很多細(xì)節(jié)沒有處理(登錄沒有鑒權(quán)、界面還待優(yōu)化等),但是可以通過這個(gè)示例可以了解到:通過WebSocket解決很多業(yè)務(wù)上需求
  • 本文雖然號稱單臺機(jī)器能有百萬長連接(內(nèi)存上能滿足),但是實(shí)際在場景遠(yuǎn)比這個(gè)復(fù)雜(cpu有些壓力),當(dāng)然了如果你有這么大的業(yè)務(wù)量可以購買更多的機(jī)器更好的去支撐你的業(yè)務(wù),本程序只是演示如何在實(shí)際工作用使用webSocket.
  • 參考本文,你可以實(shí)現(xiàn)出來符合你需要的程序

9、參考文獻(xiàn)

維基百科 WebSocket

阮一峰 WebSocket教程

WebSocket協(xié)議:5分鐘從入門到精通

go-stress-testing 單臺機(jī)器100w連接壓測實(shí)戰(zhàn)

github 搜:link1st 查看項(xiàng)目 gowebsocket

https://github.com/link1st/gowebsocket

總結(jié)

以上是生活随笔為你收集整理的基于websocket单台机器支持百万连接分布式聊天(IM)系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

天天操夜夜曰 | 国产成人在线看 | 美女网站视频色 | 国产精品一区二区精品视频免费看 | 国产一区二区免费 | 中文字幕xxxx | 久久人操 | 99re在线视频观看 | 婷婷激情综合五月天 | 欧美日韩伦理一区 | 一区二区三区在线观看免费视频 | 亚洲精品一区二区三区四区高清 | 91av电影网| 免费观看全黄做爰大片国产 | 亚洲一级二级 | 国产色在线,com | 日韩在线精品一区 | 国产精品美女免费视频 | 高清不卡一区二区在线 | 成人亚洲综合 | 国产精品h在线观看 | 久久久www成人免费精品张筱雨 | 国产精品久久精品国产 | 亚洲爽爽网 | 亚洲,播放| 国产一级免费播放 | 五月天久久久久久 | 亚洲成人资源网 | 欧美日韩亚洲一 | 麻豆果冻剧传媒在线播放 | 视频在线播放国产 | 久草视频在线播放 | 婷婷激情影院 | 国产在线精品播放 | 永久黄网站色视频免费观看w | 黄色软件网站在线观看 | 96av在线视频 | 日本公妇在线观看高清 | 日韩av免费大片 | 日日夜夜精品免费 | 国内精品在线看 | 久久精品成人欧美大片古装 | 国产91精品久久久久久 | 91麻豆操| 精品国产一区二区三区久久 | 在线免费观看黄色大片 | 午夜精品久久久久久久久久久 | 九九在线高清精品视频 | 三级大片网站 | 久久国产精品影片 | 精品福利在线视频 | 亚洲视频 在线观看 | 国产群p视频 | 日本成人中文字幕在线观看 | 精品一区久久 | 一区二区精品在线 | 精品一区二区在线看 | 天天干天天操av | 日韩免费视频线观看 | 亚洲电影第一页av | 午夜精品一区二区国产 | 制服丝袜在线91 | 黄网站色欧美视频 | 91女神的呻吟细腰翘臀美女 | 久久成人麻豆午夜电影 | 久久综合日 | 日日夜夜综合 | 久久婷婷五月综合色丁香 | 在线观看视频97 | 久久综合久色欧美综合狠狠 | 一区二区精品在线观看 | 国产精品黄色 | 欧美巨大 | 99免在线观看免费视频高清 | www在线免费观看 | 免费看黄色小说的网站 | 日韩精品中文字幕久久臀 | 在线国产一区二区三区 | 久久精品电影网 | 成 人 黄 色视频免费播放 | 最近最新中文字幕视频 | 在线三级中文 | 丁香午夜 | 91精品网站在线观看 | 国产精选在线观看 | 婷婷六月激情 | 在线日韩一区 | 精品国产一区二区三区四区vr | 午夜精品电影一区二区在线 | 91看片在线| 国产一区视频免费在线观看 | 最近中文字幕免费观看 | 亚洲另类视频 | 久久久久亚洲国产精品 | 三三级黄色片之日韩 | 99在线视频免费观看 | 久久电影中文字幕视频 | 欧美在线观看视频免费 | 精品国产a| 久久精品99 | 日日摸日日碰 | av在线免费观看网站 | av电影在线观看完整版一区二区 | 国产精品国产三级在线专区 | 成人免费视频在线观看 | 久久久久久久久久久久久久电影 | 久久国产精品小视频 | 成人国产精品久久久久久亚洲 | 丝袜精品视频 | 色诱亚洲精品久久久久久 | 九九精品视频在线 | 久久久久成人精品免费播放动漫 | 九九热精品视频在线观看 | 黄色大片视频网站 | 狠狠色丁香婷婷 | 99热这里| 最新日本中文字幕 | 久久婷婷一区二区三区 | 亚洲闷骚少妇在线观看网站 | 国产精品国产精品 | 亚洲国产精品成人精品 | 欧美三级在线播放 | 91精品免费 | 在线v| 国产福利不卡视频 | 国产精品亚洲综合久久 | 91电影福利 | 国产美腿白丝袜足在线av | 激情五月婷婷综合 | 五月婷婷在线视频观看 | 99国产免费网址 | av电影免费在线看 | 亚洲综合视频在线 | 国产精品久久久免费看 | 色婷婷狠狠18 | 手机在线永久免费观看av片 | 在线视频免费观看 | 五月天激情在线 | 欧美成人一区二区 | 日韩在线观看免费 | 国产高清视频免费最新在线 | 国产在线国偷精品产拍免费yy | 国产精品久久久久四虎 | 91成人天堂久久成人 | 免费视频你懂的 | 国内精品免费久久影院 | 欧美少妇的秘密 | 国产精品黑丝在线观看 | 最新亚洲视频 | 娇妻呻吟一区二区三区 | 国产91亚洲精品 | 91九色免费视频 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 99久热| 国产成人在线精品 | 97超碰资源网 | 日本黄色大片免费 | 99精品在线免费观看 | 亚洲欧美日韩精品一区二区 | 18pao国产成视频永久免费 | 91成人免费视频 | 国产中文字幕在线视频 | 日韩在线电影观看 | 国产资源在线视频 | av一区在线播放 | 久久av黄色 | 人人爽人人舔 | 精品视频网站 | 99久久精品电影 | 91精品免费在线视频 | 九九在线免费视频 | 日韩一级理论片 | 国产视频美女 | 日韩激情网 | 欧美日韩视频在线一区 | 不卡电影一区二区三区 | 亚洲在线视频播放 | 国产免费一区二区三区网站免费 | 日韩免费高清在线观看 | 一区二区激情视频 | 99在线观看| 99视频在线精品免费观看2 | 天天综合色网 | 国产成人资源 | 夜夜爽88888免费视频4848 | 91超级碰| 久久视频免费在线 | 精品久久久久久亚洲综合网站 | 日韩一区二区三区高清免费看看 | 一区二区 久久 | 欧美国产日韩一区二区三区 | 手机看片福利 | 国产小视频你懂的在线 | 日韩a在线看 | 久久理论片 | 五月婷社区 | 夜夜夜影院 | 九九热视频在线免费观看 | 97香蕉超级碰碰久久免费软件 | 500部大龄熟乱视频 欧美日本三级 | 国产精品久久久久久久久久直播 | 96精品视频 | 麻豆视频免费在线 | 综合国产在线观看 | japanesexxxhd奶水| 日韩欧美视频免费看 | 一本一道久久a久久精品蜜桃 | 成人久久 | 日韩三级一区 | 日本不卡一区二区三区在线观看 | 欧美二区视频 | 亚洲一级片av | 久久久国产精品视频 | 91国内产香蕉 | 国内视频在线 | 狠狠操狠狠干天天操 | 亚洲成人免费 | 午夜精品一区二区三区在线 | 欧美日韩视频网站 | 中文av一区二区 | 最近中文字幕高清字幕免费mv | 探花视频在线版播放免费观看 | 久草在线这里只有精品 | 91亚洲欧美激情 | 国产精品欧美在线 | 中文字幕在线日亚洲9 | 色综合久久综合中文综合网 | 在线看v片 | 亚洲最新精品 | a视频在线播放 | .精品久久久麻豆国产精品 亚洲va欧美 | 国产一级片直播 | 日韩欧美在线播放 | 亚洲免费资源 | 狠色狠色综合久久 | 在线视频欧美亚洲 | 久久电影中文字幕视频 | 精品国产黄色片 | 日韩在线二区 | 天天干,天天操,天天射 | 国产理论一区二区三区 | 美女黄视频免费看 | 在线看岛国av | 日韩精品亚洲专区在线观看 | 中文资源在线播放 | 在线成人高清电影 | av福利第一导航 | 久久99久久99精品免费看小说 | 色伊人网| 国产黄色美女 | 欧美精品久久久久性色 | 国产剧情av在线播放 | 免费看污黄网站 | 99在线国产 | 亚洲人成人在线 | 国产一级片直播 | 久草精品视频在线观看 | 日韩精品中文字幕av | 久热电影 | av大全免费在线观看 | 欧美成年网站 | 91av官网 | 欧美专区亚洲专区 | 精品一区91 | 综合久久久久久久久 | 狠狠操狠狠操 | av天天澡天天爽天天av | 日韩在线电影一区 | 久久免费看 | 日韩av偷拍 | 国产精品视频免费 | 欧美aa一级 | 91精品国产三级a在线观看 | 亚洲一区美女视频在线观看免费 | 欧美福利久久 | 啪啪资源 | av高清在线 | 区一区二在线 | 亚洲视频h | 国产成人精品一区在线 | 免费的国产精品 | 国产女人40精品一区毛片视频 | 一区免费视频 | 国产精品入口a级 | av丝袜在线 | 国产视频91在线 | 亚洲一二视频 | 国产xxxx做受性欧美88 | 中文字幕在线成人 | 91在线观| 久久99久久99精品免观看软件 | 国产精品久久久久9999 | 国内精品久久天天躁人人爽 | 国产伦精品一区二区三区照片91 | 91精品国产三级a在线观看 | 五月开心婷婷网 | 国产精品午夜久久 | 亚洲精品国产综合99久久夜夜嗨 | 九九久久久 | 亚洲黄色在线 | 91av福利视频 | 天堂av观看| 91传媒在线 | 99久久日韩精品视频免费在线观看 | 狠狠躁日日躁狂躁夜夜躁av | 亚洲第一色 | 久久综合五月婷婷 | 色综合久久网 | 亚洲成av人片在线观看www | 国产一级大片在线观看 | 国产精品久久久久久久久久久不卡 | 久久免费视频8 | 五月天精品视频 | 日韩视频1| 日韩女同一区二区三区在线观看 | 激情久久久 | 国产精品亚洲a | 黄色录像av| 国精产品999国精产品视频 | 丁香花在线观看免费完整版视频 | 一区二区三区在线观看免费 | 91成人精品国产刺激国语对白 | 手机av资源| 国产理论免费 | 精品国产一区二 | 国精产品一二三线999 | 国产精品毛片久久久久久久久久99999999 | 最近在线中文字幕 | 久热久草在线 | 久久久久网址 | 国产精品免费久久久久久 | 天堂网中文在线 | 欧美极品少妇xbxb性爽爽视频 | 一级一级一片免费 | 久久久精品高清 | 精品一区 在线 | 国产激情电影综合在线看 | 日韩综合色 | 国产精品麻豆欧美日韩ww | 久久国产精品区 | 天天爱天天插 | 日韩精品不卡在线 | 久久与婷婷 | 国产精品视频资源 | 亚洲精品在线观看视频 | 在线观看黄色大片 | 亚洲天堂在线观看完整版 | 欧美日韩色婷婷 | 日韩在线精品 | 特级毛片在线免费观看 | 成人在线播放av | 久久国产美女 | 亚洲干 | 色欧美视频 | 中文在线亚洲 | 婷婷色中文字幕 | 国产一级在线观看 | 在线视频观看成人 | 在线激情av电影 | 黄色三级久久 | 在线免费观看欧美日韩 | 丁香婷婷深情五月亚洲 | 日韩在线观看免费 | 99精品视频中文字幕 | 成年人在线视频观看 | 国产一区二区三区免费在线 | 婷婷丁香在线 | 日韩在线观看视频中文字幕 | 成人精品视频久久久久 | 日韩精品免费一区二区 | 热re99久久精品国产99热 | a级国产毛片 | 亚洲综合五月天 | 亚洲精品高清在线观看 | 九九亚洲视频 | 婷五月天激情 | 九九久久影院 | 四虎伊人| 99精品久久久久久久 | 欧美精品久久久久 | 天天拍夜夜拍 | 久草综合在线观看 | 91精品视频在线免费观看 | 精品一区二区久久久久久久网站 | av中文字幕第一页 | 天天草天天爽 | 欧美日韩精品二区第二页 | 国产成视频在线观看 | 日韩高清在线看 | 91av色 | 国产精品欧美一区二区 | 久久精品亚洲一区二区三区观看模式 | 九九热免费视频在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲一区视频在线播放 | 激情欧美在线观看 | 日韩激情视频在线 | 精品国产伦一区二区三区观看方式 | 99热国产在线中文 | 在线国产福利 | 18做爰免费视频网站 | 久久美女精品 | 午夜影院一级 | 亚洲春色综合另类校园电影 | 国产福利精品一区二区 | 国产日产精品一区二区三区四区 | 亚洲精品麻豆 | 99在线高清视频在线播放 | 国产精品成人免费精品自在线观看 | 超碰99在线 | 粉嫩av一区二区三区四区在线观看 | 91系列在线观看 | 中文字幕日韩在线播放 | 国产精品久久久久久久久久久久久 | 中文字幕成人在线观看 | 成人av网站在线 | 在线免费高清 | 精品欧美一区二区在线观看 | 一级片视频在线 | av在线永久免费观看 | 国产人成一区二区三区影院 | 天天色中文 | 人人模人人爽 | 在线观看视频你懂 | 激情综合久久 | 日韩字幕 | 99久久超碰中文字幕伊人 | 香蕉色综合| www天天干| 九九久久视频 | www.久热 | 久国产在线播放 | 狠狠干美女 | 免费成人黄色av | 国内精品久久久久久久影视麻豆 | 日本三级人妇 | 国产一性一爱一乱一交 | 欧美成人播放 | 成人av电影免费在线观看 | 69国产精品视频免费观看 | 国产精品 999 | 国产大陆亚洲精品国产 | 成人永久在线 | 国产成人精品一区二区三区在线 | 免费a级观看 | 国产精品久久久久9999吃药 | 午夜影视剧场 | 欧美日韩在线电影 | 97**国产露脸精品国产 | 国产精品密入口果冻 | 中文字幕在线观看资源 | 久久成年人视频 | 中文字幕在线观看免费高清完整版 | 日韩理论在线播放 | 国产成人久久精品一区二区三区 | 久久女同性恋中文字幕 | 91人人爽人人爽人人精88v | 黄色网址国产 | 天天操夜夜干 | 国内精品久久久久影院优 | 久久免费成人精品视频 | 91视频免费国产 | 天天综合网~永久入口 | 激情综合网在线观看 | 亚洲午夜久久久久久久久 | 丁香婷婷深情五月亚洲 | 在线 国产一区 | 人人爱人人做人人爽 | 丁香婷婷网 | 免费人成网ww44kk44 | 超碰在线97观看 | 国产在线更新 | 日韩色一区二区三区 | 久久久免费视频播放 | 成人av中文字幕 | 美女黄久久 | 国产一级视频在线观看 | 免费黄色在线播放 | 欧美日韩一区二区三区在线免费观看 | 91传媒在线看 | 天堂av在线 | 久久视频网 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 人人人爽 | 国产黄在线 | 三级性生活视频 | 日韩av午夜在线观看 | 成年人视频免费在线播放 | 五月激情天 | 久久av免费 | 国产中文字幕久久 | 天天操比 | 亚洲精品视频网站在线观看 | 亚洲天堂精品视频在线观看 | 中文字幕免费 | 欧美在线a视频 | 久久久国产精品电影 | 91热爆视频 | 三级黄色免费片 | 日韩在线 | 国产中文字幕视频在线 | 日本精品中文字幕在线观看 | 国产亚洲精品久久19p | 在线之家官网 | 国产精品久久久 | 日本公妇在线观看 | 91精品国产综合久久久久久久 | 美女网站一区 | 成人午夜影院在线观看 | 久草网站在线观看 | 国产三级在线播放 | 久久精彩视频 | 亚洲国产无 | 婷婷.com| 麻豆视频在线免费观看 | 国产成人精品不卡 | www.成人久久 | 激情婷婷丁香 | 一区二区三区在线电影 | 久久久69| 激情综合网色播五月 | 91在线观看欧美日韩 | 一区二区不卡高清 | 成人午夜黄色影院 | 在线视频久久 | 在线播放你懂 | 久久这里有精品 | 色九九影院 | 亚洲综合在线一区二区三区 | 国产亚洲精品久久久久久移动网络 | 丁香六月久久综合狠狠色 | 特黄特色特刺激视频免费播放 | 亚洲国产视频直播 | 丰满少妇高潮在线观看 | 成人在线观看av | 波多野结衣在线观看一区二区三区 | 国产一性一爱一乱一交 | 精品欧美一区二区精品久久 | 中文字幕 国产专区 | 激情综合色综合久久 | 亚洲人成人99网站 | 97色资源 | 中文字幕免费一区二区 | 日韩在线视频网 | 综合国产在线观看 | 91人人爽久久涩噜噜噜 | 狠狠色丁香婷综合久久 | 免费视频 你懂的 | 一区二区三区四区精品 | 欧美污污网站 | 精品一区在线 | 日韩在线观看高清 | 国内视频1区 | 久久久亚洲精品 | 96久久欧美麻豆网站 | a v在线观看 | 永久免费毛片在线观看 | 天天视频亚洲 | 亚洲成人频道 | 中文在线字幕观看电影 | 亚洲国产电影在线观看 | 色成人亚洲 | 成人黄色小说在线观看 | 婷五月激情 | 97精品超碰一区二区三区 | 美女久久99 | 日韩欧美视频免费在线观看 | 国产精品对白一区二区三区 | 亚洲欧洲中文日韩久久av乱码 | 日本精品视频免费 | 精品一二三区视频 | 国产一级片免费播放 | 久久免费av | 中文在线天堂资源 | 久久精品一二三区白丝高潮 | 福利一区二区 | 超碰人人在线 | 在线观看精品黄av片免费 | 在线观看91久久久久久 | 97在线精品国自产拍中文 | 激情六月婷婷久久 | 三上悠亚一区二区在线观看 | 亚洲精选视频免费看 | 免费看片黄色 | 日本久久成人中文字幕电影 | 日韩高清免费电影 | 久久国产精品免费一区二区三区 | 成 人 免费 黄 色 视频 | 97人人看| a v在线视频 | 国产一区二区成人 | 天堂va在线高清一区 | 国产尤物在线 | 2019久久精品| 成人啪啪18免费游戏链接 | 久久久精品小视频 | 免费在线电影网址大全 | 中文字幕色在线 | 亚洲国产美女久久久久 | av在线h| 免费男女羞羞的视频网站中文字幕 | 中文字幕无吗 | 婷婷色资源 | 国精产品999国精产品视频 | 亚洲成av人片在线观看无 | 91在线精品一区二区 | 国产精品一区二区久久国产 | 在线观看第一页 | 欧美一区二区三区在线看 | 中文字幕国产亚洲 | 午夜美女福利直播 | 亚洲精品国产精品国自产在线 | 久久一区精品 | 91高清一区 | 国产成人高清 | 午夜视频在线观看一区二区三区 | 中文字幕亚洲欧美 | 亚洲精品午夜视频 | 天天综合网在线 | 欧美午夜精品久久久久久浪潮 | 日韩精品1区2区 | 蜜臀av网址| 国产精品入口久久 | 成 人 黄 色 免费播放 | 黄色毛片视频免费 | 在线视频黄 | 激情视频在线高清看 | 精品久久久久久亚洲综合网 | 奇米影视四色8888 | 婷婷成人综合 | av爱干| 精品91在线 | 国产精品11| 日本中文字幕在线观看 | 天天插狠狠干 | 97香蕉超级碰碰久久免费软件 | 午夜精品久久久 | 国产97视频| 91麻豆精品国产91久久久无限制版 | 欧美一级日韩免费不卡 | 99免费| 99超碰在线播放 | 在线观看麻豆av | 免费精品久久久 | 日韩免费在线看 | 夜夜躁狠狠躁日日躁视频黑人 | 免费观看国产成人 | 西西444www高清大胆 | 久久私人影院 | 亚洲国产中文字幕在线观看 | 又黄又爽又湿又无遮挡的在线视频 | 国产精品麻豆三级一区视频 | 好看的国产精品视频 | 日韩手机在线 | 日韩在线观看视频网站 | 91成人精品观看 | 天天艹天天操 | 久久综合九色综合欧美狠狠 | 色综合久久99 | 久久天天操 | 亚洲欧美综合精品久久成人 | 国产在线91在线电影 | 伊人影院得得 | 国产淫片 | 91黄站| 欧美日韩久久一区 | 爱av在线网 | 午夜av一区 | 国产日韩视频在线播放 | 丰满少妇在线 | 亚洲精品高清视频在线观看 | 最新午夜电影 | 97人人网 | 亚洲天堂香蕉 | 99国产精品免费网站 | 伊人久久影视 | 久久草草影视免费网 | 狠狠色婷婷丁香六月 | 五月在线| 五月婷婷深开心 | 天堂网一区二区三区 | 91丨九色丨高潮 | 国产99精品在线观看 | 国产精品久久久久久久久费观看 | 亚洲成人国产 | 婷婷中文字幕在线观看 | 日韩精品最新在线观看 | 最近的中文字幕大全免费版 | 福利一区二区在线 | 天天做天天爱夜夜爽 | 免费av高清 | 国产一级淫片免费看 | 日韩一区二区三区免费视频 | 亚洲午夜精品久久久久久久久 | 国产丝袜一区二区三区 | 激情五月激情综合网 | 91在线小视频 | 天天在线免费视频 | 国产五十路毛片 | 久久精品中文字幕一区二区三区 | 亚洲精品乱码白浆高清久久久久久 | 国产色综合天天综合网 | 亚洲免费av片 | 国产精品中文字幕在线 | 日本久久高清视频 | av看片在线 | 国产亚洲小视频 | 久久免费一 | 一级黄网 | 亚洲国产精品99久久久久久久久 | 日本精品视频在线播放 | av在线短片| 1区2区3区在线观看 三级动图 | 97人人超 | 少妇av网| 久久与婷婷 | 久久久久久久久久久久久久av | 亚洲欧美日韩国产精品一区午夜 | 在线观看的av网站 | av黄色影院| 免费视频二区 | 久久久久欧美精品 | 五月婷婷色 | 成年人免费看片网站 | 韩国一区二区三区视频 | 国产日韩一区在线 | 日韩电影在线观看一区二区 | 久久不卡日韩美女 | 一区二区三区在线看 | 欧美一区,二区 | 久久亚洲精品国产亚洲老地址 | 欧美五月婷婷 | 久久99久久99精品 | 久久久久成人精品亚洲国产 | 欧美日韩亚洲国产一区 | 最近高清中文在线字幕在线观看 | 女人18精品一区二区三区 | 精品久久一 | 69国产精品视频免费观看 | 国产人成一区二区三区影院 | 国产精品美女视频 | 久久精品一区二区国产 | 91av欧美| 夜夜躁天天躁很躁波 | 中文字幕在线观看网站 | 91视频免费播放 | 日韩手机在线 | 中文字幕一区二区在线观看 | 欧洲精品亚洲精品 | 国产精品久久久久免费观看 | 国产女人18毛片水真多18精品 | 波多野结衣综合网 | 国产另类xxxxhd高清 | 中文字幕大全 | 日韩激情网 | 亚洲欧洲日韩 | 国产视频97 | 最近中文字幕高清字幕免费mv | 狠狠狠色丁香婷婷综合久久88 | 午夜av色 | 97视频在线免费观看 | a电影免费看 | 亚洲高清资源 | 欧美日韩在线电影 | 国产又粗又硬又爽视频 | 久久99久久99精品免费看小说 | 国产精品入口久久 | www.com黄色| 五月婷婷激情综合 | 伊人黄 | 片网站| 亚洲综合激情 | 日韩高清一区在线 | 久久久久免费网 | 成人午夜影视 | 青春草免费视频 | 欧美精品国产精品 | 中文一区在线观看 | 婷婷亚洲最大 | 探花视频在线观看免费 | 91亚色免费视频 | a色视频| 国内精品久久久久久久97牛牛 | 亚洲欧美视频一区二区三区 | 亚洲男男gaygay无套 | 午夜在线日韩 | 国产午夜av | 97成人精品视频在线播放 | 婷婷国产在线 | 国产涩涩网站 | 亚洲美女免费精品视频在线观看 | 成年人视频在线免费播放 | 欧美a级免费视频 | 青青网视频 | av理论电影 | 四虎国产免费 | 亚洲国产成人久久综合 | 亚洲精品mv在线观看 | 日本精品中文字幕 | 黄色成人av在线 | 日日色综合 | 成人播放器 | 午夜久久成人 | 成人久久精品 | 在线国产一区 | 欧美ⅹxxxxxx | 国产精品99久久久久久小说 | 很黄很污的视频网站 | 97超碰人人网 | 九九综合九九 | 九九涩涩av台湾日本热热 | 二区三区av | 国产成人在线观看免费 | 五月激情久久 | 日韩乱码在线 | 在线观看网站你懂的 | 黄色av一级 | 毛片网在线观看 | 91成品人影院 | 婷婷在线免费视频 | av一区二区在线观看中文字幕 | 中文字幕精品久久 | 亚洲精品国内 | 国产成a人亚洲精v品在线观看 | 国产一区久久久 | 九九九九热精品免费视频点播观看 | 久久天堂精品视频 | 色婷婷精品大在线视频 | 日韩高清一区 | 日韩电影在线观看一区二区 | 亚洲电影久久 | 久草影视在线观看 | 欧美一区二视频在线免费观看 | 日本精品xxxx | 又大又硬又黄又爽视频在线观看 | 开心色激情网 | 中文有码在线 | 国内精品视频一区二区三区八戒 | 亚洲va韩国va欧美va精四季 | 免费三级a | 在线黄色免费av | 999久久久久久 | 二区三区毛片 | 色婷婷激情电影 | www最近高清中文国语在线观看 | 天天干天天搞天天射 | 97人人艹 | 精品国产乱码久久久久久三级人 | 黄色动态图xx | 天天色天天射综合网 | 色婷婷亚洲 | 色94色欧美 | 久久精品国产久精国产 | www免费在线观看 | 91成人小视频 | 久久夜夜夜| 亚洲精品高清在线 | 99在线高清视频在线播放 | 国产成人精品午夜在线播放 | 日本中文字幕在线视频 | 欧美在线观看视频一区二区三区 | 国产原创av在线 | 国产精品久久久久一区二区三区 | 亚洲欧美国产精品va在线观看 | 日本久久成人中文字幕电影 | 久久婷婷国产 | h视频在线看 | www.狠狠插.com | 久久免费看a级毛毛片 | 亚洲理论片 | 97超碰国产精品 | 亚洲美女免费精品视频在线观看 | 91原创在线观看 | 中文字幕色在线 | www.天天色.com | 日韩久久久久久 | 欧美一级性生活视频 | 热久久在线视频 | 五月情婷婷 | 狠狠干婷婷色 | 在线播放日韩 | 欧美激情综合色 | 豆豆色资源网xfplay | 超碰公开97| 色欧美日韩 | 久草综合视频 | 午夜国产成人 | 狠狠色香婷婷久久亚洲精品 | 国产精品美乳一区二区免费 | 国产中文字幕亚洲 | 国产一卡二卡四卡国 | 97超碰在线资源 | 黄色动态图xx | 亚洲另类xxxx | 国产在线免费观看 | 国产成人高清在线 | 午夜电影一区 | 97超碰人人网 | 麻豆一精品传二传媒短视频 | 日韩欧美在线国产 | 欧美另类巨大 | 亚洲免费成人 | 国产一级片免费视频 | av一区二区三区在线播放 | 九九九九精品九九九九 | 青青久草在线视频 | 亚洲网站在线 | 日韩一级成人av | 国内精品久久久久影院优 | 亚洲人成人在线 | 久久精品视频观看 | 国产成人免费观看 | 麻豆一精品传二传媒短视频 | 久久视频精品在线 | 91在线观| 国产精品三级视频 | 精品久久久久久久久久久久久久久久 | 免费日韩一区二区三区 | 国产精品视频资源 | 欧美成人91 | 国产亚洲成人网 | 国产精品99在线播放 | 不卡电影一区二区三区 | 成人av教育 | 91免费在线看片 | 亚洲欧美视频在线播放 | 亚洲精品在线观看不卡 | 亚洲免费在线视频 | av品善网 | 成人黄视频 | 国产不卡网站 | 正在播放日韩 | 国产中文字幕免费 | 在线电影 你懂得 | av电影不卡在线 | 不卡的av在线 | 久久久久99精品成人片三人毛片 | 国产精品18久久久久vr手机版特色 | 亚洲激情校园春色 | 久草视频免费在线播放 | 91视频高清 | 99精品国自产在线 | 久草在线中文视频 | 在线观看www视频 | 91天天视频| 亚洲一级免费电影 | 在线看国产一区 | av免费电影网站 | 中文字幕av影院 | 日本精品va在线观看 | 在线播放精品一区二区三区 | 97视频免费在线看 | 久久国语| 国产成人av电影在线 | 日韩在线观看中文 | 超碰在线资源 | 国产男女免费完整视频 | 中文字幕精品一区久久久久 | www一起操 | 色先锋av资源中文字幕 | 亚洲专区欧美专区 | 91精品系列 | 在线观看深夜福利 | 久久久国产影院 | 日本aa在线 | 激情综合国产 | 国产裸体永久免费视频网站 | 日韩在线免费高清视频 | 黄色av一区二区三区 | www黄色| 97在线观看免费高清 | 国产精品视频内 | 99精品色| 亚洲更新最快 | 亚洲成人黄色在线观看 | 日韩视频 一区 | 日韩高清在线一区二区三区 | 51精品国自产在线 | 久久久久欧美精品999 | 不卡的av在线播放 | 五月婷婷av在线 | 欧美精品久久人人躁人人爽 | 日韩在线电影一区 | 久久黄色免费视频 | 免费在线观看av网站 | 91成人在线视频 | 亚洲日本一区二区在线 | 99久热在线精品视频观看 | 色天堂在线视频 | 亚洲一区二区三区四区在线视频 | 超碰精品在线观看 | 91免费国产在线观看 | 成人av网站在线 | 精品国产免费看 | 99久久精品费精品 | 免费在线观看视频一区 | 日日干激情五月 | 日韩一区二区三区高清在线观看 |