《從0到1搭建一個IM專案》專案初始化

ice_moss發表於2022-12-28

[toc]

概況(HiChat)

介紹

在學習完go的基礎後,我們現在從0到1來搭建一個簡單的即時聊天專案(IM)的api。

主要功能

  • 登入、註冊、使用者資訊更新、賬號登出

  • 單聊、群聊

  • 傳送文字、表情包、圖片、語音

  • 加好友、好友列表、建群、加入群

技術棧

在該專案中使用的技術棧:Go、Gin、Websocket、UDP、Mysql、Redis、Viper、Gorm、Zap、Md5、Jwt。

系統架構

系統架構如下:

通訊流程

通訊流程如下:

開發環境

IDE: goland

資料庫工具:VScode

環境搭建可參考這一篇文章:web專案部署

專案初始化

這裡將專案放置目錄:

/Users/feng/go/src

使用命令初始化:

go mod init HiChat

當然也可是直接使用goland新建專案

構建專案目錄:

HiChat   
    ├── common    //放置公共檔案
    │  
    ├── config    //做配置檔案
    │  
    ├── dao       //資料庫crud
    │  
    ├── global    //放置各種連線池,配置等
    │   
    ├── initialize  //專案初始化檔案
    │  
    ├── middlewear  //放置web中介軟體
    │ 
    ├── models      //資料庫表設計
    │   
    ├── router           //路由
    │   
    ├── service     //對外api
    │   
    ├── test        //測試檔案
    │  
    ├── main.go     //專案入口
    ├── go.mod            //專案依賴管理
    ├── go.sum            //專案依賴管理

配置mysql連線池

新建資料庫

使用SQL語句新建資料庫hi_chat

宣告全域性mysql連線池變數

在global目錄下新建一個global.go檔案

package global

import (
    "gorm.io/gorm"
)

var (
    DB            *gorm.DB
)

建立連線池

在initialize專案下建立db.go檔案

package initialize

import (
    "fmt"
    "log"
    "os"
    "time"

  "HiChat/global"

    "gorm.io/gorm/logger"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func InitDB() {
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", User,
        Password, Host, Port, DBName)
    //注意:User和Password為MySQL資料庫的管理員密碼,Host和Port為資料庫連線ip埠,DBname為要連線的資料庫

    //寫sql語句配置
    newLogger := logger.New(
        log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日誌輸出的目標,字首和日誌包含的內容——譯者注)
        logger.Config{
            SlowThreshold:             time.Second, // 慢 SQL 閾值
            LogLevel:                  logger.Info, // 日誌級別
            IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(記錄未找到)錯誤
            Colorful:                  true,        // 禁用彩色列印
        },
    )

    var err error

  //將獲取到的連線賦值到global.DB
    global.DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
        Logger: newLogger, //列印sql日誌
    })
    if err != nil {
        panic(err)
    }
}

在main中呼叫:

package main

import (
    "HiChat/initialize"
)


func main() {
    //初始化資料庫
    initialize.InitDB()
}

初始化日誌Zap配置

拉取日誌依賴

go get go.uber.org/zap

日誌初始化

在initialize目錄中新建一個logger.go檔案

package initialize

import (
    "log"

    "go.uber.org/zap"
)

func InitLogger() {
    //初始化日誌
    logger, err := zap.NewDevelopment()
    if err != nil {
        log.Fatal("日誌初始化失敗", err.Error())
    }
    //使用全域性logger
    zap.ReplaceGlobals(logger)

}

最後需要在main中呼叫

func main() {
    //初始化日誌
    initialize.InitLogger()
    //初始化資料庫
    initialize.InitDB()
}

總結

到這裡整個專案的初始化基本上完成了,這是第一篇,後續我們就開始功能模組的開發,謝謝您的閱讀。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章