GO框架三件套详解
简单介绍
- Gorm
- 迭代了10年+的功能强大的ORM框架,被字节内部广泛使用,并且拥有非常丰富的开源资源
- Kitex
- 是字节内部的Golang微服务RPC框架,具有高性能,强可扩展性的主要特点,支持多开协议并且拥有丰富的开源扩展
- Hertz
- 是字节内部的HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的需求,具有高易用性,高性能,高扩展性的特点
- Gorm基础使用
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")
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)
ip := strings.Split(localAddr.String(), ":")[0]
return ip
}
- Hertz路由
- 提供了参数路由和通配路由,优先级为静态路由大于命名路由大于通配路由
- 提供参数绑定Bind,Validate,BindAndValidate