Go语言主流框架——Kitex、Hertz | 青训营笔记

1,408 阅读3分钟

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

前言

本文主要介绍Go语言的两个主流开发框架的Kitex、Hertz。

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

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

Kitex

  • 安装Kitex代码生成工具

    • Kitex 目前对 Windows 的支持不完善,如果本地开发环境是 Windows 的同学建议使用虚拟机或 WSL2。

    • 安装代码生成工具

      • 确保 GOPATH 环境变量已经被正确地定义并且将$GOPATH/bin添加到 PATH 环境变量之中
      • 请勿将 GOPATH 设置为当前用户没有读写权限的目录
    • 安装kitex:go install github.com/cloudwego/kitex/tool/cmd/kitex@latest

    • 安装thriftgo:go install github.com/cloudwego/thriftgo@latest

    安装完成后,查看版本大致模板

    $ kitex --version
    vx.x.x
    
    $ thriftgo --version
    thriftgo x.x.x
    
  • 定义IDL

    • 使用IDL定义服务与接口
    • 介绍
      • 如果我们要进行 RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的。
      • 这时候,就需要通过 IDL 来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。
    namespace go api
    
    struct Request{
        1: string message
    }
    
    struct Response f{
        1: string message
    }
    
    service Echo f{
        Response echo(1: Request req)
    }
    

    文档资料:

  • Kitex生成代码

    • 使用 kitex -module example -service example echo.thrift 命令生成代码
    • 最外层重要文件说明
      • build.sh:构建脚本
      • kitex_gen:IDL 内容相关的生成代码,主要基础的Server/Client代码
      • main.go 程序入口
      • hendler.go 用户在该文件里实现IDL service 定义的方法
  • Kitex 基本使用

    • 服务默认监听8888端口
    package main
    import{
        "context"
        "example/kitex_gen/api"
    }
    // EchoImpl implements the last service interface defined in the IDL
    type EchoImpl struct{}
    // Echo implements the EchoImpl interface.
    Func (s *EchoImpl) Echo(ctx context.Context, req *apiReauest) (resp *api.Response, err error) {
        // TODO: Your code here...
        return
    }
    
  • Kitex Client 发起请求

    • 创建Client
      • 包导入
        • 导入example包中kitex_gen/api/echo
        • 导入github.com/cloudwego/kitex/client
        • 例如c,err:=echo.NewClient("example",client.WithHostPorts("0.0.0.0:8888")并判断err是否为空做错误处理
    • 发起请求
      • 导入example包中kitex_gen/api
      • req := &api.Request{Message:my request"}
      • resp,err:=c.Echo(context.Background(),req,callopt.WithRPCTimeout(3*time.Second))并对操作进行错误处理
  • Kitex 服务注册与发现

  • Kitex 生态 常用扩展:

  1. XDS 扩展:github.com/kitex-contr…
  2. opentelemetry 扩展:github.com/kitex-contr…
  3. ETCD 服务注册与发现扩展:github.com/kitex-contr…
  4. Nacos 服务注册与发现扩展:github.com/kitex-contr…
  5. Zookeeper 服务注册与发现扩展:github.com/kitex-contr…
  6. polaris 扩展:github.com/kitex-contr…

还有一个丰富的示例代码与业务Demo:github.com/cloudwego/k…

Hertz

  • Hertz 安装

    1. 确保 GOPATH 环境变量已经被正确地定义(例如 export GOPATH=~/go)并且将$GOPATH/bin添加到 PATH 环境变量之中(例如 export PATH=$GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录
    2. 安装 hertz:go install github.com/cloudwego/hertz/cmd/hz@latest
  • Hertz 基本使用

    如图代码所示:

image.png

  • Hertz 路由

    • 提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由 image.png
  • 提供了路由器(Group)的能力,用于支持路由分组的功能。 image.png

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

详情:路由 | CloudWeGo

  • Hertz 参数绑定
    • Hertz 提供了Bind、Validate、BindAndValidate函数用于进行参数绑定和校验
      • 参数绑定优先级:path > form > query > cookie > header > json > raw_body

image.png

详情:绑定与校验 | CloudWeGo

  • Hertz 中间件

    • Hertz的中间件主要分为客户端中间件和服务端中间件
      • 服务端实现一个中间件
      // 方式一
      func MyMiddleware() app.HandlerFunc {
        return func(ctx context.Context, c *app.RequestContext) {
          // pre-handle
          // ...
          c.Next(ctx)
        }
      }
      // 方式二
      func MyMiddleware() app.HandlerFunc {
        return func(ctx context.Context, c *app.RequestContext) {
          c.Next(ctx) // call the next middleware(handler)
          // post-handle
          // ...
        }
      }
      
      • 客户端实现一个中间件
      func MyMiddleware(next client.Endpoint) client.Endpoint {
        return func(ctx context.Context, req *protocol.Request, resp *protocol.Response) (err error) {
          // pre-handle
          // ...
          err = next(ctx, req, resp)
          if err != nil {
            return
          }
          // post-handle
          // ...
        }
      }
      
    • 如何终止中间件调用链的执行:
      1. c.Abort
      2. c.AbortWithMsg
      3. c.AbortWlthStats
    • 更多内容可见:www.cloudwego.io/zh/docs/her…
  • Hertz Client

  • Hertz 代码生成工具

    • Hertz 提供了代码生成工具 Hz,通过定义 IDL(inteface description language)文件即可生成对应的基础服务代码,
    • 代码生成工具与kitex有所不同
    • 详见:hz 命令行工具使用 | CloudWeGo
  • Hertz 性能 image.png

  • Hertz 生态 image.png

具体内容(扩展):github.com/cloudwego/h…

心得

文本介绍了Kitex、Hertz两个主流框架并写下了这篇文章,其实对于具体实现与学习来说,本文还有很多不足,仅仅只是对课程进行小总结,比较随意,实际上的学习是需要更多功夫的,具体操作和实现还是得在看具体文档,go语言的三大框架gorm,kitex,hertz都要花时间消化,仅仅是入门主流框架,我就已经获益匪浅了。

引用

ppt:⁡‍⁤⁣⁢⁣‍⁡⁢‬⁢⁤‬⁣‌‬⁣⁡⁡‌‌‍⁣⁤‬‍‌‌‍⁡‍⁣‬‌⁡‍Go 框架三件套详解.pptx - 飞书云文档 (feishu.cn)

Kitex安装文档:www.cloudwego.io/zh/docs/kit… Kitex文档:www.cloudwego.io/zh/docs/kit…

Hertz安装文档:www.cloudwego.io/zh/docs/her… Hertz文档:www.cloudwego.io/zh/docs/kit…