這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
PhalGo-Echo路由
Echo官網地址:https://labstack.com/echo
Echo是PhalGo最核心的組件,負責了整體的請求路由返回等功能,並且Echo支援HTTP2協議以及HTTPS協議
為什麼選擇Echo
在初期筆者考慮過Echo,gin以及beego來嘗試實現自己的項目,最終還是選擇了使用Echo來作為PhalGo的主要路由架構
讓我決定的因素是應為Echo支援使用fasthttp所以在效率上面基本其他架構沒法比(筆者是個效能狗),我們可以看一下Echo官方的效能圖
機器配置:
- Go 1.6
- wrk 4.0.0
- 2 GB, 2 Core
gin相對來說更人性化一些beego相對更簡單易用一些感興趣的可以嘗試一下
註冊路由
在PhalGo中所有的組件需要使用都需要在入口進行註冊
//初始化ECHO路由phalgo.NewEcho()
然後就可以註冊我們的路由了,建議在項目建立一個routes目錄中存放路由go檔案然後在入口檔案中引入
// Routes 載入路由routes.GetRoutes()
Echo支援restful標準
phalgo.Echo.Get() //接受Get請求phalgo.Echo.Post() //接受Post請求phalgo.Echo.Delete() //接受Delete請求phalgo.Echo.Put() //接受Put請求phalgo.Echo.Any() //接受所有請求方式
以上所有方式都需要接受兩個參數,第一個是請求的路徑比如填入**"/test/:id"**,就需要使用**localhost/test/5**這種方式請求,第二個參數必須是一個方法**func(Context) error**例子如下
func hello(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!")}//接收Get請求e.GET("/test/:id",hello)
開啟服務
開啟服務有兩種方式一種是預設的Standard方式一種是Fasthttp,看過上面的對比圖也應該之道Fasthttp有多強了把,我們可以在入口檔案最後加入如下語句開啟服務
//使用Fasthttp方式phalgo.RunFasthttp(":1333")//使用Standard方式phalgo.RunStandard(":1333")
這樣就可以運行一個http服務了
中介軟體middleware
Echo有很多好用的中介軟體,筆者在這裡進行了封裝,這裡簡單提及幾個以及他們的功能,使用方式只需要在開啟服務之前初始化即可
1.Recover
使用Recover會列印出列印請求異常資訊
phalgo.Recover()
比如訪問一個未註冊路由的地址,頁面上會列印Not Found,終端上會列印如下語句:
{"time":"2016-05-24T17:02:12+08:00","level":"ERROR","prefix":"echo","file":"echo.go","line":"226","message":"Not Found"}
2.Logger
使用Logger會列印出所有的請求明細,請求IP請求方式,請求花費時間請求地址,請求httpcode等等,方便調試
請求成功:
{"time":"2016-05-24T17:02:12+08:00","remote_ip":"101.81.5.247","method":"GET","uri":"/","status":200, "latency":194,"latency_human":"194.251µs","rx_bytes":0,"tx_bytes":76}
請求失敗:
{"time":"2016-05-24T17:02:10+08:00","remote_ip":"101.81.5.247","method":"GET","uri":"/s","status":404, "latency":79,"latency_human":"79.126µs","rx_bytes":0,"tx_bytes":9}
3.Gzip壓縮
在很多時候我們需要開啟Gzip壓縮來減少返回資料的大小來節約流量可以通過以下方式設定:
phalgo.Gzip()
4.末尾斜杠處理
在匹配路由的時候有一個問題比如我們定義了一個路由是**/test**我們通過**localhost/test/**是請求不到應為末尾多了一個斜杠,這個時候就可以通過中介軟體的末尾斜杠處理來添加末尾斜杠或者是刪除末尾斜杠
//自動添加末尾斜杠phalgo.AddTrailingSlash()//自動刪除末尾斜杠phalgo.RemoveTrailingSlash()