該伺服器實現簡單接收請求並將請求引數封裝儲存在mongodb資料庫中,本文將講述gin-mgo的使用方法。
gin web框架使用介紹
首先獲取gin框架依賴
go get gopkg.in/gin-gonic/gin.v1
func main()
func indexrouter(c *gin.context)
params = c.request.form //獲取所有引數列表
fmt.println(params) //列印輸出引數
c.string(http.statusok,"hello gin")//返回給頁面hello gin字串
"index.html", nil) //頁面跳轉
}
mgo 持久層框架使用介紹
前提條件mongodb環境已經搭建好了,首先安裝mgo框架依賴
go get labix.org/v2/mgo
type user struct
func main()
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)
}
該專案主要實現接收請求,解析封裝引數,插入資料庫的簡單操作,這裡只涉及插入操作,故不涉及資料快取的知識,整個服務處於單機下,故不涉及分布式服務架構,集群的知識。
注意以下
開啟乙個協程獨自監聽訪問數量,進行插入操作
實現批量插入
實現定時插入
加鎖解決併發資源競爭
開啟乙個協程獨自監聽訪問數量,進行插入操作
如果將插入操作放在主線程,那麼接收http請求和邏輯處理,資料庫插入操作都必須要順序執行,大大降低了插入效率,因此要開啟乙個協程,獨自監聽訪問數量,進行資料庫插入。實現批量插入
假想一下如果每次有人訪問你的資料庫你就進行一次插入操作,那麼你的資料庫將會是乙個什麼樣的情況?我們都知道資料庫操作相對伺服器其他操作是一件相對很耗時的事情,所以每次訪問就操作一次資料庫,會大大降低伺服器效能,更別說有幾千上萬的人同時訪問你的伺服器了。實現定時插入
在實現了批量插入的基礎上,如果沒有達到一定的訪問量,那麼就不會執行插入操作,剛好在兩個訪問請求中間隔了很長時間,那麼前面的請求就會等待很久才會更新到資料庫中,為了防止這種情況,我們必須要設定乙個時間,定時插入。加鎖解決併發資源競爭
在併發量幾千上萬的情況下,可能一秒可以執行很多次資料庫的插入操作,這個時候很有可能上乙個插入還沒執行完,第二個就已經執行了,這時候可能出現資料冗餘,伺服器癱瘓等問題,因此要給批量插入操作加上乙個讀寫鎖。
高併發 高可用
高併發 提高系統併發能力的方法主要有兩種 前者垂直擴充套件可以通過提公升單機硬體效能,或者提公升單機架構效能,來提高併發性,但單機效能總是有極限的,網際網路分布式架構設計高併發終極解決方案還是後者 水平擴充套件。網際網路分層架構中,各層次水平擴充套件的實踐又有所不同 1 反向 層可以通過 dns輪詢...
高併發 高併發測試筆記
問 高併發測試 一般你們用什麼工具來模擬 10萬級別的客戶端併發?在普通的電腦上可以模擬嗎 10萬併發需要至少10萬的套接字,套接字在核心中占用記憶體100000 6k 2 1g記憶體,系統需要能夠開啟10w個fd。一般的系統能夠能模擬 問 預設每個程序只能開1024個fd,修改後最大可以10w,那...
併發與高併發(二十)高併發 應用拆分思路
這一章節我們將講解高併發解決方案中的應用拆分思路,也可以稱之為系統拆分。單個伺服器再優化,它的處理都是有上限的,因此我們採用擴容 快取 訊息佇列等對程式進行優化,這些手段都可行,但還不是全部。隨著專案的需求要求越來越多,應用自然會跟著越來越大,因此呢,架構師設計出了特別容易擴充套件的方案,從整體將乙...