---慢更-基於 go 的 IM 聊天

sugarsugar發表於2019-12-03

歡迎使用社群 Markdown 編輯器寫文章!

一. 背景

大佬們如有什麼寫的不對的歡迎大家在下面留言指出,持續更新中。

最近公司在從 PHP 轉到 Golang ,所以這個專案屬於練手專案很多東西也是在摸著石頭過河,持續更新中....

二 .庫的選擇

既然是IM 系統必定會涉及到用TCP 來維持長連線,再這裡我們選擇了github.com/gorilla/websocket

作為我們的webcocket 庫。在web服務的選擇上我們選擇了github.com/gin-gonic/gin 作為我們的web服務。

json 庫的選擇我們沒有選擇官方的庫,而是選擇了第三方的json 庫(josn是什麼不做解釋)

傳統的做法就是用非官方的json 庫 ,需要我們先提前定義struct 或者用一個map[string]interface。

我個人不喜歡定義結構體所以我們用了一個第三方庫https://github.com/tidwall/gjson

在接下來的更新裡面我會詳細介紹這些庫的使用方法

三 .專案目錄結構

---慢更-基於go 的IM 聊天

API :基於gin 的web服務
socket : websocket 服務

---慢更-基於go 的IM 聊天

config :配置檔案

controller:控制器

database:資料庫操作

helps :幫助方法

middleware : 中介軟體

models:資料庫的結構體 定義

router : 路由地址

四:資料庫建立

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `account` varchar(50) DEFAULT NULL COMMENT '賬號z',
  `niack_name` varchar(50) DEFAULT NULL COMMENT '使用者名稱',
  `user_avatar` varchar(255) DEFAULT NULL COMMENT '頭像',
  `password` varchar(100) DEFAULT NULL COMMENT '密碼',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4;

CREATE TABLE `groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `group_name` varchar(50) DEFAULT NULL COMMENT '群名稱',
  `user_id` int(11) DEFAULT NULL COMMENT '群主ID',
  `grop_avatar` varchar(255) DEFAULT NULL COMMENT '頭像',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

CREATE TABLE `history_message` (
  `id` int(11) NOT NULL,
  `from_id` int(11) NOT NULL COMMENT '傳送者id',
  `from_name` varchar(255) DEFAULT NULL COMMENT '傳送者名稱',
  `from_avatar` varchar(255) DEFAULT NULL COMMENT '傳送者頭像',
  `to_id` int(11) NOT NULL COMMENT '接收者ID',
  `msg_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:私聊 2:群聊',
  `msg` json DEFAULT NULL COMMENT '訊息內容',
  `send_time` datetime DEFAULT NULL COMMENT '傳送時間',
  `send_status` tinyint(1) DEFAULT NULL COMMENT '1:傳送完成 2:失敗',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `message` varchar(255) DEFAULT NULL COMMENT '申請訊息',
  `from_id` int(11) DEFAULT NULL COMMENT '申請人',
  `to_id` varchar(255) DEFAULT NULL COMMENT '被申請的id',
  `type` int(1) DEFAULT '0' COMMENT '1:好友 2:群組',
  `status` int(1) DEFAULT '0' COMMENT '1:同意 2:拒絕',
  `created_at` datetime DEFAULT NULL,
  `update_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

四 :搭建web服務

1:下載 gin

   go get github.com/gin-gonic/gin    

2:下載 安裝mysql驅動

 go get github.com/go-sql-driver/mysql
 package router

import (
    `time`
    `MyModel/blog/helps`
    "github.com/gin-gonic/gin"
)

func ApiRouter() {

    // 初始化路由
    router := gin.Default()
    // miss路由
    router.Any("/", func(context *gin.Context) {
        ApiJson :=helps.Api{
            Message:    "請求成功",
            Data:       make([]int, 0, 0),
            Time:       time.Now(),
            StatusCode: 200,
        }
        context.AbortWithStatusJSON(200, ApiJson)
    })

    _ = router.RunTLS(":8888","default.pem","default.key") // 在 0.0.0.0:8080 上監聽並服務

}

然後我們新建一個main.go 檔案

    package main

    import (
        `MyModel/blog/router`
    )

    func main()  {

        router.ApiRouter()

    }

在cli 介面輸入 go run main.go 就會開到以下介面

---慢更-基於 go 的 IM 聊天

然後再網頁上輸入 https://127.0.0.1:8080/ 這樣我們的web 服務的第一步就已經搭建成功。

---慢更-基於 go 的 IM 聊天

五 : websocket服務

相關文章