zenazn/goji
GitHub: zenazn/goji
Goji 是一个极简、高性能且与 net/http 完全兼容的 Go 语言 Web 框架,以可组合性和简单性为核心设计理念。
Stars: 3648 | Forks: 223
# Goji
[](https://godoc.org/github.com/zenazn/goji/web) [](https://travis-ci.org/zenazn/goji)
Goji 是一个极简的 Web 框架,注重可组合性和简单性。
该项目已被同一作者的[新版 Goji][goji2] 取代。新版本具有非常相似的原语和语义,但根据多年来使用此库及周边 Go 生态系统的经验进行了更新。本项目依然备受喜爱且维护良好,在可预见的未来也将如此,但我们鼓励新项目改用 `goji.io`。
## 示例
```
package main
import (
"fmt"
"net/http"
"github.com/zenazn/goji"
"github.com/zenazn/goji/web"
)
func hello(c web.C, w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %s!", c.URLParams["name"])
}
func main() {
goji.Get("/hello/:name", hello)
goji.Serve()
}
```
Goji 还在 `example` 文件夹中包含了一个[示例应用程序][sample],它是为了展示 Goji 的所有功能而特意构建的。快去看看吧!
## 功能
* 兼容 `net/http`
* URL 模式(包括 Sinatra 风格的 `/foo/:bar` 模式和正则表达式,以及[自定义模式][pattern])
* 可重新配置的 middleware 栈
* 贯穿 middleware 和 handler 的 context/environment 对象
* 自动支持 [Einhorn][einhorn]、systemd 以及[更多][bind]
* [优雅关闭][graceful],结合 Einhorn 可实现零停机时间的优雅重载。
* 富含抗氧化剂
## 稳定性
Goji 的 API 本质上已经冻结,并保证永远不会破坏与现有代码的兼容性(遵循类似于 Go 项目的[指导原则][compat])。Goji 适合在生产环境中使用,并且已在多家公司中处理了数十亿次的请求。
## 它好用吗?
也许吧!
市面上有[很多][revel][其他][gorilla][优秀的][pat][Go][martini][Web][gocraft][框架][tiger]。Goji 既不是特别新颖,也不是独一无二的优秀。Goji 与其他框架之间的主要区别——也是我认为 Goji 还不错的主要原因——在于它的设计理念:
首先,Goji 致力于保持简单。它属于 Sinatra 和 Flask 学派的 Web 框架设计,而不是 Rails/Django 那一派。如果你想让我告诉你应该把 models 放在哪个目录,或者想要内置的 flash session,你用 Goji 不会太顺手。
其次,Goji 尝试实现可组合性。它与 net/http 完全可组合,既可以作为 `http.Handler` 使用,也可以为任意的 `http.Handler` 提供服务。至少有部分 HTTP 框架也具备这一特性,这并不算特别新颖。但在我看来更有趣的特性是,Goji 与自身也是完全可组合的:它定义了一个接口(`web.Handler`),该接口不仅与 `http.Handler` 完全兼容,还允许 Goji 在检测到与自身(或其他兼容 `web.Handler` 的组件)通信时,执行某种“协议升级”。`web.Handler` 是 Goji 接口的核心,正是它使得跨不相关对象共享 request context 成为可能。
第三,Goji 不带魔法。我最喜欢的现有框架之一是 [Martini][martini],但我放弃了它并选择构建 Goji,因为我认为它太“魔法”了。Goji 的 Web 包完全没有使用反射,这本身并不能说明 API 质量的高低,但至少对我来说,这似乎是个好兆头。
最后,Goji 给了你足够的绳子去上吊(注:指赋予了开发者极大的自由度,但也可能带来麻烦)。我最喜欢的另一个库 [pat][pat],以一种特别优雅的方式实现了类似 Sinatra 的路由,但由于它依赖于 net/http 的接口,不允许程序员在请求处理过程中传递自己的状态。实现任意 context 对象是促使我放弃 pat 转而编写 Goji 的主要动机之一。
## 它快吗?
[是的][bench1],[它很快][bench2]。Goji 是目前最快的 HTTP 路由之一,并且对垃圾回收器非常友好。
但这多少有点偏离重点。几乎所有的 Go 路由器对绝大多数应用场景来说都已经足够快了。在我看来,更重要的是路由语义的简单性和灵活性。
Goji 提供的结果与简单地逐一尝试路由没有什么区别。这意味着先添加的路由会先于后续的路由被尝试。这也许是路由器能提供的最简单、最直观的接口,使得路由非常容易理解和调试。
Goji 的路由也非常灵活:除了标准的 Sinatra 风格模式和正则表达式模式外,你还可以定义[自定义模式][pattern]来执行你想要的任何自定义匹配逻辑。当然,自定义模式与上述路由语义完全兼容。
人们很容易(而且相当有趣!)沉迷于微基准测试,但归根结底,你不会在意请求上多出的那几百纳秒。重要的是,你不会为了节省那一点点 CPU 周期而在 API 上妥协。
## 第三方库
Goji 已经兼容了大量本身与 `net/http` 兼容的第三方库,然而一些库作者更是特意加入了对 Goji 的专门支持,可能是通过与 Goji 的 `web.C` 进行更紧密的集成,或是提供自定义模式类型。我们在 [wiki][third] 上维护了一个此类库的非正式列表;如果觉得合适,请随时添加。
标签:EVTX分析, 日志审计