大家好啊!本次版本是2022年最后一个版本,也是2023年的第一个版本。该版本主要的目标:

  • 采用接口化设计解决了主框架对第三方开源组件go-redis耦合的问题,使得主框架更加轻量,对工具化使用框架的场景更加友好。
  • 通过开发工具提供升级 主框架、社区组件、开发工具 的命令,提高框架整体易用性,并解决常见的社区组件与主框架版本不一致问题。
  • 进一步按照接口与实现分离设计,通过社区组件方式,完善注册发现、配置管理对常用服务的对接,为下一步发布微服务组件做准备。

完整变更列表:https://github.com/gogf/gf/compare/v2.2.0…v2.3.1

新特性

  1. 将耦合较重的redis组件从主框架中解耦,作为社区组件提供。原有主框架增加redis接口定义,社区组件redis提供具体的接口实现。因此,请注意,主框架gredis组件的使用方式发生了一些变更,在依赖redis的项目中需要引入社区组件redis实现,否则方法执行将会返回错误。保留兼容原有基础的Do/DoVar方法,并增加了100+项常用redis操作方法:NoSQL Redis
  2. 配置管理及注册发现组件新增常用服务接口实现:
  3. 新增工具命令gf up,用于便捷的框架升级操作,具体介绍请查看:框架升级-up

功能改进

社区组件

配置管理

  1. 新增nacos接口实现:https://github.com/gogf/gf/tree/master/contrib/config/nacos

注册发现

  1. 新增zookeeper接口实现:https://github.com/gogf/gf/tree/master/contrib/registry/zookeeper

数据库驱动

  1. 修复clickhouse在配置Charset参数时的报错问题。
  2. 改进clickhouse获取数据表结构结果,返回的Index顺序统一从0开始。
  3. 改进oracle表结构获取SQL,以支持float64数据类型。
  4. 修复pgsql对接口CheckLocalTypeForField的实现,名称被错误定义为了CheckLocalTypeForValue,造成生成dao代码文件时的属性字段类型错误。
  5. 改进pgsql增加对schema的支持,由于shcema在大部分数据库服务中代表”数据库名称”,并且也为了兼容旧版本,因此增加Namespace配置参数用以表示pgsqlSchema,而原有的Schema对象代表pgsqlcatalog

NoSQL组件

  1. 新增redis社区组件,实现gredis相关接口:https://github.com/gogf/gf/tree/master/contrib/nosql/redis

数据库组件

  1. gdb
    1. 为提高扩展性,TX事务对象改为了接口定义,原有的TX对象改为了TXCore方便自定义接口实现对象的嵌套:ORM事务处理
    2. 增加Namespce配置项,用以支持个别数据库服务Catalog&Schema区分的问题,原有的Schema继续代表数据库名称,而新增的NameSpace代表个别数据库服务的Schema配置:ORM使用配置
    3. 改进数据库名称配置,增加对中文数据库名称的支持。
    4. 执行SQL日志中增加当前执行的数据库名称打印。
    5. 修复Count方法的缓存问题。
  2. gredis
    1. 新增redis社区组件,将耦合较重的redis组件从主框架中解耦,作为社区组件提供。原有主框架增加redis接口定义,而社区组件redis提供具体的接口实现。因此,请注意,主框架gredis组件的使用方式发生了一些变更,在依赖redis的项目中需要引入社区组件redis实现,否则方法执行将会返回错误。保留兼容原有的Do/DoVar方法,并增加了100+项常用redis操作方法:NoSQL Redis

容器组件

  1. gpool
    1. 增加MustPut方法,在Put执行出错时直接panic而不是返回错误对象
  2. gqueue
    1. 改进Len/Size方法,解决可能存在的队列计数不准确问题。
    2. 改进Len/Size方法,返回参数类型由int改为int64

错误处理

  1. gcode
    1. 增加CodeNecessaryPackageNotImport错误码。
  2. gerror
    1. 改进堆栈打印,统一使用空格替代\t,以保证打印格式兼容不同的展示终端。

对象管理

  1. gins
    1. 单例对象增加分组锁机制,提升在高并发下的锁机制性能。

网络组件

  1. ghttp
    1. 支持在中间件中增加对当前执行路由方法的获取。
    2. 当路由方法执行的结果不为200时,支持在中间件中通过Request.GetError方法获取内部错误。
    3. 新增Response.ServeContent方法,用于自定义的内容输出接口实现。
    4. 改进反向代理支持,并增加反向代理示例:https://github.com/gogf/gf/blob/master/example/httpserver/proxy/main.go
    5. 改进错误日志输出,使用error错误级别,便于开发者在自定义日志Handler中识别日志类型。
  2. goai
    1. 新增对security标签的支持,用以配置OpenAPIv3安全密钥。
    2. 改进对带有json标签带有,符号时结构体属性的名称获取。
  3. gtcp
    1. SetSendDeadline方法名称修改为SetDeadlineSend
    2. SetReceiveDeadline方法名称修改为SetDeadlineRecv
    3. SetReceiveBufferWait方法名称修改为SetBufferWaitRecv
  4. gudp
    1. SetSendDeadline方法名称修改为SetDeadlineSend
    2. SetReceiveDeadline方法名称修改为SetDeadlineRecv
    3. SetReceiveBufferWait方法名称修改为SetBufferWaitRecv

系统组件

  1. gcache
    1. 修复MustGetOrSetFunc方法逻辑问题。
    2. 改进LRU缓存过期回收机制实现。
  2. gcmd
    1. 改进结构化命令行对象生成,当brief标签为空时,自动读取dc标签内容作为brief,以保证命令行与接口定义标签习惯相同。
  3. gcron
    1. 改进日志处理,当给定的定时任务方法执行panic并且开发者没有设置Logger接口时,将会使用glog.DefaultLogger输出错误日志。
    2. 改进定时触发判断逻辑,解决在底层定时器执行间隔不准确时引起的定时任务触发问题。
  4. glog
    1. 改进在滚动切分特性开启时的初始化逻辑,解决在个别场景下的初始化失败导致滚动切分执行失败问题。
    2. 改进Clone方法,进一步浅拷贝提高链式操作性能。
    3. 新增LevelPrint配置,用以控制默认日志Handler是否打印日志级别字符串。
  5. gres
    1. 新增Pack*WithOption方法,用以提供更细致的资源打包选项控制。
    2. 标记方法废弃:Pack/PackToFile/PackToGoFile
    3. 新增KeepPath打包选项,用以控制是否在打包文件中保留给定的相对路径,而不是使用带有本地打包目录前缀的路径(相当于去掉了目录前缀)。
  6. grpool
    1. 新增supervisor特性,解决在worker数量较少的场景下,低概率下同时退出的问题。
  7. gstructs
    1. 新增Tag*方法,用以获取常见的标签值。
  8. gtime
    1. 改进Equal/After/Sub方法,解决在个别场景下的细节问题。
    2. 改进EndOf*方法,返回的时间对象由开发者控制EndOf计算的粒度。调整默认粒度,由纳秒改为秒粒度进行计算。
    3. 改进SetTimeZone时区设置方法,以实现不同系统下的兼容性,该方法只允许全局设置一次时区,多次调用设置不同时区将会返回错误:时间管理-时区设置

文本处理

  1. gstr
    1. 修复IsSubDomain判断主域名为子域名的子域名问题。
    2. 改进SubStr/SubStrRune方法,支持以负数的start参数指定从右截取字符串。

工具组件

  1. gconv
    1. 新增Ptr*方法,用以任意类型到指定类型指针变量的转换。
    2. 改进Map*转换方法对递归转换的处理,默认只会递归转换嵌套的结构体属性。
    3. 改进Scan方法,解决属性同类型以及同类型指针到目标对象/指针的转换问题。
  2. gtag
    1. 将框架中所有的标签名称统一到该模块下通过常量维护。
    2. 增加SetOver/SetsOver方法,用于覆盖设置自定义的标签键值对。
  3. gutil
    1. 改进Dump*方法,支持循环嵌套的对象指针打印。
    2. 修复Dump*方法在部分场景下的反射报错问题。
    3. 新增OriginValueAndKind/OriginTypeAndKind方法,用于获取给定变量的反射值/类型对象,以及在指针变量下对应的原始反射值/类型对象。

功能修复

  1. 修复工具在部分环境下安装失败问题。
  2. 修复New*ArrayRange方法创建数组对象时,在部分场景下数组越界问题。
  3. 修复contrib/drivers/clickhouse在配置Charset参数时的报错问题。
  4. 修复pgsql数据库生成dao代码文件时的属性字段类型错误问题。
  5. 修复数据库ORM组件中Count方法的缓存问题。
  6. 修复gstr.IsSubDomain判断主域名为子域名的子域名问题。
  7. 修复gutil.Dump*方法在部分场景下的反射报错问题。

开发工具

  1. 增加gf fix命令,用于低版本升级高版本自动更新本地代码不兼容变更:兼容修复-fix
  2. 增加gf up命令,用以将本地的框架低版本升级到最新的框架版本:框架升级-up
  3. 改进gf build命令,在构建之前增加环境变量信息打印。
  4. 改进gf pack命令,增加KeepPath参数,用以控制资源打包后是否保留相对路径:资源打包-pack
  5. 改进gf gen dao命令,生成的Transaction方法中tx参数从对象指针改为了接口。

兼容提示

  1. Redis的使用方式发生变更,旧版方法保持兼容,但需要额外添加社区组件的引入(接口与实现分离),具体请查看文档。
  2. 数据库ORMTX对象从具体实现改为了接口,这块通过开发工具新增的up或者fix命令即可自动升级修复。

下一版本目标

  • 完善并发布grpcx社区组件,实现对grpc接口协议的扩展支持,并提高微服务开发易用性。
  • 官网新增【微服务开发】系列章节,主要以grpc开发为主介绍使用goframe进行微服务开发。
  • 主框架去掉对第三方开源组件gorilla/websocket的耦合,将WebSocket的支持接口化,按照框架的通用解耦设计,通过社区组件提供具体实现,提供扩展性和灵活性。