基於Gin的IM聊天架構——HiChat
參考部落格:Hichat作者部落格
因為原部落格已經比較詳細,所以這裡僅記錄遇到的新知識點和遇到的問題。
專案初始化
在你的技術棧中,Viper、Gorm、Zap、Md5、Jwt 是各自領域的常用工具庫或技術,以下是它們的詳細介紹:
1. Viper
- 用途:Viper 是 Go 語言中用於配置管理的庫。它可以讀取配置檔案(如 JSON、YAML、TOML、HCL 等)、環境變數、命令列引數等。
- 功能:支援動態配置、熱過載以及根據環境選擇不同的配置,非常適合大型專案。
- 使用場景:在專案中用來管理不同環境的配置,如開發環境、生產環境的資料庫、快取等不同配置。
示例:
import "github.com/spf13/viper"
viper.SetConfigFile("config.yaml")
viper.ReadInConfig()
dbHost := viper.GetString("database.host")
2. Gorm
- 用途:Gorm 是一個強大的 Go 語言 ORM(物件關係對映) 框架,支援各種資料庫,如 MySQL、PostgreSQL、SQLite 等。
- 功能:提供簡單的查詢、關係對映、遷移、鉤子等功能,簡化資料庫操作。
- 使用場景:在專案中可以用 Gorm 替代 SQL 查詢語句,以物件和方法的方式處理資料庫操作。
示例:
import "gorm.io/gorm"
type User struct {
ID uint
Name string
Age int
}
db.Create(&User{Name: "Alice", Age: 25})
var user User
db.First(&user, "name = ?", "Alice")
3. Zap
- 用途:Zap 是由 Uber 開發的 高效能日誌庫,專門用於高效能的日誌記錄。
- 功能:Zap 支援結構化日誌,具有效能高、靈活、易用等特點。
- 使用場景:在需要記錄應用日誌的情況下,Zap 可用於記錄錯誤、警告、除錯資訊等,支援不同的日誌級別和格式化選項。
示例:
import "go.uber.org/zap"
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("This is an info message")
logger.Error("This is an error message")
4. MD5
- 用途:MD5(訊息摘要演算法)是一種加密雜湊函式,生成一個 128 位的雜湊值。雖然它不再適合密碼學用途,但在一些簡單的資料校驗中仍然被使用。
- 功能:將輸入資料轉換成固定長度的雜湊值,用於校驗資料一致性。
- 使用場景:在專案中可以用 MD5 生成資料的雜湊值進行校驗或簡易加密。
示例:
import (
"crypto/md5"
"encoding/hex"
)
func GetMD5Hash(text string) string {
hash := md5.Sum([]byte(text))
return hex.EncodeToString(hash[:])
}
5. JWT(JSON Web Token)
- 用途:JWT 是一種用於認證的標準,它將使用者資訊以 JSON 物件的形式儲存在加密的令牌中。
- 功能:透過數字簽名保證資料的完整性,常用於生成訪問令牌,用於客戶端和伺服器間的安全通訊。
- 使用場景:在專案中用來建立使用者的認證令牌,在客戶端和伺服器之間傳遞使用者身份資訊,實現無狀態的使用者認證。
示例:
import "github.com/golang-jwt/jwt/v4"
func GenerateJWT() (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"username": "Alice",
"admin": true,
})
tokenString, err := token.SignedString([]byte("your-256-bit-secret"))
return tokenString, err
}
總結
- Viper:配置管理工具。
- Gorm:ORM 框架,簡化資料庫操作。
- Zap:高效能日誌記錄庫。
- MD5:雜湊演算法,適合簡單資料校驗。
- JWT:認證技術,用於生成和解析使用者認證令牌。
每種技術都有自己擅長的應用場景,搭配在一起可以提升專案的可維護性、效能和安全性。希望這些介紹對你有幫助!