开发框架的必要性
小应用可不用框架 生产环境 企业要快速迭代产品 即使有知识和经验 编写所有功能 难保证 生产级 时间精力 应用一致性是使用框架的动力 已完成的繁琐且艰苦的工作 没必要重复做轮子
Go语言 Web应用开发框架
REST API 最流行 最强力 最全面的Go框架
简化用户使用 API访问点等 根据工作需要的组件扩张 或 缩减开发
网络开发框架Beego
Web应用程序 通用功能 八个模块 按需选择 模型 视图 控制器 model-view-controller / MVC)组件 数据库对象关系映射(object-relationship map ORM) 内置缓存处理 会话处理 日志记录机制 操作HTTP对象的库 命令行工具 用bee从头创建Beego应用 管理现有应用https://github.com/astaxie/beego
https://beego.me
网络开发框架Gin
更好的性能和更多的功能 Gin使用Martini基本思想 使用修改过的 httprouter 软件包提高速度 为常见的场景提供处理 包括中间件 文件上传 日志 将前端HTML组件绑定到后台的数据结构等https://github.com/gin-gonic/gin
https://gin-gonic.github.io/gin
Web开发框架 Gorilla
Gorilla定位 Web工具箱 非MVC风格的框架 库解决Web服务编程各种底层问题 包括context(在请求期间保存状态) mux(路由和调度) 及HTTP安全cookie 会话 websocket和RPC等功能Gorilla没有模板 表单和其他前端部分 需要自行处理 可在其他框架中使用Gorilla组件 或在独立组件中集成用Gorilla编写的东西
Web开发框架 Echo
Echo 面向API 没有模板系统 用Go的html/template 但Echo提供了 常用于API的中间件模块 如基本 认证和密钥身份验证 压缩 代理和日志记录Echo 大量实用的recipe 易实现 例如 想使用Let’s Encrypt来管理HTTPS证书 那么可以设置 recipe 自动安装这些证书
https://github.com/labstack/echo
https://echo.labstack.com
Web开发框架 Iris
Iris 创建者称 真正属于Go的Express.js 就是说 是JavaScript / Node.js的Web框架 Go 版 最小设计 大部分功能 由插件提供 Iris提供基本的MVC功能 自带对中间件 会话 路由和缓存的支持https://github.com/kataras/iris
https://iris-go.com
Web开发框架Revel
Go语言的高生产力 全栈Web框架 Ruby on Rails为MVC风格 Revel 自由使用其他组件来满足需求 使用Go原生html/template包 对于HTTP引擎 使用Go 的或第三方提供的 缓存可以在本地的内容中完成 通过Memcached或Redis在后台完成 没有数据库的原生ORM Revel文档的https://github.com/revel/revel
https://revel.github.io
Web开发框架Buffalo
快速Web开发w/Gohttps://github.com/gobuffalo/buffalo
https://gobuffalo.io
学习曲线
astaxie 和 kataras非常出色 其他框架将会有更多的例子 切换 一个新的框架 是最快速掌握尽可能多的信息的最有资源的地方 一个例子 1000个单词
核心功能
核心功能名称 | Iris | Beego | Revel | Echo | Gin | Buffalo |
---|---|---|---|---|---|---|
路由器 命名路径参数和通配符 Router Named Path Parameters & Wildcard* | true | true | true | true | true | true |
路由器 正则表达式(Router: Regex*) | true | true | false | false | false | true |
路由器 分组(Router: Grouping*) | true | true | true | true | ||
路由器 以上所有混合无冲突 Router All the above Mixed Without Conflict* | true | false | false | false | false | false |
路由器 自定义 HTTP 错误Router: Custom HTTP Errors* | true | true | true | true | false | true |
与net/http 100%兼容100% compatible with net/http* | true | false | false | true | true | |
中间件生态系统 Middleware ecosystem* | true | true | false | true | true | false |
Sinatra 风格APISinatra-like API* | true | true | false | true | true | false |
服务器:自动HTTPS Server: Automatic HTTPS* | true | false | true | false | false | |
服务器:正常关机 Server: Gracefully Shutdown* | true | true | true | false | false | false |
服务器:多监听 Server: Multi Listeners* | true | false | false | false | false | false |
完整的HTTP/2 (Full HTTP/2*) | true | true | 标准 standard | 标准 standard | ||
子域(Subdomains*) | true | 次要 secondary | 次要 secondary | 次要 secondary | 次要 secondary | 次要 secondary |
会话管理(Sessions*) | true | true | true | false | false | 次要 secondary |
Websockets | true | true | true | false | false | false |
嵌入到应用 View (aka Templates) Embedded Into App* | true | false | false | false | false | false |
View视图引擎 STD View Engine: STD* | true | true | true | true | true | false |
View视图引擎 Pug View Engine: Pug* | true | false | false | false | false | false |
View视图引擎 Django View Engine: Django* | true | false | false | false | false | false |
View视图引擎 Handlebars View Engine: Handlebars* | true | false | false | false | false | false |
View视图引擎 Amber View Engine: Amber* | true | false | false | false | false | false |
数据渲染器 Markdown JSON JSONP XML | true | true | true | true | true | false |
MVC | true | true | generator | false | false | false |
缓存 Caching* | true | true | true | false | false | false |
文件服务器 File Server* | true | true | true | true | true | true |
文件服务器 嵌入到应用程序 File Server Embedded Into App* | true | false | false | false | false | false |
响应可 在发送前的生命周期 多次修改 Response can be Modified Many times through lifecycle before sent* | true | false | false | false | false | false |
Gzip | true | true | true | 中间件 middleware | 中间件 middleware | 中间件 middleware |
测试框架 Testing Framework* | true | false | false | false | false | false |
Typescript Transpiler | true | false | false | false | false | false |
在线编辑(Online Editor*) | true | false | false | false | false | false |
日志系统(Logging System*) | true | true | true | true | true | false |
维护 自动更新 Maintenance & Auto-Updates* | true | false | false | false | false | false |
性能(Performance) | ★★★★★ | ★★★ | ★★ | ★★★★★ | ★★★★★ | ★★★ |
Go 出名的 Web框架 不是真正框架 Echo Gin和Buffalo 不是 功能齐全的 Web框架 但Go社区多数人 认为是 纳入清单
除了 Beego 和 Revel 上述框架都可以适应 中间件 是为 net/http 创建的
词汇
路由:命名路径参数 和 通配符
(Router: Named Path Parameters & Wildcard) 可以将处理程序注册到具有动态路径的路由时 命名路径参数"/user/{username}" 匹配 "/user/me", "/user/speedwheel" etc
路径参数username
匹配值分别是 me
和 speedwheel
通配符 "/user/{path *wildcard}" matches to "/user/some/path/here","/user/this/is/a/dynamic/multi/level/path" etc
path
路径参数的值分别是some/path/here
和this/is/a/dynamic/multi/level/path
Iris 支持一种称为宏的功能 可以描述为/user/{username:string} 或 /user/{username:int min(1)}
路由:正则表达式(Router: Regex)
使用带有过滤器的 动态路径 向具有过滤器的路径注册处理程序时 应该传递一些处理程序以 执行处理程序
"/user/{id ^[0-9]$}" matches to "/user/42" but not to "/user/somestring"
id 路径参数的值 42
路由:分组(Router: Grouping)
将 公共逻辑 或 中间件/处理程序 注册到共享相同路径前缀的特定路由组时
myGroup := Group("/user", userAuthenticationMiddleware)myGroup.Handle("GET", "/", userHandler)myGroup.Handle("GET", "/profile", userProfileHandler)myGroup.Handle("GET", "/signup", getUserSignupForm)
/user
/user/profile
/user/signup
可以从组中创建子组 myGroup.Group("/messages", optionalUserMessagesMiddleware)myGroup.Handle("GET', "/{id}", getMessageByID)
/user/messages/{id}
路由:以上所有混合无冲突(Router: All the above Mixed Without Conflict)
先进 有用的功能 由路由器或Web框架支持 目前只有Iris在Go世界中支持这一功能
这意味着/{path *wildcard}
和/user/{username}
和/user/static
和/user/{path*wildcard}
之类的东西可以在同一个路由器中注册 可以正确匹配而不会受到静态路径的冲突(/user/static)或通配符(/{path*wildcard})
路由:自定义HTTP错误(Router: Custom HTTP Errors)
为 错误 状态代码注册处理程序 错误http状态代码是> = 400状态代码,i.s Not Found 404
OnErrorCode(404, myNotFoundHandler)
上面的大多数Web框架仅支持404 405和500注册 但像Iris Beego和Revel 完全支持 任何状态 代码 甚至任何错误代码(Iris仅支持任何错误)
100% compatible with net/http (与net/http 100%兼容)
框架为您提供了 直接访问
*http.Request
和http.ResponseWriter
的上下文一种将
net/http
处理程序转换为特定框架的Handler
类型的方法
中间件生态系统 (Middleware ecosystem)
不自己用中间件包装 处理程序时 框架会提供完整的引擎来定义流 全局 或 每个路由 或 每组路由 i.e Use(middleware), Done(middleware) etc.
类似 Sinatra API (Sinatra-like API)
类似于Sinatra
的APIRegister
在运行时处理程序中用于特定HTTP
方法(和路径参数)的路由
.Get or GET("/path", gethandler).Post or POST("/path", postHandler).Put or PUT("/path", putHandler) and etc.
服务器:自动HTTPS(Server: Automatic HTTPS)
当框架的服务器支持注册和自动续订SSL
认证 以管理SSL/TLS
传入连接(https)时 最着名的自动https提供程序 letsencrypt https://letsencrypt.org/
服务器:正常关机 (Server: Gracefully Shutdown)
按CTRL + C关闭终端应用程序时 服务器将正常关闭 等待一些连接完成其工作(具有特定的超时)或 触发自定义事件以进行清理(即数据库关闭)
服务器:多监听(Server: Multi Listeners)
当框架的服务器支持注册自定义net.Listener
或使用多个http服务器和地址提供Web应用程序时
完整的HTTP/2
(Full HTTP/2)
当框架支持带有https
的HTTP/2
和服务器推送功能时
子域(Subdomains)
当您可以直接从Web应用程序注册每个x,y子域的路由 这个框架不支持这个功能 但你仍然可以通过启动多个http服务器来实现它 缺点是主应用程序和子域没有连接 默认情况下不可能在它们之间共享逻辑
会话(Sessions)
支持http会话并准备在特定处理程序中使用时
一些Web框架支持后端数据库来存储会话 因此 可以在服务器重新启动之间获得持久性 Buffalo使用gorilla会话 这些会话比其他实现慢一点
func setValue(context http_context){ s := Sessions.New(http_context) s.Set("key", "my value")}func getValue(context http_context){ s := Sessions.New(http_context) myValue := s.Get("key")}func logoutHandler(context http_context){ Sessions.Destroy(http_context)}
Wiki: https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session
套接字(WebSockets)
当框架支持 websocket 通信协议时 实现是不同的 示例 查看适合您的内容 与其他API相比 Iris使用更简单的API 实现了最具特色的 webosocket
连接
Wiki: https://en.wikipedia.org/wiki/WebSocket
视图(aka模板)嵌入到应用程序中
通常必须将所有模板文件与Web应用程序的可执行文件并行传输 嵌入到应用程序意味着框架支持与go-bindata
集成 因此最终的可执行文件包含其中的模板 表示为[]byte
什么是视图引擎? 当框架支持模板加载 自定义和构建模板功能时 可以在关键部件上完成
视图引擎:STD
当框架支持通过标准html/template
解析器 加载模板时
视图引擎:Pug
当框架支持通过Pug
解析器 加载模板时
视图引擎:Django
当框架支持通过Django
解析器 加载模板时
视图引擎:Handlebars
当框架支持通过Handlebars
解析器 加载模板时
视图引擎:Amber
当框架支持通过Amber
解析器 加载模板时
渲染:Markdown,JSON,JSONP,XML(Renderer: Markdown, JSON, JSONP, XML)
框架的上下文 提供一种简单的方法来 发送 自定义各种内容类型的响应
MVC
模型 - 视图 - 控制器 在计算机上实现用户界面的软件架构模式 将给定的应用程序划分为三个相互关联的部分 是为了将信息的内部表示与向用户呈现和接受信息的方式分开 MVC设计模式 将这些主要组件分离 实现高效的代码重用和并行开发
Iris支持完整的MVC功能 在运行时注册
Beego仅支持方法和模型匹配 在运行时注册。
Revel支持方法 路径 模型匹配 只能通过生成器(必须运行以构建Web应用程序的不同软件)注册
Wiki: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
高速缓存(Caching)
Web缓存(或HTTP缓存) 临时存储(缓存)Web文档(例如HTML页面和图像)的技术 减少服务器滞后 通过Web缓存系统文档 满足条件 可满足后续要求 Web缓存系统指设备或计算机程序 Wiki https://en.wikipedia.org/wiki/Web_cache
文件服务器(File Server)
当可以将(物理)目录注册到将自动向客户端提供此目录文件的路由时
文件服务器:嵌入到应用程序(File Server: Embedded Into App)
通常 必须传输所有静态文件(如资产 css javascript …)以及应用程序的可执行文件 支持此功能的框架使 有机会将所有这些数据嵌入到应用程序中 表示为[]byte
它们的响应时间也更快 因为服务器可以直接为它们提供服务 而无需在物理位置查找文件
响应可以在发送之前的生命周期中多次修改(Response can be Modified Many times through lifecycle before sent)
目前只有Iris通过其http_context 内置响应编写器 支持此功能 当框架支持此功能时 可以在发送到客户端之前检索 重置 修改写入的状态代码 正文和标题(在基于net/http
的Web框架中 默认情况下这是不可能的 因为无法检索或更改正文和状态代码 书面)
Gzip
在路由的处理程序中 且 可以更改响应编写器 以便使用gzip压缩发送响应时 框架应该处理已发送的头文件 如果发生错误 它应该将响应写入恢复正常
它也应该能够检查客户端是否支持gzip gzip是一种文件格式 用于文件压缩 解压缩的软件应用程序
Wiki: https://en.wikipedia.org/wiki/Gzip
测试框架(Testing Framework)
使用特定的框架库 测试HTTP时 帮助 轻松编写更好的测试 示例(目前 只有Iris支持)
func TestAPI(t *testing.T) { app := myIrisApp() tt := httptest.New(t, app) tt.GET("/admin").WithBasicAuth("name", "pass").Expect(). Status(httptest.StatusOK).Body().Equal("welcome")}
myIrisApp返回 想象中的Web应用程序 有一个/admin
的GET处理程序 受基本身份验证保护 简单测试检查/admin是否以状态OK响应 且使用特定用户名和密码传递身份验证 且其正文为welcome
Typescript Transpiler
Typescript
目标是成为ES6 超集 标准定义的所有新东西之外 还 添加一个静态类型系统 Typescript
还有一个转换器 它将 Typescript
代码(即ES6 +类型)转换为ES5或ES3 javascript
代码 因此 可以在今天的浏览器中使用
在线编辑(Online Editor)
在线编辑器借助在线编辑器 快速轻松地在线编译和运行代码
日志系统(Logging System)
自定义日志记录系统通过提供诸如 颜色编码 格式化 日志级别分离 不同日志记录后端等 有用功能 扩展本机日志包行为
维护和自动更新(Maintenance & Auto-Updates)
以非侵入方式通知用户 即时 更新框架
go游戏框架比较
cellnet是一个组件化 高扩展性 高性能的 开源 服务器 框架
Leaf 是一个模块化 多核支持 稳定的开源 游戏 服务器 框架
GoWorld 分布式可扩展 可热更新的 游戏 服务器 框架
特性对比
- | cellnet | GoWorld | leaf |
---|---|---|---|
传输协议支持 | TCP、UDP、HTTP、WebSocket | TCP、KCP、WebSocket | TCP、websocket |
编码支持 | Google Protobuf、json、二进制协议Gryffindor | Google Protobuf(未来支持) MessagePack | protobuf、json |
远程过程调用RPC | 支持同步、异步RPC | 支持 | 支持 |
日志管理 | 支持 | 支持 | 支持 |
热更新 | 支持 | ||
空间和实体 | 支持(AOI管理多个空间和实体) | ||
分布式 | 支持 | 支持 | |
流量压缩与加密 | 支持(客户端和服务器之间的流量) | ||
支持并发量 | 多核主机运行dispatcher支持100万同时在线 | ||
数据库 | MongoDB和Redis | MongoDb | |
定时器 | 支持 |
方案选择
由于cellnet架构简洁、组件化、高性能等原因,选择此架构进行二次开发
目标特性
编码:Google Protobuf 、json传输协议支持:http、tcp、websocket支持远程过程调用 异步同步支持分布式部署日志跟踪支持MySql MongoDB
尊贵的董事大人
英文标题不为空时 视为本栏投稿
需要关键字 描述 英文标题