GoFrame v1.0.898 正式版发布,Go 应用开发框架

栏目: Go · 发布时间: 6年前

内容简介:从上一次GF框架版本发布到现在过去了两个多月的时间,在这期间GF框架做了大量的改进工作。并接连进一步应用到了很多高并发生产环境项目上,如REST服务端(每天千万级的请求量处理),日志搜集工具(每天单进程处理10+亿条的日志数据)。同时也收到了很多朋友的开发建议和issue反馈,目前都已经全部解决完善。GF框架也从beta版本迎来了第一个stable正式版,这是一个伟大的版本。GF(Go Frame)是一款模块化、松耦合、轻量级、高性能的Go语言Web开发框架。支持热重启、热更新、多域名、多端口、多服务、H

从上一次GF框架版本发布到现在过去了两个多月的时间,在这期间GF框架做了大量的改进工作。并接连进一步应用到了很多高并发生产环境项目上,如REST服务端(每天千万级的请求量处理),日志搜集工具(每天单进程处理10+亿条的日志数据)。同时也收到了很多朋友的开发建议和issue反馈,目前都已经全部解决完善。

GF框架也从beta版本迎来了第一个stable正式版,这是一个伟大的版本。

v1.0.898 stable

新特性

  1. gf-orm 增加 sqlite 数据库类型支持( http://gf.johng.cn/database/orm/database );

  2. 增加 gkafka 模块,对kafka的客户端程序封装,支持分组消费及指定起始位置等特性,并提供简便易用的API接口( http://gf.johng.cn/database/gkafka/index );

  3. 增加 go 语言最新版本的 go modules 特性支持;

  4. 增加 gcron 定时任务模块( http://gf.johng.cn/os/gcron/index );

  5. Web Server 增加路由注册项获取/打印特性,所有的路由注册/回调注册一览无余;

  6. 模板引擎增加全局变量管理,并增加多个常用的内置函数及内置变量( http://gf.johng.cn/os/gview/funcs );

  7. gredis 改进为单例操作方式(基于基层连接池特性),每次操作 redis 服务器时开发者无需显示调用 Close 方法执行关闭( http://gf.johng.cn/database/gredis/index );

  8. gf-orm 增加数据库操作自动 Close 特性(基于底层链接池特性),开发者无需再 defer db.Close() ,并增加 g.DB 数据库对象单例别名( http://gf.johng.cn/database/orm/linkop );

  9. 增加 gvar 通用动态变量模块( http://gf.johng.cn/container/gvar/index );

  10. 数据结构容器增加 并发安全特性开启/关闭功能 ,当关闭后和普通的数据结构无异,且在非并发安全模式下性能会得到提高;

  11. 新增 gmlock 内存锁模块( http://gf.johng.cn/os/gmlock/index );

  12. 增加 gaes 算法模块( http://gf.johng.cn/crypto/gaes/index );

  13. gproc 模块增加执行 shell 命令方法( http://gf.johng.cn/os/gproc/index );

  14. 新增 gfcache 模块,用于带自动缓存更新的文件内容操作(文档待完善);

新功能

  1. glog 增加链式操作方法,增加日志级别管理控制、分类管理、调试管理功能;

  2. g.View 增加分组名称设置,支持通过 g.* 对象管理器获取多个命名的单例模板引擎对象;

  3. glog 增加对文件名称格式的自定义设置,支持 gtime日期格式

  4. gconv 增加 Ints/Uints/Floats/Interfaces 转换方法;

  5. gjson 增加 Append 方法;

  6. gparser 增加 NewUnsafe/Append 方法;

  7. gcache 增加 GetOrSet/GetOrSetFunc/GetOrSetFuncLock 方法;

  8. gset 增加 LockFunc/RLockFunc 方法;

  9. ghttp.Response 方法完善,增加 ParseTpl/ParseTplContent/TplContent 方法, Template 修改为 Tpl 方法;

  10. ghttp.Request 增加获取用户真实IP判断;

  11. Session 增加 Contains 方法;

  12. 完善 ghtml 模块,增加多个方法;

  13. gcache 新增 Contains/SetIfNotExist 方法;

  14. gvalid 增加 Error 对象,用以管理校验错误信息;

  15. gvalid 模块增加 struct tag 的校验规则、自定义错误提示信息绑定的支持特性( http://gf.johng.cn/util/gvalid/index );

  16. ghttp 增加输入参数与 struct绑定机制 ,并增加对应 params 标签支持( http://gf.johng.cn/net/ghttp/service/handler );

  17. ghttp.Request 增加服务端 BasicAuth 功能(文档待完善);

  18. gvalid 增加字段校验别名,用于自定义返回结果字段,并更新WebServer中相关使用的模块;

  19. gf-orm 链式操作增加 ForPage 方法,调整 Chunks 方法;

  20. ghttp 对象路由注册增加 Init&Shut 自动回调方法,增加重复路由注册检测功能;

  21. gfsnotify 增加默认递归 Add/Remove 特性;

  22. ghttp.Response 增加 ServiceFile 方法;

  23. 其他一些新功能;

功能改进

  1. 改进 ghttp.Server 配置管理;

  2. 改进 gcache 底层对象继承关系,改进部分设计细节,提高性能;

  3. 改进 gfpool 文件指针池,修复部分错误,提升性能,并增加基准测试代码;

  4. 改进 gmap 系列并发安全map数据结构,增加多个易用性的方法;

  5. 改进 gconv.Struct 对象转换功能( http://gf.johng.cn/util/gconv/index );

  6. 改进 grand 随机数生成规则,提供了极高的随机数生成性能,并保证每一次调用随机方法时生成的都是不同的随机数值( http://gf.johng.cn/util/grand/index );

  7. 改进 gfile 文件内容操作方法,增加若干常用的文件内容读取方法;

  8. 改进 gtime 模块,并增加时区转换方法;

  9. 改进 COOKIE ,去掉锁机制;

  10. 改进 SESSION 获取方法,新增多个类型获取方法;

  11. 改进 g.DB/g.Config 单例缓存键名;

  12. 改进 gtcp/gudp 超时错误判断机制;

  13. 改进 gtype 底层统一修改为原子操作;

  14. 改进 gvalidstructstring 属性的默认值非必需校验;

  15. 改进 gvalid 在关联规则下的非必需校验;

  16. 改进 gf-orm 在调试模式下日志自动输出功能;

  17. ghttp.Server/gspath 模块静态文件检索改进;

  18. 优化 ghttp.ServerConfig 配置,增加 struct/method``名称到uri 的转换规则,通过 SetNameToUri 方法进行灵活配置( http://gf.johng.cn/net/ghttp/service/object );

  19. 改进 *any/:name 路由匹配规则,支持不带名字的 */: 路由规则;

  20. 修改默认配置文件名称 config.yml ->  config.tomlhttp://gf.johng.cn/os/gcfg/index );

  21. 调整服务注册的 BindControllerMethodBindObjectMethod 逻辑为绑定路由到指定的方法执行;

  22. 改进 garray 二分查找方法,增加安全操作处理;

  23. 改进 gdb.Result/Recorde ToXml 方法,增加可选的 rootTag 参数;

  24. 其他一些改进;

问题修复

  1. 修复 ghttp.Serverwindows 下的重启失效问题;

  2. 修复 ghttp.Server 服务注册与回调注册路由重复判断问题;

  3. 修复 garray 排序数组 Add 变参时的死锁问题;

  4. 修复 gfsnotify 默认递归监控整个 gspath.Add 添加的目录的问题;

  5. 修复 ghttp.BindParams@file 文件上传标识符的转义问题;

  6. 修复 ghttp.Server 日志路径丢失问题;

  7. 修复 多WebServer 下的状态检测问题;

  8. 修复 gvalid 模块 min/max 校验问题;

  9. 修复控制器和执行对象服务注册时绑定'/'路由的问题;

  10. 修复 gvalid.CheckStruct 自定义错误提示失效问题;

  11. ghttp.Server 修复 hookserve 方法的路由影响,并新增跳转方法;

  12. 其他一些修复;

其他改动

  1. 去掉 gfile.IsExecutable 方法;

  2. 目录调整,将 加密/解密 相关的包从 encoding 目录迁移到 crypto 目录下;

  3. 增加 gfsnotify/gfcache 调试信息;

  4. gf-orm 允许写入的键值为 nil 时往数据库中写入 null ;

  5. 统一使用 gview.Params 类型作为模板变量类型;

  6. gconv.MapToStruct 方法名称修改为 gconv.Struct

  7. ghttp.Server 完善重启及停止的终端提示信息;

  8. 完善 gring 模块,增加 约瑟夫问题 代码作为 gring 示例程序;

  9. 其他一些改动;

GF(Go Frame)是一款模块化、松耦合、轻量级、高性能的Go语言Web开发框架。支持热重启、热更新、多域名、多端口、多服务、HTTP/HTTPS、动态路由等特性 ,并提供了Web服务开发的系列核心组件,如:Router、Cookie、Session、服务注册、配置管理、模板引擎、数据校验、分页管理、数据库ORM等等等等, 并且提供了数十个实用开发模块集,如:缓存、日志、时间、命令行、二进制、文件锁、对象池、连接池、数据编码、进程管理、进程通信、TCP/UDP组件、 并发安全容器、Goroutine池等等等等等等。

开源项目地址(仓库保持实时同步): GiteeGithub 。 如有优秀的框架使用案例,欢迎联系作者将地址展示到项目库中,您的牛逼将被世人所瞻仰。

安装

go get -u gitee.com/johng/gf

限制

golang版本 >= 1.9.2

特点

  1. 轻量级、高性能,模块化、松耦合设计,丰富的开发模块;

  2. 热重启、热更新特性,并支持Web界面及命令行管理接口;

  3. 专业的技术交流群,完善的开发文档及示例代码,良好的中文化支持;

  4. 支持多种形式的服务注册特性,强大灵活高效的路由控制管理;

  5. 支持服务事件回调注册功能,可供选择的 pprof 性能分析模块;

  6. 支持配置文件及模板文件的自动检测更新机制,即修改即生效;

  7. 支持自定义日期时间格式的时间模块,类似 PHP 日期时间格式化;

  8. 强大的数据/表单校验模块,支持常用的40种及自定义校验规则;

  9. 强大的网络通信TCP/UDP组件,并提供TCP连接池特性,简便高效;

  10. 提供了对基本数据类型的并发安全封装,提供了常用的数据结构容器;

  11. 支持 Go变量/Json/Xml/Yml/Toml 任意数据格式之间的相互转换及创建;

  12. 强大的数据库 ORM ,支持应用层级的集群管理、读写分离、负载均衡,查询缓存、方法及链式ORM操作;

  13. 更多特点请查阅框架 手册源码

文档

GoFrame开发文档: http://gf.johng.cn

使用

Hello World

package main

import (
    "gitee.com/johng/gf/g"
    "gitee.com/johng/gf/g/net/ghttp"
)

func main() {
    s := g.Server()
    s.BindHandler("/", func(r *ghttp.Request) {
        r.Response.Write("Hello World")
    })
    s.Run()
}

多域名支持

package main

import (
    "gitee.com/johng/gf/g"
    "gitee.com/johng/gf/g/net/ghttp"
)

func main() {
    s := g.Server()
    s.Domain("localhost1,localhost2").BindHandler("/", func(r *ghttp.Request) {
        r.Response.Write("localhostx")
    })
    s.Run()
}

多端口支持

package main

import (
    "gitee.com/johng/gf/g"
    "gitee.com/johng/gf/g/net/ghttp"
)

func main() {
    s := g.Server()
    s.BindHandler("/", func(r *ghttp.Request){
        r.Response.Writeln("go frame!")
    })
    s.SetPort(8080, 8081, 8082)
    s.Run()
}

路由控制

package main

import (
    "gitee.com/johng/gf/g"
    "gitee.com/johng/gf/g/net/ghttp"
)

func main() {
    s := g.Server()
    s.BindHandler("/order/:action/{page}.html", func(r *ghttp.Request){
        r.Response.Writef("action:%s, page:%s", r.Get("action"), r.Get("page"))
    })
    s.SetPort(8199)
    s.Run()
}

数据库ORM

ORM创建/关闭

// 获取默认配置的单例数据库对象(配置名称为"default")
db, err := gdb.DB()
// 获取配置分组名称为"user-center"的单例数据库对象
db, err := gdb.DB("user-center")
// 无须显示Close,数据库引擎底层采用了链接池设计,当链接不再使用时会自动关闭

单表/联表查询

// 查询多条记录并使用Limit分页
r, err := db.Table("user").Where("u.uid > ?", 1).Limit(0, 10).Select()
// 查询符合条件的单条记录(第一条)
r, err := db.Table("user u").LeftJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*,ud.site").Where("u.uid=?", 1).One()
// 查询指定字段值
r, err := db.Table("user u").RightJoin("user_detail ud", "u.uid=ud.uid").Fields("ud.site").Where("u.uid=?", 1).Value()
// 分组及排序
r, err := db.Table("user u").InnerJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*,ud.city").GroupBy("city").OrderBy("register_time asc").Select()
// 不使用john的联表查询
r, err := db.Table("user u,user_detail ud").Where("u.uid=ud.uid").Fields("u.*,ud.city").All()
// 不使用Fields方法指定查询字段时,默认查询为"*"
r, err := db.Table("user").Where("u.uid=1",).One()

更新/删除

// 更新
r, err := db.Table("user").Data(gdb.Map{"name" : "john2"}).Where("name=?", "john").Update()
r, err := db.Table("user").Data("name='john3'").Where("name=?", "john2").Update()
// 删除
r, err := db.Table("user").Where("uid=?", 10).Delete()
// Data数值方法的参数形式比较灵活
r, err := db.Table("user").Data(`name="john"`).Update()
r, err := db.Table("user").Data("name", "john").Update()
r, err := db.Table("user").Data(g.Map{"name" : "john"}).Update()

写入/保存

r, err := db.Table("user").Data(gdb.Map{"name": "john"}).Insert()
r, err := db.Table("user").Data(gdb.Map{"uid": 10000, "name": "john"}).Replace()
r, err := db.Table("user").Data(gdb.Map{"uid": 10001, "name": "john"}).Save()

事务操作

if tx, err := db.Begin(); err == nil {
    if r, err := tx.Table("user").Data(gdb.Map{"uid":1, "name": "john"}).Save(); err == nil {
        tx.Commit()
    } else {
        tx.Rollback()
    }

    fmt.Println(r, err)
}

...

更多特性及示例请查看官方开发文档: gf.johng.c


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Two Scoops of Django

Two Scoops of Django

Daniel Greenfeld、Audrey M. Roy / CreateSpace Independent Publishing Platform / 2013-4-16 / USD 29.95

Two Scoops of Django: Best Practices For Django 1.5 is chock-full of material that will help you with your Django projects. We'll introduce you to various tips, tricks, patterns, code snippets, and......一起来看看 《Two Scoops of Django》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码