GO框架三件套详解| 青训营

89 阅读2分钟

GO框架三件套详解

简单介绍

  • Gorm
    • 迭代了10年+的功能强大的ORM框架,被字节内部广泛使用,并且拥有非常丰富的开源资源
  • Kitex
    • 是字节内部的Golang微服务RPC框架,具有高性能,强可扩展性的主要特点,支持多开协议并且拥有丰富的开源扩展
  • Hertz
    • 是字节内部的HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性,高性能,高扩展性的特点
  • Gorm基础使用
    //定义gorm model
    type Product struct{
            Code string
            Price uint
    }
    //定义表名
    func (p Product)TableName()strng{
        return "product"
    }
    func main(){
        db,err:=gorm.Open(//链接
            mysql.Open("..."),
            &gorm.Config{})
        if err!=nil{...}
        db.Create(&Product{Code:"D42",Price:100})//创建数据
        var pro Product
        db.First(&pro,1)//主键查询
        db.First(&pro,"code = ?","D42")//查找code字段值为D42的记录
        db.Model(&pro).Updata("Price",200)//更新数据
        db.Delete(&pro,1)//删除数据
    }
    
    
      - 部分约定
          - 默认情况下,GORM 约定使用 ID 作为主键,使用结构体名的复数作为表名,字段名作为列名,使用 CreatedAt、UpdatedAt、DeletedAt时间追踪。如果约定与需求不符,可以自定义配置
          - 在 GO 语言中,根据名称的首字母大小写来定义是否可被导出,GORM 使用可导出的字段进行 CRUD 时拥有全部权限,另外,GORM 可以使用标签控制字段级别的权限,可以让一个字段的权限是只读、只写、只创建、只更新和忽略该字段。
          - 标签是模型定义时的可选项,GORM 的标签不区分大小写,推荐使用驼峰式命名。我们会在后续章节中,陆续使用到 GORM 提供的字段标签。
    
    • 支持的数据库
      • MySQL
      • SQLServer
      • PostgreSQL
      • SQLite
      • 可以复用/自行开发驱动来支持更多数据库
    • First使用注意事项
      • 查询不到数据会返回ErrRecordNotFound
      • 使用Find查询多条数据时,查询不到数据不会返回错误
  • Kitex代码生成工具
    • 注意事项:对Windows支持不完善,建议使用虚拟机
    • 定义IDL
    namespace go api
    struct Request{
        1:string message
    }
    struct Response{
        1:string message
    }
    service Echo{
        Response echo(1:Requset req)
    }
    
    • 为什么需要IDL
      • 如果我们要进行RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道值是什么样的.这时候,就需要通过IDL来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样
    • 丰满函数
 func (s *HelloApi) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {
 klog.Info("hello service enter: " + GetIpAddr2())
 
 resp = &api.Response {
  Msg:  &api.Msg {
   Status: 200,
   Code:   10000,
   Msg:    req.Message,
  },
  Data: req.Message,
 }
 return resp, nil
}
 
func GetIpAddr2() string {
 conn, err := net.Dial("udp", "8.8.8.8:53")
 if err != nil {
  klog.Error(err)
  return ""
 }
 localAddr := conn.LocalAddr().(*net.UDPAddr)
 // 192.168.1.20:61085
 ip := strings.Split(localAddr.String(), ":")[0]
 
 return ip
}
  • Hertz路由
    • 提供了参数路由和通配路由,优先级为静态路由大于命名路由大于通配路由
    • 提供参数绑定Bind,Validate,BindAndValidate