Hello,小伙伴久等啦!距离上一次发布,时隔刚好半年,这半年发生了很多很多的事情。薛老的猫以不同的观测方式决定了小猫不同的结果,同样看待世界的不同方式决定了世界在我们眼中的样子。这次给大家带来了最新GoFrame v1.16版本!GoFrame是一款模块化、高性能、企业级的Go基础开发框架:https://goframe.org ,一款低调务实、真正意义的企业级Golang开发框架!本次更新包含了大量的新特性和功能改进,特别是全链路跟踪、ORM模型关联/嵌套事务/子查询/数十项新增方法、HTTP客户端拦截器、数据校验及I18N组件改进、重构版的定时器等等。本次更新内容较多,以下为主要更新介绍,希望大家喜欢!Enjoy!

本次文档有大量更新,目前开发文档总约有20+万字,建议按照官方目录结构进行阅读

重要特性

  1. 框架新增全链路跟踪特性,采用OpenTelementry标准,目前已打通HTTP Client&Server/GRPC Client&Server/ORM/Redis/Logging组件,详细介绍请参考章节:
    1. 链路跟踪-基本示例
    2. 链路跟踪-HTTP示例
    3. 链路跟踪-GRPC示例
  2. 数据库核心组件新增以下特性:
    1.  模型关联
      1. 模型关联-动态关联-ScanList
      2. 模型关联-静态关联-With特性
    2. 嵌套事务ORM事务处理
    3. 子查询特性:ORM查询-子查询特性
    4. 新增数十项个ORM模型操作方法(参考PHP Laravel),正在使用goframe的小伙伴们建议务必看一下:
      1. ORM链式操作(🔥重点🔥)
      2. ORM链式操作-写入保存
      3. ORM链式操作-更新删除
      4. ORM链式操作-数据查询
  3. HTTP客户端增加中间件拦截器功能特性,详情请参考章节:HTTPClient-拦截器/中间件
  4. 数据校验组件大量改进:
    1. 增加链式操作校验对象:数据校验-校验对象
    2. 增加对Context的支持,并改进支持了强大的I18N国际化错误信息管理能力,详情请参考章节:
      1. I18N国际化
      2. 数据校验-自定义错误
    3. 自定义校验规则改进,增加局部校验规则注册特性,增加完整数据校验:数据校验-自定义规则
  5. 定时器组件gtimer的全新重构,去掉TimingWheel的实现,改为了更加稳健的PriorityQueue的改进实现,详情请参考章节:定时器-gtimer
  6. 框架核心基础组件已增加全错误堆栈特性。当错误产生时可以完整获取链路相关组件的错误堆栈信息。该特性只有一款基础组件相对完善并且统一设计的开发框架才能具备。

功能改进

  1. ORM
    1. 增加全链路的链路跟踪上下文Context参数传递:ORM上下文变量 链路跟踪中默认会记录SQL以及数据库连接信息(不包含敏感配置),组件链路跟踪信息可配置关闭。
    2. 进一步完善ORM组件日志记录,日志仅在调试模式下有效,详细介绍请参考章节:ORM高级特性
    3. 新增数十项ORM模型操作方法(参考PHP Laravel),例如:InsertAndGetIdMin/Max/Avg/SumIncrement/DecrementWhereBetween/WhereLike/WhereIn/WhereNullOrderAsc/OrderDesc/OrderRandom 等等。正在使用goframe的小伙伴们建议务必看一下,详情请参考章节:
      1. ORM链式操作(🔥重点🔥)
      2. ORM链式操作-写入保存
      3. ORM链式操作-更新删除
      4. ORM链式操作-数据查询
    4. 新版本开始,数据库ORM链式操作默认启用了字段过滤特性,当给定的参数无法与数据表字段智能匹配时将会被自动过滤,详情请参考章节:ORM链式操作-字段过滤
    5. 改进pgsql数据库类型int8Golang类型的转换,从int类型调整为了int64
    6. 大量重构、改进工作,细节比较多,这里不再一一赘述。关键结果是组件功能更加丰富、代码更加严谨、设计更加简洁、使用更加便捷。
  2. HTTP
    1. HTTP Client增加中间件拦截器功能特性:HTTPClient-拦截器/中间件
    2. HTTP Client&Server增加链路跟踪支持:链路跟踪-HTTP示例
    3. ghttp包中的客户端请求方法标记废除,后续统一采用HTTP Client对象方式使用。
    4. 改进Request.Parse方法的数据校验,直接校验提交参数,而不是校验数据转换后的struct对象:请求输入-请求校验
    5. 增加WrapF/WrapH方法,用于将标准库的http.HandlerFunc/http.Handler转换为ghttp.Server支持的服务方法类型。
    6. 其他大量改进工作,细节也很多。关键结果就是组件功能更加丰富、代码更加严谨、使用更加便捷。
  3. gvalid
    1. Check方法名称修改为了CheckValue,详情请参考章节:数据校验-单数据校验
    2. 新增CheckStructWithData方法,用于校验指定参数的struct对象:数据校验-Struct校验
    3. 新增Validator校验对象,用于便捷的链式操作,并可在后期进行进一步扩展:数据校验-校验对象
    4. 自定义的规则方法定义增加了Context上下文变量输入,并增加RuleFuncRuleFuncMap局部校验规则注册方法:数据校验-自定义规则
    5. 左右校验方法增加了Context参数支持,并改进支持了强大的I18N国际化错误信息管理能力:
      1. I18N国际化
      2. 数据校验-自定义错误
    6. Error错误对象修改为了接口实现,需要注意之前使用*Error指针方式的地方会报错。
    7. 其他一些细节改进。
  4. gcache
    1. 增加Ctx链式操作方法,用于上下文参数输入,详情请参考章节:缓存管理
    2. Adapter接口增加Context参数输入,便于上下文参数传递,并改进相关内置实现的适配器支持上下文参数传递:缓存管理-接口设计
  5. gredis
    1. 增加了对链路跟踪的支持,详情请参考章节:Redis-Context
  6. gjson
    1. Option类型名称修改为了Options,这是一项非兼容性更新。
    2. NewWithOption方法名称修改为了NewWithOptions
  7. gcmd
    1. 新增GetOptWithEnv方法,并将GetWithEnv方法标记废弃。
  8. glog
    1. 增加基于OpenTelemetry标准的链路跟踪支持:日志组件-Context
  9. gproc
    1. 增加统一的信号注册监听回调特性:进程管理-信号监听
  10. gres
    1. 资源管理的最佳实践参考:资源管理-最佳实践
  11. gtimer
    1. 定时器组件gtimer的全新重构,去掉TimingWheel的实现,改为了更加稳健的PriorityQueue的改进实现,详情请参考章节:定时器-gtimer
  12. gview
    1. 所有模板解析方法增加了Context参数输入:模板引擎
  13. gconv
    1. 改进Scan方法,增加对Map/Maps参数类型的自动转换支持:类型转换-Scan转换
  14. gi18n
    1. I18N国际化组件增加对Context的支持,详情请参考章节:I18N国际化
    2. 注意,所有方法都增加了ctx参数的输入,并去掉了部分方法的language参数,转而由ctx参数来控制language输入,并提高可扩展性:I18N国际化-使用介绍
    3. 去掉了TranslateFormatLangTfl方法。
  15. gmeta
    1. 新增gmeta元数据包,详情请参考章节:元数据-gmeta
  16. 各个组件的其他一些细节改进,不用特意在发布文档中阐述。

开发工具链

CLI工具有更新,主要是简化了dao模型代码生成,去掉了重复方法生成,去掉了直接返回模型对象的相关方法,dao对象修改为了直接继承GoFrame ORM组件中的Model对象,通过给定模型接受查询数据,因此部分方法使用的方式会需要调整。







Content Menu

  • No labels

7 Comments

  1. 因此部分方法使用的方式会需要调整。 是不是原来 XxxDao.Ctx(ctx)改成 XxxDao.M.Ctx(ctx)  ?

    1. 如果使用最新版本CLI生成的dao&model代码,直接dao.XXX.Ctx(ctx)即可。当然这个和dao.XXX.M.Ctx(ctx)是一样的。

  2. 16和15两个版本的差异点有哪些?

  3. 最新的版本的结构体校验似乎有些问题,校验经常不通过

  4. 1.16版本的开发工具链生成model.go文件的时候有个问题,如果我的 gfcli.gen.dao配置有多个,比如

    [gfcli]
        [[gfcli.gen.dao]]
        link = "mysql:root:123456@tcp(127.0.0.1:3306)/test1"
        group = "test1"
        jsonCase = "Snake"
    [[gfcli.gen.dao]]
        link = "mysql:root:123456@tcp(127.0.0.1:3306)/test2"
        group = "test2"
        jsonCase = "Snake"

    那么test2生成的model.go文件会覆盖test1生成的model.go文件,这样就会有很大的困扰了。这点希望能改进下!

    1. 你现在解决了吗?我也遇到这个设置多个gfcli.gen.dao的问题。最终只能在model里看到一个配置的模型下。另外一个会被覆盖。

      1. Fengliang Li yakxi 看下命令帮助或者文档数据规范-gen dao,看下path或者modelFile参数说明。