golang-gin-mgo高併發伺服器搭建
阿新 • • 發佈:2018-12-22
gin-mgo伺服器搭建
該伺服器實現簡單接收請求並將請求引數封裝儲存在mongodb資料庫中,本文將講述gin-mgo的使用方法。
gin web框架使用介紹
首先獲取gin框架依賴
go get gopkg.in/gin-gonic/gin.v1
func main() {
server = gin.Default()
app.server.GET("/do", IndexRouter)//創造一個GET請求的路由地址,並指定處理函式為IndexRouter函式
app.server.Run(":8080")
}
func IndexRouter(c *gin.Context) {
if c.Request.Form == nil { //獲取所有請求引數名和值的預處理
c.Request.ParseMultipartForm(32 << 20)
}
params = c.Request.Form //獲取所有引數列表
fmt.Println(params) //列印輸出引數
c.String(http.StatusOK,"hello gin")//返回給頁面hello gin字串
//c.HTML(http.StatusOK, "index.html", nil) //頁面跳轉
}
mgo 持久層框架使用介紹
前提條件mongodb環境已經搭建好了,首先安裝mgo框架依賴
go get labix.org/v2/mgo
type User struct{
username string
pwd string
}
func main() {
mgo_session, err = mgo.Dial("127.0.0.1") //獲取連線物件session
if err != nil {
panic(err)
}
defer session.Close() //方法執行完後關閉連線
mgo_db = oper.mgo_session.DB("test" ) //獲取資料庫物件,資料庫名為test
//如果沒有mongodb沒有開啟許可權認證,則跳過這一步
mgo_db.Login("test1", "test1") //使用者認證,使用者名稱賬戶和密碼都是test1
mgo_c = oper.mgo_db.C("coll") //獲取資料庫某個集合物件
//插入操作
mgo_c.insert(&User{
username: "xxx",
pwd: "xxx",
})
}
提高伺服器高併發效能講解(針對文章開頭地址中的專案)
該專案主要實現接收請求,解析封裝引數,插入資料庫的簡單操作,這裡只涉及插入操作,故不涉及資料快取的知識,整個服務處於單機下,故不涉及分散式服務架構,叢集的知識。
注意以下
- 開啟一個協程獨自監聽訪問數量,進行插入操作
- 實現批量插入
- 實現定時插入
- 加鎖解決併發資源競爭
開啟一個協程獨自監聽訪問數量,進行插入操作
如果將插入操作放在主執行緒,那麼接收http請求和邏輯處理,資料庫插入操作都必須要順序執行,大大降低了插入效率,因此要開啟一個協程,獨自監聽訪問數量,進行資料庫插入。
實現批量插入
假想一下如果每次有人訪問你的資料庫你就進行一次插入操作,那麼你的資料庫將會是一個什麼樣的情況?我們都知道資料庫操作相對伺服器其他操作是一件相對很耗時的事情,所以每次訪問就操作一次資料庫,會大大降低伺服器效能,更別說有幾千上萬的人同時訪問你的伺服器了。
實現定時插入
在實現了批量插入的基礎上,如果沒有達到一定的訪問量,那麼就不會執行插入操作,剛好在兩個訪問請求中間隔了很長時間,那麼前面的請求就會等待很久才會更新到資料庫中,為了防止這種情況,我們必須要設定一個時間,定時插入。
加鎖解決併發資源競爭
在併發量幾千上萬的情況下,可能一秒可以執行很多次資料庫的插入操作,這個時候很有可能上一個插入還沒執行完,第二個就已經執行了,這時候可能出現數據冗餘,伺服器癱瘓等問題,因此要給批量插入操作加上一個讀寫鎖。
具體實現細節可以去上述地址中檢視,歡迎點評