一、介紹
echo web框架是go語言開發的一種高性能,可擴展,輕量級的web框架。
echo框架真的非常的簡單,幾行代碼就可以啟動一個高性能的http服務端。
如果你只是測試返回hello world這種簡單邏輯,普通的低配服務器,每秒扛個萬八千QPS沒什么問題,這個主要跟服務器配置有關,當然實際應用中的業務邏輯不會是hello world那么簡單,業務不同,系統設計不同吞吐量肯定不一樣。
echo框架默認其實只包含了MVC框架的C部分,就是負責url路由和控制器部分。至於V視圖部分和M數據操作部分可以隨意使用自己喜歡的工具庫來操作。
二、安裝
安裝echo包
go get github.com/labstack/echo/
三、如何開始一個Http Server。
創建httpserver.go文件,代碼如下:
package main
import (
"net/http"
//導入echo包
"github.com/labstack/echo"
)
func main() {
//實例化echo對象。
e := echo.New()
//注冊一個Get請求, 路由地址為: /hello 並且綁定一個控制器函數, 這里使用的是閉包函數。
e.GET("/hello", func(c echo.Context) error {
//控制器函數直接返回一個字符串,http響應狀態為http.StatusOK,就是200狀態。
return c.String(http.StatusOK, "hello echo")
})
//啟動http server, 並監聽8080端口,冒號(:)前面為空的意思就是綁定網卡所有Ip地址,本機支持的所有ip地址都可以訪問。
e.Start(":8080")
}
運行http server
$ go run httpserver.go
通過瀏覽器訪問 http://localhost:8080/hello 瀏覽器會顯示: hello echo
echo web框架的代碼非常簡潔,就幾行代碼一個http server的主要的初始化工作就搞定了,只要添加自己的業務代碼就行。
四、項目結構
通過上面的例子,知道echo大致是怎么使用的,但是實際項目業務功能會很多,不可能把所有代碼都寫在一個go文件里面或者寫在一個main入口函數里面;需要對項目結構做一些規划,方便維護代碼以及擴展。
echo web框沒有對項目結構做出限制,根據自己項目需要自行設計。
這里給出一個典型的MVC框架大致的項目結構的例子,參考如下:
├── conf #項目配置文件目錄
│ └── config.toml #可以選擇自己熟悉的配置文件管理工具包例如:toml、xml等等
├── controllers #控制器目錄,按模塊存放控制器,必要的時候可以繼續划分子目錄。
│ ├── food.go
│ └── user.go
├── main.go #項目入口,這里負責echo框架的初始化,注冊路由信息,關聯控制器函數等。
├── models #模型目錄,負責項目的數據存儲部分,例如各個模塊的Mysql表的讀寫模型。
│ ├── food.go
│ └── user.go
├── static #靜態資源目錄,包括Js,css,jpg等等,可以通過echo框架配置,直接讓用戶訪問。
│ ├── css
│ ├── images
│ └── js
├── logs #日志文件目錄,主要保存項目運行過程中產生的日志。
└── views #視圖模板目錄,存放各個模塊的視圖模板,當然有些項目只有api,是不需要視圖部分,可以忽略這個目錄
└── index.html
提示:上面給出的項目結構,程序編譯打包后代碼都編譯成一個可執行程序,需要把conf,static, logs目錄一起打包部署,否則程序會找不到配置文件,靜態文件,日志存儲目錄,后面會有專門的教程介紹go項目的打包。
五、路由&控制器
1.路由
echo框架的路由定義如下:
//定義post請求, url為:/users, 綁定saveUser控制器函數
e.POST("/users", saveUser)
//定義get請求,url模式為:/users/:id (:id是參數,例如: /users/10, 會匹配這個url模式),綁定getUser控制器函數
e.GET("/users/:id", getUser)
//定義put請求
e.PUT("/users/:id", updateUser)
//定義delete請求go
e.DELETE("/users/:id", deleteUser)
2.控制器
在echo框架中,控制器是一個函數,需要根據業務實現各種控制器函數,控制器函數定義如下:
//控制器函數只接受一個echo.Context上下文參數
//參數:c 是上下文參數,關聯了當前請求和響應,通過c參數可以獲取請求參數,向客戶端響應結果。
func HandlerFunc(c echo.Context) error
例子:
// 路由定義:e.GET("/users/:id", getUser)
// getUser控制器函數實現
func getUser(c echo.Context) error {
// 獲取url上的path參數,url模式里面定義了參數:id
id := c.Param("id")
//響應一個字符串,這里直接把id以字符串的形式返回給客戶端。
return c.String(http.StatusOK, id)
}
六、echo如何獲取請求參數
控制獲取請求參數的例子:
func getUser(c echo.Context) error {
// 方式1:獲取url上的path參數,url模式里面定義了參數:id
id := c.Param("id")
//方式2:獲取query參數,例如:/users?username=tizi365&type=2
username := c.QueryParam("username") //值為:"tizi365"
usertype := c.QueryParam("type") //值為:"2"
//方式3:獲取post請求的表單參數
username := c.FormValue("username")
usertype := c.FormValue("type")
return c.String(http.StatusOK, "獲取參數例子")
}
七、響應請求
echo框架支持以文本、html、Json、xml多種格式的內容形式響應Http請求。
控制器響應請求的例子:
type User struct {
Id int
Username string
}
func getUser(c echo.Context) error {
//方式1: 返回字符串
//以字符串的形式返回,c.String語法:c.String(http狀態碼,"字符串內容")
return c.String(http.StatusOK, "獲取參數例子")
//方式2:返回JSON
//以json字符串的形式返回結果,c.JSON語法: c.JSON(http狀態碼, 結構體變量)
u := User{2, "tizi365"}
return c.JSON(http.StatusOK, u) //返回結果:{"id":2,"username":"tizi365"}
//方式3: 返回HTML
//以網頁形式返回html代碼,c.HTML語法: c.HTML(http狀態碼, "html內容")
html := "<html><head><title>tizi365.com</title></head><body>歡迎訪問tizi365.com</body></html>"
//當然實際項目,不會這樣拼寫html代碼,太麻煩,一會使用模板引擎處理Html代碼,然后把結果通過c.HTML返回給客戶端就行。
return c.HTML(http.StatusOK, html)
}
八、如何展示靜態內容
對於js、css、png、jpg這些靜態內容,echo框架通過一個配置就可以實現靜態資源的展示。
例子:
e := echo.New()
...忽略其他初始化代碼...
//設置靜態資源url前綴和目錄
//這里設置 /static 為靜態資源url的前綴,當前程序運行目錄下面的static目錄為靜態資源目錄
e.Static("/static", "static")
//例如:static目錄下存在js/index.js文件, 則這個js的url為:/static/js/index.js