Go框架三件套详解(Web/RPC/ORM)| 青训营笔记

133 阅读4分钟

这是我参与「第五届青训营 」笔记创作活动的第2天

前言

在学习前了解到:

1.Web框架(WEC):

  • Echo: Echo是一个高性能、简单易用的Web框架。它支持路由、中间件、模板引擎等功能,并且具有良好的扩展性。
  • Gin: Gin是一个类似于Martini的Web框架,它提供了一个简洁的API,支持路由、中间件、模板引擎等功能。
  • Revel: Revel是一个全功能的Web框架,支持路由、中间件、模板引擎等功能,并且具有良好的文档和社区支持。

2.RPC框架(RPC):

  • gRPC: gRPC是一个高性能、开源的RPC框架,支持多种语言,并提供了丰富的特性,如流式传输、健康检查、负载均衡等。
  • Thrift: Thrift是一个跨语言的RPC框架,支持多种语言,并提供了丰富的特性,如序列化、多路复用、协议压缩等。
  • Go-Micro: Go-Micro 是一个开源的微服务工具套件, 提供了RPC, 服务发现, 负载均衡, 消息队列等功能。

3.ORM框架(ORM):

  • Gorm: Gorm 是一个简单而强大的 ORM 框架,支持多种数据库类型,支持链式操作。
  • Xorm: Xorm 是一个简单而高效的 ORM 框架,支持多种数

今天主要学习了: Gorm的基础使用,Kitex的基础使用,Hertz的基础使用

1、gorm的基础使用

  • 安装: go get -u github.com/jinzhu/gorm
  • 导入: import "github.com/jinzhu/gorm"
  • 初始化:
Copy code    db, err := gorm.Open("mysql", "username:password@/dbname?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic("连接数据库失败")
    }
    defer db.Close()
  • GORM目前支持的数据库:MySQL、sQLServer、 PostgreSQL、 SQLite

    import (
    ' gorm. io/driver/sqlserver"
    "gorm. io/ gorm"
    连接SQLServer数据库为例
    )
    
    import (
    ' gorm. io/driver/sqlserver"
    "gorm. io/ gorm"
    连接SQLServer数据库为例
    )
    // github . com/deni senkom/ go-mssqldb
    dsn := "sqlserver://gorm: LoremIpsum86@localhost:9930?database=gorm"
    db, err := gorm. Open(sqlserver . Open(dsn), &gorm. Config{})
    

    通过驱动来连接数据库,如果需要连接其它类型的数据库,可以复用/自行开发驱动。

  • 创建表:

Copy code    type User struct {
        gorm.Model
        Name string
        Age int
    }
    db.AutoMigrate(&User{})
  • 增加数据:
Copy code    user := User{Name: "John", Age: 22}
    db.Create(&user)
  • 查询数据:
Copy code    var users []User
    db.Find(&users)
  • 更新数据:
Copy code    var user User
    db.First(&user, 1)
    user.Name = "Jack"
    db.Save(&user)
  • 删除数据:
Copy code    var user User
    db.First(&user, 1)
    db.Delete(&user)

gorm 的性能提高


db, err := gorm . OpenCmysql. Open( dsn: "username : password@tcp(Localhost : 9910)/database?charset=utf8"),
&gorm. Config{
SkipDefaultTransaction: true, //关闭默认事务
PrepareStmt :
true}, // 缓存预编译语句
)
iferr!=nil{
panic( V: "failed to connect database")

对于写操作(创建、更新、删除),为 了确保数据的完整性,GORM会将它们封装在事务内运行。 但这会降低性能,我们可以使用SkipDefaultTransaction关闭默认事务。 使用PrepareStmt缓存预编译语句可以提高后续调用的速度,本机测试提高大约35 %左右。

2、Kitex的基础使用

定义IDL


namespace go api
struct Request {
1: string message
}
struct Response {
1: string message
}
service Echo {
Response echo(1: Request req)
}

Kitex生态

XDS扩展https://github .com/kitex -contrib/xds
opentelemetry扩展github.com/kitex- contrib/obs opentelemetry
ETCD服务注册与发现扩展github.com/kitex-contr…
Nacos服务注册与发现打展htptp:/github.com/kitex- contrib/registry-nacos
Zookeeper服务注册与发现扩展github.com/kitex- contrib/registry-zookeeper
polaris扩展https://github .com/kitex contrib/polaris
丰富的示例代码与业务Demohtptp://github.com/cloudwego/kitex examples/

3、Hertz的基础使用

(1) Hertz路由:

Hertz提供了GET、POST、 PUT、DELETE、 ANY等方法用于注册路由。

I func RegisterRoute(h *server . Hertz) {
h. GET( relativePath: "/get", func(ctx context.Context, c *app . RequestContext) {
c. String(consts . StatusOK,format: "get")
}
h. POST( relativePath: "/post", func(ctx context.Context, c *app . RequestContext) {
c. String(consts . Status0K,format: "post" )
}
h. PUT( relativePath: "/put", func (ctx context . Context, c *app . RequestContext) {
c. String(consts. Status0K,format: "put")
})
h. DELETE( relativePath: " /delete"func(ctx context. Context, c *app . RequestContext) {
c.String(consts . StatusOK,format: "deLete")
})
h. PATCH( relativePath: "/patch", func (ctx context . Context, c *app . RequestContext) {
c. String(consts . StatusOK,format: "patch" )
}
h. HEAD( relativePath: " /head", func (ctx context . Context, c *app . RequestContext) {
c. String(consts . Status0K,format: "head")
}
h. OPTIONS( relativePath: "/options", func(ctx context. Context, c *app. RequestContext) {
c. String(consts . Status0K,format: " options" )

Hertz提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由。

Hertz提供了路由组( Group )的能力,用于支持路由分组的功能

Hertz提供了参数路由和通配路由,路由的优先级为:静态路由>命名路由>通配路由

(2) Hertz代码生成工具

目录结构:

image.png

(3)Hertz生态
HTTP2扩展https://github. .com/hertz-contrib/http2
opentelemetry扩展htps://github.com/hertz contrib/obs -opentelemetry
国际化扩展github.com/hertz contrib/i18n
反向代理扩展htts://github. com/hertz contriblreverseproxy
JWT鉴权扩展https://github. com/hertz -contrib/jwt
Websocket扩展https://github .com/hertz -contrib/websocket
丰富的示例代码与业Demogithub.com/cloudwego/h… examples/