开发框架的必要性

小应用可不用框架 生产环境 企业要快速迭代产品  即使有知识和经验 编写所有功能 难保证 生产级 时间精力 应用一致性
是使用框架的动力  已完成的繁琐且艰苦的工作 没必要重复做轮子

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/Go
https://github.com/gobuffalo/buffalo
https://gobuffalo.io



学习曲线

框架名称示例示例参考实时支持
beego49https://beego.me/docs
buffalo6https://gobuffalo.io/docs/installationslack
Echo20https://echo.labstack.com/cookbook/hello-world
Gin15https://github.com/gin-gonic/gin/tree/master/examplesgitter
Iris92https://github.com/kataras/iris/tree/master/_examplesrocket chat
Revel6http://revel.github.io/examples/index.htmlgitter

astaxie 和 kataras非常出色 其他框架将会有更多的例子 切换 一个新的框架 是最快速掌握尽可能多的信息的最有资源的地方  一个例子 1000个单词


核心功能

核心功能名称IrisBeegoRevelEchoGinBuffalo
路由器
命名路径参数和通配符
Router
Named Path Parameters
& Wildcard*
truetruetruetruetruetrue
路由器
正则表达式(Router: Regex*)
truetruefalsefalsefalsetrue
路由器
分组(Router: Grouping*)
true

truetruetrue
路由器
以上所有混合无冲突
Router
All the above Mixed
Without Conflict*
truefalsefalsefalsefalsefalse
路由器
自定义HTTP错误
Router: Custom HTTP Errors*
truetruetruetruefalsetrue
net/http100%兼容
100% compatible with
net/http*
truefalsefalse
truetrue
中间件生态系统
Middleware ecosystem*
truetruefalsetruetruefalse
Sinatra风格API
Sinatra-like API*
truetruefalsetruetruefalse
服务器:自动HTTPS
Server: Automatic HTTPS*
true
falsetruefalsefalse
服务器:正常关机
Server: Gracefully Shutdown*
truetruetruefalsefalsefalse
服务器:多监听
Server: Multi Listeners*
truefalsefalsefalsefalsefalse
完整的HTTP/2(Full HTTP/2*)true

true标准
standard
标准
standard
子域(Subdomains*)true次要
secondary
次要
secondary
次要
secondary
次要
secondary
次要
secondary
会话管理(Sessions*)truetruetruefalsefalse次要
secondary
Websocketstruetruetruefalsefalsefalse
嵌入到应用
View (aka Templates)
Embedded Into App*
truefalsefalsefalsefalsefalse
View视图引擎 STD
View Engine: STD*
truetruetruetruetruefalse
View视图引擎 Pug
View Engine: Pug*
truefalsefalsefalsefalsefalse
View视图引擎 Django
View Engine: Django*
truefalsefalsefalsefalsefalse
View视图引擎 Handlebars
View Engine: Handlebars*
truefalsefalsefalsefalsefalse
View视图引擎 Amber
View Engine: Amber*
truefalsefalsefalsefalsefalse
数据渲染器
Markdown JSON JSONP XML
truetruetruetruetruefalse
MVCtruetruegeneratorfalsefalsefalse
缓存 Caching*
truetruetruefalsefalsefalse
文件服务器 File Server*
truetruetruetruetruetrue
文件服务器
嵌入到应用程序
File Server
Embedded Into App*
truefalsefalsefalsefalsefalse
响应可 在发送前的生命周期
多次修改
Response can be Modified
Many   times through
lifecycle before sent*
truefalsefalsefalsefalsefalse
Gziptruetruetrue中间件
middleware
中间件
middleware
中间件
middleware
测试框架
Testing Framework*
truefalsefalsefalsefalsefalse
Typescript Transpilertruefalsefalsefalsefalsefalse
在线编辑(Online Editor*)truefalsefalsefalsefalsefalse
日志系统(Logging System*)truetruetruetruetruefalse
维护 自动更新
Maintenance & Auto-Updates*
truefalsefalsefalsefalsefalse
性能(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/herethis/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.Requesthttp.ResponseWriter的上下文

  • 一种将net/http处理程序转换为特定框架的Handler类型的方法

中间件生态系统 (Middleware ecosystem)

不自己用中间件包装 处理程序时 框架会提供完整的引擎来定义流  全局 或 每个路由 或 每组路由  i.e Use(middleware), Done(middleware) etc.

类似 Sinatra API (Sinatra-like API)

类似于SinatraAPIRegister在运行时处理程序中用于特定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)

当框架支持带有httpsHTTP/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 分布式可扩展 可热更新的  游戏 服务器 框架

特性对比

-cellnetGoWorldleaf
传输协议支持TCP、UDP、HTTP、WebSocketTCP、KCP、WebSocketTCP、websocket
编码支持Google Protobuf、json、二进制协议GryffindorGoogle Protobuf(未来支持) MessagePackprotobuf、json
远程过程调用RPC支持同步、异步RPC支持支持
日志管理支持支持支持
热更新
支持
空间和实体
支持(AOI管理多个空间和实体)
分布式
支持支持
流量压缩与加密
支持(客户端和服务器之间的流量)
支持并发量
多核主机运行dispatcher支持100万同时在线
数据库
MongoDB和RedisMongoDb
定时器

支持

方案选择

由于cellnet架构简洁、组件化、高性能等原因,选择此架构进行二次开发
目标特性

 编码:Google Protobuf 、json传输协议支持:http、tcp、websocket支持远程过程调用 异步同步支持分布式部署日志跟踪支持MySql MongoDB





Go 开发框架和go-framework相关