框架三件套Gorm、Kitex、Hertz | 青训营;

257 阅读10分钟

框架三件套

1.介绍

1.1 gorm

Gorm 是一个已经迭代了10年+的功能强大的 ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。

1.2 kitex

Kitex 是字节内部的Golang 微服务 RPC 框架,具有高性能、强可扩展的主要特点,支持多协议并且拥有丰富的开源扩展

1.3 hertz

Hertz 是字节内部的 HTTP框架,参考了其他开源框架的优势,结合字节跳动内部的求,具有高易用性、高性能、高扩展性特点

2.基础使用

2.1 gorm的基本使用

当使用GORM(Go Object-Relational Mapping)库来处理数据库操作时,以下是一些基本用法和步骤。GORM是Go语言中一个流行的ORM库,用于简化数据库操作。

  1. 安装GORM:首先,确保已经在你的项目中安装了GORM库。你可以使用下面的命令来安装:

     go get -u github.com/go-gorm/gorm
    
  2. 创建数据库连接:使用GORM,你需要创建一个数据库连接。你可以使用以下代码示例来创建一个连接:

     import (
         "gorm.io/gorm"
         "gorm.io/driver/sqlite" // 或者其他数据库驱动
     )
     ​
     db, err := gorm.Open(sqlite.Open("mydb.db"), &gorm.Config{})
     if err != nil {
         panic("Failed to connect to database")
     }
     defer db.Close()
    
  3. 定义模型:在GORM中,你需要定义一个结构体来表示数据库表格,这被称为模型。例如,如果你要表示一个用户表,你可以这样做:

     type User struct {
         gorm.Model
         Username string
         Email    string
     }
    
  4. 迁移:GORM支持自动迁移功能,用于创建或更新数据库表格以匹配模型的定义。你可以使用以下代码来进行迁移:

     db.AutoMigrate(&User{})
    
  5. CRUD操作:GORM使得CRUD操作变得简单。以下是一些基本示例:

    • 创建记录

       user := User{Username: "john_doe", Email: "john@example.com"}
       db.Create(&user)
      
    • 查询记录

       var user User
       db.First(&user, 1) // 根据主键查询第一条记录
       db.Where("username = ?", "john_doe").First(&user) // 使用条件查询
      
    • 更新记录

       db.Model(&user).Update("Email", "new_email@example.com")
      
    • 删除记录

       db.Delete(&user)
      
  6. 高级查询:GORM支持更复杂的查询,例如联接、条件组合和排序等。你可以查阅官方文档来了解更多详情。

2.2 gorm生态

GORM在Go语言生态系统中有许多相关工具和插件,这些工具可以与GORM结合使用,扩展其功能并提供更多便利。以下是一些与GORM相关的生态组件和库:

  1. GORM Plugins:GORM自身提供了一些插件,可以增强其功能。例如,gorm.io/plugin/soft_delete插件可以为软删除提供支持,gorm.io/plugin/audit插件可以实现审计功能。
  2. GORM Hooks:你可以使用GORM的Hooks来在不同的操作阶段插入自定义逻辑。这些Hooks可以帮助你在保存、更新、删除等操作之前或之后执行特定的代码。
  3. GORM Logger:GORM允许你配置日志记录,可以帮助你追踪数据库操作并进行故障排除。你可以使用不同的日志记录器,如标准输出、文件或自定义记录器。
  4. GORM Migrations:除了自动迁移外,GORM还支持手动管理数据库迁移。你可以使用gorm.io/gorm/cmd/migrate命令行工具执行数据库迁移操作。
  5. GORM Extensions:GORM社区中有一些扩展库,它们构建在GORM之上,提供了额外的功能。例如,gorm.io/datatypes提供了支持JSON、XML等数据类型的能力。
  6. GORM Utilities:有一些工具库可以帮助你更轻松地使用GORM。例如,gorm.io/driver目录下提供了不同数据库的驱动程序,gorm.io/gen提供了生成GORM模型代码的工具。
  7. Third-party Packages:除了官方提供的库和工具,社区中还有一些第三方的包,可以进一步扩展GORM的功能,如支持缓存、自动生成API等。
  8. Swagger Integration:一些库可以帮助你将GORM模型集成到Swagger文档中,以便生成API文档和测试。

2.3 kitex代码生成工具

Kitex 目前对 Windows 的支持不完善,如果本地开发环境是 Windows 的同学建议使用虚拟机或 WSL2 安装代码生成工具

  • go install github.com/cloudwego/kitex/tool/cmd/kitex @ latest
  • go install githubcom/cloudwego/thriftgo@latest

Kitex 是一款面向性能优化的 Go 语言微服务框架,它提供了代码生成工具来简化服务接口的定义和实现。下面是关于 Kitex 代码生成工具的基本使用步骤:

  1. 安装 Kitex 以及代码生成工具:首先,确保你已经安装了 Go,并设置好了环境变量。然后,使用以下命令安装 Kitex 和代码生成工具:

     bash复制代码go get -u github.com/cloudwego/kitex
    
  2. 定义服务接口:创建一个包含服务接口定义的 .thrift 文件。这个文件描述了你的服务的接口和数据结构。示例 .thrift 文件内容如下:

     thrift复制代码namespace go kitex.example
     ​
     service HelloService {
         string Hello(1: string name)
     }
    
  3. 生成代码:使用 Kitex 提供的代码生成工具来生成服务接口的 Go 代码。在命令行中执行以下命令:

     bash复制代码kitex -t thrift --source [thrift文件目录] --dest [生成代码的目标目录]
    

    替换 [thrift文件目录] 为包含你的 .thrift 文件的目录,[生成代码的目标目录] 为你想要生成代码的目标目录。

  4. 实现服务:生成的代码包括服务接口的定义以及基本的实现骨架。你需要在生成的代码基础上实现服务逻辑。

  5. 启动服务:根据你的实现,使用 Kitex 提供的服务器代码启动服务。这可以是 HTTP、GRPC 等不同类型的服务器。以下是一个简单的示例:

     go复制代码package main
     ​
     import (
         "github.com/cloudwego/kitex/server"
         "github.com/cloudwego/kitex/transport"
         "github.com/cloudwego/kitex/transport/grpc"
         "github.com/cloudwego/kitex/transport/http"
         "your/generated/code/package" // 导入生成的代码包
     )
     ​
     func main() {
         ep := server.NewEndpoint(
             // 初始化你的服务实现
             server.WithService(NewYourServiceImplementation()),
         )
     ​
         // 创建服务器
         var server transport.Server
         switch {
         case flagUseHTTP:
             server = http.NewServer(ep)
         case flagUseGRPC:
             server = grpc.NewServer(ep)
         default:
             // 默认服务器类型
         }
     ​
         // 启动服务器
         err := server.Run()
         if err != nil {
             panic(err)
         }
     }
    

2.4 Kitex 服务注册与发现

Kitex 并没有内置服务注册与发现的功能,但它提供了一些灵活的扩展点,使你可以与不同的服务注册与发现系统集成。通常,你可以使用类似 Consul、etcd、ZooKeeper 或者 Kubernetes 这样的服务注册与发现系统来管理微服务的服务实例。以下是一个使用 Consul 作为示例的集成过程:

  1. 引入 Consul 客户端库:首先,你需要在你的项目中引入 Consul 的 Go 客户端库,以便与 Consul 进行通信。你可以使用以下命令来获取 Consul 客户端库:

     go get github.com/hashicorp/consul/api
    
  2. 服务注册:在你的 Kitex 服务启动时,使用 Consul 客户端库将服务实例注册到 Consul:

     package main
     ​
     import (
         "github.com/hashicorp/consul/api"
         "github.com/cloudwego/kitex/server"
         "github.com/cloudwego/kitex/transport"
         "github.com/cloudwego/kitex/transport/http"
         "your/generated/code/package"
     )
     ​
     func main() {
         // 初始化 Consul 客户端
         consulConfig := api.DefaultConfig()
         consulClient, err := api.NewClient(consulConfig)
         if err != nil {
             panic(err)
         }
     ​
         // 初始化 Kitex 服务
         ep := server.NewEndpoint(
             server.WithService(NewYourServiceImplementation()),
         )
     ​
         // 创建服务器
         server := http.NewServer(ep)
     ​
         // 启动服务器
         go server.Run()
     ​
         // 注册服务到 Consul
         registration := &api.AgentServiceRegistration{
             Name: "your-service-name",
             Port: yourServicePort,
         }
         err = consulClient.Agent().ServiceRegister(registration)
         if err != nil {
             panic(err)
         }
     ​
         // 在这里可以加入优雅关闭的逻辑
     }
    
  3. 服务发现:在你的其他服务中,你可以使用 Consul 客户端库来从 Consul 获取服务实例的信息,然后使用这些信息来调用远程服务。

     package main
     ​
     import (
         "github.com/hashicorp/consul/api"
     )
     ​
     func main() {
         // 初始化 Consul 客户端
         consulConfig := api.DefaultConfig()
         consulClient, err := api.NewClient(consulConfig)
         if err != nil {
             panic(err)
         }
     ​
         // 获取服务实例信息
         serviceName := "your-service-name"
         services, _, err := consulClient.Catalog().Service(serviceName, "", nil)
         if err != nil {
             panic(err)
         }
     ​
         // 选择一个服务实例并调用
         if len(services) > 0 {
             service := services[0]
             remoteAddress := fmt.Sprintf("%s:%d", service.ServiceAddress, service.ServicePort)
             // 使用远程地址调用服务
         }
     }
    

2.5 hertz的基本使用

Hertz框架是一个基于Go语言的轻量级Web框架,用于构建高性能的Web应用程序。下面是Hertz框架的基本使用步骤:

  1. 首先,你需要使用Go语言的包管理工具(如Go Modules)初始化一个新的项目。创建一个新的文件夹,并在终端中运行命令go mod init <项目名>初始化项目。

  2. 在项目文件夹中,创建一个主文件(如main.go),并导入Hertz框架的包:

     import "github.com/labstack/echo/v4"
    
  3. 在主文件中,创建一个新的Echo实例:

     e := echo.New()
    
  4. 定义请求处理函数,可以使用Hertz框架提供的路由和中间件功能。例如,创建一个处理GET请求的路由:

     e.GET("/", func(c echo.Context) error {
         return c.String(http.StatusOK, "Hello, Hertz!") // 响应一条简单的字符串
     })
    
  5. 启动服务器,监听指定的端口:

     e.Start(":8000")
    
  6. 最后,在终端中运行命令go run main.go启动应用程序。

2.6 hertz代码生成工具hz

Hz是Hertz框架的一个代码生成工具,它可以帮助你快速生成基础的代码结构和模板,加速应用程序开发过程。下面是使用Hz生成代码的基本步骤:

  1. 确保你已经按照前面提到的步骤安装了Hertz框架,并且在终端中可以运行hz命令。

  2. 在终端中进入你的项目文件夹,并运行命令hz init来初始化Hz配置文件:

     hz init
    
  3. 在初始化过程中,你会被要求提供一些基本的应用程序信息,如应用程序名称、模块名称等。按照提示填写相关信息。

  4. 一旦初始化完成,你可以使用hz命令来生成代码。例如,你可以使用以下命令生成一个简单的处理函数:

     hz generate handler hello
    

    这将在 handlers 文件夹下生成一个名为 hello.go 的处理函数文件,其中包含一个名为 HelloHandler 的处理函数。

  5. 你还可以使用hz命令来生成其他类型的代码,如路由、中间件、模型等。只需提供适当的命令参数即可。

    • 例如,使用以下命令生成一个名为 users 的控制器文件和一个名为 user 的模型文件:

       hz generate controller users
       hz generate model user
      
  6. 生成的代码文件会自动放置在与配置文件中设置的路径相对应的目录中。你可以根据需要进行进一步的自定义和修改。

这样,通过使用Hz代码生成工具,你可以快速生成常见的代码结构和模板,减少手动编写重复代码的工作量,加快应用程序的开发速度。记得查阅Hz的文档以获取更多关于代码生成的详细信息。

2.7 hertz的生态

Hertz框架拥有一个强大的生态系统,有许多与其兼容的库和工具,可以帮助你构建更加高效、稳定和可扩展的应用程序。以下是Hertz框架的生态系统的一些要点:

  1. Echo:Hertz框架构建在Echo框架之上。Echo是一个快速、简单和轻量级的Web框架,提供了强大的路由和中间件功能。
  2. Middleware:Hertz框架支持各种中间件,用于实现常见的功能,如日志记录、错误处理、身份验证、会话管理等。你可以在Hertz的文档中找到一些常用的中间件和它们的使用方法。
  3. 数据库支持:Hertz框架与许多流行的数据库兼容,包括MySQL、PostgreSQL和SQLite等。你可以使用适当的数据库驱动程序和ORM库(如GORM)来进行数据库操作。
  4. 模板引擎:Hertz框架支持多种模板引擎,如HTML/Go模板、Pug(以前称为Jade)和Mustache等。你可以根据项目需要选择最适合的模板引擎。
  5. 身份验证和授权:Hertz框架与常用的身份验证和授权库兼容,如OAuth和JWT等。这些库可以帮助你实现用户认证和授权功能。
  6. 测试工具:Hertz框架支持多种测试工具和模拟库,如GoConvey和Testify。这些工具可以帮助你编写和执行单元测试和集成测试。
  7. 监控和日志记录:Hertz框架与许多监控和日志记录库集成,如Prometheus和Zap。这些库可以帮助你监控应用程序的性能并记录重要事件和错误。
  8. 社区支持:Hertz框架拥有一个活跃的开发者社区,你可以参与讨论、提问问题和分享经验。社区提供了大量的示例代码和教程,可以帮助你更好地使用和扩展Hertz框架。