『壹』 GoLang -- gRPC框架四大服務
在 gRPC 里客戶端應用可以像調用本地對象一樣直接調用另一台不同的機器上服務端 應用的方法,使得您能夠更容易地創建分布式應用和服務。與許多 RPC 系統類似,gRPC 也是基於以下理念:定義一個服務,指定其能夠被遠程調用的方法(包含參數和返回類型)。在服務端實現這個介面,並運行一個 gRPC 伺服器來處理客戶端調用。在客戶端擁有一個存根能夠像服務端一樣的方法。
gRPC 客戶端和服務端可以在多種環境中運行和交互 - 從 google 內部的伺服器到你自己的筆記本,並且可以用任何 gRPC 支持的語言來編寫。所以,你可以很容易地用 Java 創建一個 gRPC 服務端,用 Go、Python、Ruby 來創建客戶端。此外,Google 最新 API 將有 gRPC 版本的介面,使你很容易地將 Google 的功能集成到你的應用里。
gRPC 默認使用 protocol buffers,這是 Google 開源的一套成熟的結構數據序列化機制(當然也可以使用其他數據格式如 JSON)。名叫 proto3 的新風格的 protocol buffers,它擁有輕量簡化的語法、一些有用的新功能,並且支持更多新語言。當前針對 Java 和 C++ 發布了 beta 版本,針對 JavaNano(即 Android Java)發布 alpha 版本,在protocol buffers Github 源碼庫里有 Ruby 支持, 在golang/protobuf Github 源碼庫里還有針對 Go 語言的生成器, 對更多語言的支持正在開發中。
有了 gRPC, 我們可以一次性的在一個 .proto 文件中定義服務並使用任何支持它的語言去實現客戶端和伺服器,反過來,它們可以在各種環境中,從Google的伺服器到你自己的平板電腦—— gRPC 幫你解決了不同語言及環境間通信的復雜性.使用 protocol buffers 還能獲得其他好處,包括高效的序列號,簡單的 IDL 以及容易進行介面更新。
現在讓我們來仔細了解一下當 gRPC 客戶端調用 gRPC 服務端的方法時到底發生了什麼。我們不究其實現細節,關於實現細節的部分,你可以在我們的特定語言頁面里找到更為詳盡的內容。
首先我們來了解一下最簡單的 RPC 形式:客戶端發出單個請求,獲得單個響應。
服務端流式 RPC 除了在得到客戶端請求信息後發送回一個應答流之外,與我們的簡單例子一樣。在發送完所有應答後,服務端的狀態詳情(狀態碼和可選的狀態信息)和可選的跟蹤元數據被發送回客戶端,以此來完成服務端的工作。客戶端在接收到所有服務端的應答後也完成了工作。
客戶端流式 RPC 也基本與我們的簡單例子一樣,區別在於客戶端通過發送一個請求流給服務端,取代了原先發送的單個請求。服務端通常(但並不必須)會在接收到客戶端所有的請求後發送回一個應答,其中附帶有它的狀態詳情和可選的跟蹤數據。
雙向流式 RPC ,調用由客戶端調用方法來初始化,而服務端則接收到客戶端的元數據,方法名和截止時間。服務端可以選擇發送回它的初始元數據或等待客戶端發送請求。 下一步怎樣發展取決於應用,因為客戶端和服務端能在任意順序上讀寫 - 這些流的操作是完全獨立的。例如服務端可以一直等直到它接收到所有客戶端的消息才寫應答,或者服務端和客戶端可以像"乒乓球"一樣:服務端後得到一個請求就回送一個應答,接著客戶端根據應答來發送另一個請求,以此類推。
通過運行下面的命令克隆並安裝grpc-go代碼庫:
下載protobuf源碼包
安裝golang-protobuf
第一步使用 protocol buffers去定義 gRPC service 和方法 request 以及 response 的類型。
要定義一個服務,必須在.proto 文件中指定 service:
然後在服務中定義 rpc 方法,指定請求的和響應類型,gRPC 允許定義4種類型的 service 方法。
服務.proto文件如下所示:
『貳』 gorm基本使用
gorm安裝
gorm框架是go的一個資料庫連接及交互框架,一般用於連接關系型資料庫。
安裝gorm,使用命令安裝:
go get -u -v github.com/jinzhu/gorm
連接資料庫
構建連接的目標為資料庫中某一個庫,同大多數框架一樣使用url進行連接,url基本格式:
用戶名:密碼@連接方式(ip:port)/資料庫名?參數
參數描述:
用戶名 :連接資料庫用戶名
密碼 :連接資料庫密碼
連接方式 :或稱為訪問協議,一般為tcp
ip :資料庫所在伺服器地址
port :資料庫監聽埠
資料庫名 :資料庫中對應要連接庫名
參數 :附加資料庫參數,根據資料庫不同內容不同
確定url後,就可以調用gorm中參數進行連接資料庫操作:
別忘記import語句導入包:
操作完資料庫後不要忘了關閉連接:
表操作
創建表
gorm創建表基於結構體,所以創建表前要先用結構體規劃表結構,這里簡單寫一個結構體,創建表時默認結構體第一個欄位作為主鍵:
寫好結構體後,調用創建表語句直接按照結構體結構創建表:
當直接創建表時,表名遵循規范:
1、大寫字母全部小寫,所有位於中間的大寫字母都變成小寫字母並且前面加下劃線,例如UserInfo結構體創建為表名稱為user_infos。
2、上面最後的那個s是因為直接創建表時,名稱最後都會加上一個s。所以上面結構體User創建表後名稱為users。
刪除表
增刪改查
插入數據
插入數據,插入數據方法結構使用Create方法:
查詢數據
查詢第一條找到的數據,使用First,該方法返回值仍然為db對象,所以接收數據時我們需要先定義一個對應表結構的結構體接收數據:
有First就有Last,同First調用格式一致。
批量查詢,批量查詢使用Find方法,其餘參數結構同First或Last相同,只不過傳參時一般傳入數組參數,當然,First或Last方法也可以傳入數組參數,但得到的數組只有一個數據,批量查詢操作:
更新數據
刪除內容
『叄』 golang 有哪些比較穩定的 web 開發框架
第一個:Beego框架
Beego框架是astaxie的GOWeb開發的開源框架。Beego框架最大的特點是由八個大的基礎模塊組成,八大基礎模塊的特點是可以根據自己的需要進行引入,模塊相互獨立,模塊之間耦合性低。
相應的Beego的缺點就是全部使用時比較臃腫,通過bee工具來構建項目時,直接生成項目目錄和耦合關系,從而會導致在項目開發過程中受制性較大。
第二個:Gin框架
Gin是一個GOlang的微框架,封裝比較優雅,API友好,源碼注釋比較明確,已經發布了1.0版本;具有快速靈活、容錯方便等特點,其實對於golang而言,web框架的依賴遠比Python、Java更小。
目前在很多使用golang的中小型公司中進行業務開發,使用Gin框架的很多,大家如果想使用golang進行熟練Web開發,可以多關注一下這個框架。
第三個:Iris框架
Iris框架在其官方網站上被描述為GO開發中最快的Web框架,並給出了多框架和多語言之前的性能對比。目前在github上,Iris框架已經收獲了14433個star和1493個fork,可見是非常受歡迎的。
在實際開發中,Iris框架與Gin框架的學習曲線幾乎相同,所以掌握了Gin就可以輕松掌握Iris框架。
第四個:Echo框架
也是golang的微型Web框架,其具備快速HTTP路由器、支持擴展中間件,同時還支持靜態文件服務、Websocket以及支持制定綁定函數,制定相應渲染函數,並允許使用任意的HTML模版引擎。
『肆』 GoLang -- Gin框架
• 何為框架:
框架一直是敏捷開發中的利器,能讓開發者很快的上手並做出應用,甚至有的時候,脫離了框架,一些開發者都不會寫程序了。成長總不會一蹴而就,從寫出程序獲取成就感,再到精通框架,快速構造應用,當這些方面都得心應手的時候,可以嘗試改造一些框架,或是自己創造一個。
Gin是一個golang的微框架,封裝比較優雅,API友好,源碼注釋比較明確,已經發布了1.0版本。具有快速靈活,容錯方便等特點。其實對於golang而言,web框架的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯。框架更像是一些常用函數或者工具的集合。藉助框架開發,不僅可以省去很多常用的封裝帶來的時間,也有助於團隊的編碼風格和形成規范。
(1)首先需要安裝,安裝比較簡單,使用go get即可
go get github.com/gin-gonic/gin
如果安裝失敗,直接去Github clone下來,放置到對應的目錄即可。
(2)代碼中使用:
下面是一個使用Gin的簡單例子:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
router.Run(":8080") // listen and serve on 0.0.0.0:8080
}
簡單幾行代碼,就能實現一個web服務。使用gin的Default方法創建一個路由handler。然後通過HTTP方法綁定路由規則和路由函數。不同於net/http庫的路由函數,gin進行了封裝,把request和response都封裝到gin.Context的上下文環境。最後是啟動路由的Run方法監聽埠。麻雀雖小,五臟俱全。當然,除了GET方法,gin也支持POST,PUT,DELETE,OPTION等常用的restful方法。
Gin可以很方便的支持各種HTTP請求方法以及返回各種類型的數據,詳情可以前往https://github.com/gin-gonic/gin查看。
2.1 匹配參數
我們可以使用Gin框架快速的匹配參數,如下代碼所示:
冒號:加上一個參數名組成路由參數。可以使用c.Param的方法讀取其值。當然這個值是字串string。諸如/user/rsj217,和/user/hello都可以匹配,而/user/和/user/rsj217/不會被匹配。
瀏覽器輸入以下測試:
返回結果為:
其中c.String是gin.Context下提供的方法,用來返回字元串。
其中c.Json是gin.Context下提供的方法,用來返回Json。
下面我們使用以下gin提供的Group函數,方便的為不同的API進行分類。
我們創建了一個gin的默認路由,並為其分配了一個組 v1,監聽hello請求並將其路由到視圖函數HelloPage,最後綁定到 0.0.0.0:8000
C.JSON是Gin實現的返回json數據的內置方法,包含了2個參數,狀態碼和返回的內容。http.StatusOK代表返回狀態碼為200,正文為{"message": 「welcome"}。
註:Gin還包含更多的返回方法如c.String, c.HTML, c.XML等,請自行了解。可以方便的返回HTML數據
我們在之前的組v1路由下新定義一個路由:
下面我們訪問
可以看到,通過c.Param(「key」)方法,Gin成功捕獲了url請求路徑中的參數。同理,gin也可以捕獲常規參數,如下代碼所示:
在瀏覽器輸入以下代碼:
通過c.Query(「key」)可以成功接收到url參數,c.DefaultQuery在參數不存在的情況下,會由其默認值代替。
我們還可以為Gin定義一些默認路由:
這時候,我們訪問一個不存在的頁面:
返回如下所示:
下面我們測試在Gin裡面使用Post
在測試端輸入:
附帶發送的數據,測試即可。記住需要使用POST方法.
繼續修改,將PostHandler的函數修改如下
測試工具輸入:
發送的內容輸入:
返回結果如下:
備註:此處需要指定Content-Type為application/x-www-form-urlencoded,否則識別不出來。
一定要選擇對應的PUT或者DELETE方法。
Gin框架快速的創建路由
能夠方便的創建分組
支持url正則表達式
支持參數查找(c.Param c.Query c.PostForm)
請求方法精準匹配
支持404處理
快速的返回給客戶端數據,常用的c.String c.JSON c.Data
『伍』 Go語言做Web應用開發的框架,哪一個更適合入門
Revel Web開源框架
個高效的Go語言Web開發框架,其思路完全來自 Java 的Play Framework。
特點
熱編譯,簡單可選,同步(每個請求都創建自己的goroutine來處理。
Go語言Web框架:beego
一個用Go開發的應用框架,思路來自於tornado,路由設計來源於sinatra。
支持特性
MVC;
REST;
智能路由;
日誌調試;
配置管理;
模板自動渲染;
layout設計;
中間件插入邏輯;
方便的JSON/XML服務;
『陸』 Golang web 框架對比
由於 golang 提供了完善的net/http標准庫,基於該標准庫實現一個web框架的難度相比其他語言低了不少,所以go web框架簡直就是百花齊放。從老牌的revel和 beego ,到新出的 gin ,和 iris 等,而且還有一些類似於 chi 這種router。個人一般小項目,尤其是中間件需要暴露一些http介面的,基本就使用chi即可。
本次測試主要是gin iris echo 這三個框架。側重在於高性能,從並發和json序列化和反序列化兩個方面來測評,畢竟後台項目側重的也就是這兩個方面。
為了選擇符合重IO的框架,現設定如下場景的demo,demo的具體要求如下:
gin:
iris:
echo:
由於要測試5種body樣本,4種場景,4個框架,因此把重點數據篩選出來(吞吐量、錯誤率和99%Line,重要性依次遞減),結果都繪制了圖形,方便比對查看。
綜合以上各個測試結果可以看出,gin以及iris都是非常優秀的框架,gin的優勢比其他稍微大點,iris次之,而echo相應差一點。
本次測試只是簡單測試了一下3個框架的並發和json相關。對比結果,不包括生態和工具的完善度等等。如果測試有什麼不完善的地方,歡迎交流。
另外歡迎大家試用和star另外一個web框架 baa ,為了避嫌我沒有貼出baa的數據,性能測試處於gin之後和iris之間。
『柒』 Go語言用什麼緩存框架好,Redis嗎
你要的應該是 Reids 或 Memcached 這些緩存服務,在 Go 語言中的客戶端工具。
GitHub 上有個 repo 叫 awesome-go(GitHub - avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software),整理了常見的 Go 框架或代碼庫,其中就有 Redis 和 Memcached 的客戶端。