Echo 介绍
Echo 是众多 Go Web 框架的一个,根据官网介绍,它有着高性能、可扩展性、极简的特点。
Echo 的特点概述:
- 优化的 HTTP 路由,可智能地优先路由
- 方便构建强大且可扩展的 RESTful API
- API 组
- 可扩展的中间件框架,在多个级别定义中间件(root, group, route)
- 为 JSON , XML 进行表单数据负载绑定
- 发送各种 HTTP 响应的便捷功能
- 集中式 HTTP 错误处理
- 使用任何模板引擎进行模板渲染
- 定义日志的格式
- 高度个性化、可定制
- 通过 Let’s Encrypt 实现自动 TLS
- HTTP/2 支持
Echo 上手
从 4.0.0 版本开始,Echo 可作为 Go 模块使用。因此,需要一个能够理解 /vN 后缀导入的 Go 版本:
- 1.9.7+
- 1.10.3+
- 1.14+
这些 Go 版本中的任何一个都允许您将 Echo 导入为 github.com/labstack/echo/v4
,这是今后使用 Echo 的推荐方式。
Echo 安装
这里以 Linux 为例,我们先看一下自己本地的 Go 版本:
$ go version
go version go1.16.2 linux/amd64
本文使用的是 Go 1.16 版本,所以可以直接上手使用。
- 新建一个项目文件夹
HeadFirstEcho
,然后进入该文件目录下:
$ mkdir HeadFirstEcho && cd HeadFirstEcho
- 然后利用
go mod
初始化该项目:
$ go mod init HeadFirstEcho
go: creating new go.mod: module HeadFirstEcho
- 下载 Echo,命令:
// go get github.com/labstack/echo/{version}
go get github.com/labstack/echo/v4
本次下载成功如下:
下载成功后,我们来看一下如果利用 Echo 来写一个 HelloWorld 项目。
Hello World
在 Hello World 程序中,我们只需要让用户通过访问服务器地址,得到一个 Hello World 的文本就算成功,所以只需要编写一个服务器。创建一个 helloServer.go
文件:
package main
import (
"net/http"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New() // 得到一个 echo.Echo 的实例
// 注册路由
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
// 开启 HTTP Server
e.Logger.Fatal(e.Start(":2022"))
}
启动我们的服务器: $ go run helloServer.go
, 接着我们能看到如下的界面,说明 helloServer 服务器启动成功!
然后我们打开浏览器,访问:http://localhost:2022/
,就能成功的看到我们的 Hello,World! 输出到屏幕上。
对比,之前用 Go 系统自带的 http 库实现的 HelloWorld 应用还是有异曲同工之妙的,该篇文章点 此处
带日志功能的 HelloWorld 程序
Echo 还带有非常丰富的日志中间件:日志会记录每个有关 HTTP 请求的信息,只需要使用 e.Use(middleware.Logger())
方法就能调用日志记录器,非常方便。当然日志也支持自定义,具体之后的文章再进行研究。
恢复中间件从链中任何地方的 panic 报错中恢复,并能够打印堆栈跟踪并将控制权处理给集中式 HTTPErrorHandler。用法也很简单:e.Use(middleware.Recover())
。
来看如下的例子:
package main
import (
"net/http"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
// Handler
func hello(c echo.Context) error {
return c.String(http.StatusOK, "你好,世界!")
}
func main() {
// Echo instance
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Routes
e.GET("/", hello)
// Start server
e.Logger.Fatal(e.Start(":1323"))
}
除了能在前端显示出:“你好,世界!” 的界面,还能在后台看到日志打印在控制台上:
$ go run hello.go
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.6.3
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:1323
{"time":"2022-02-25T15:08:10.481569868+08:00","id":"","remote_ip":"127.0.0.1","host":"localhost:1323","method":"GET","uri":"/","user_agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0","status":200,"error":"","latency":9308,"latency_human":"9.308µs","bytes_in":0,"bytes_out":16}
能看到的日志信息有:
- time :时间,2022-02-25T15:08:10.481569868+08:00
- id:此处为空
- remote_ip:127.0.0.1
- host:localhost:1323
- method:GET 方法
- uri:/ 根目录
- user_agent 用户头:此处为火狐 Ubuntu 版,Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0
- status:状态码,200
- error:空
- latency: 9308
- latency_human: 9.308µs
- bytes_in: 0
- bytes_out: 16
其他中间件
从上面两个中间件我们可以看出,Echo 的确不愧为官网自称的极简 Web 框架,所有的函数调用都非常简单,而且支持可定制化。
在官方文档中,我们能看到所有的基本 Web 组件都已经帮我们实现好,比如:
- Binding:绑定请求数据
- Context:上下文,表示当前 HTTP 请求的上下文。
- Cookies
- Error Handling:错误处理
- Request:请求
- Response:响应
- Static Files:静态文件
- Templates:模板
- Testing:测试
还有更多的中间件,包括 认证、CORS、CSRF、JWT、Logger、Secure、Session 等等,感兴趣的朋友赶紧上手试一试吧。
丰富而简单的案例
如果有一点 Web 开发的知识,对上述内容一定不陌生。
除了针对每一个组件的介绍,官方文档也提供了很多案例来帮助我们更好的学习和上手 Echo 这个框架,比如 文件下载 、 上传 、还有一个 WebSocket 的案例实现服务器和客户端的聊天。
跟着文档学习的过程你中,发现每个程序案例都很简单,几乎都是在本地运行代码,就能看到同样的效果,对新人真的很友好!
如果大家感兴趣的话,就自己去探索吧,刚好笔者也想做一个简单的 Web 项目,刚好可以利用上 Echo ,一边开发一边学习。
总结
Go 语言的 Web 开发框架其实也有很多: Gin 、 Beego 、 Revel 。
Echo 作为其中的一款。截止到 2022 年,目前已经在 Github 上收获了 21.7k 的 Star 和 1.9k 的 Fork,可以说是经得起时间检验,得到了大家的认可,正可谓对应上标题中的回声嘹亮。
在著名的 Go 开发者成长路线图 中也推荐了 Go 语言开发者应该要学习 Echo 框架。
最后,希望更多人能够和我一样加入对这个框架的学习。之后的文章中,会介绍 Echo 的其他组件在 Web 开发中的运用,下一篇 Echo 文章见!
参考资料:
希望本文能对你有所帮助,如果喜欢本文,可以点个赞或关注。
这里是宇宙之一粟,下一篇文章见!
宇宙古今无有穷期,一生不过须臾,当思奋争。
本文参与了思否技术征文,欢迎正在阅读的你也加入。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。