这是我参与「第五届青训营 」伴学笔记创作活动的第 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) }文档资料:
- Thrift: thrift.apache.org/docs/id
- Proto3 :developers.google.com/protocol-bu…
-
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))并对操作进行错误处理
- 创建Client
-
Kitex 服务注册与发现
- 目前Kitex的服务注册与发现已经对接了主流的服务注册与发现中心,如ETCD,Nacos等
- 详情:www.cloudwego.io/zh/docs/kit…
-
Kitex 生态 常用扩展:
- XDS 扩展:github.com/kitex-contr…
- opentelemetry 扩展:github.com/kitex-contr…
- ETCD 服务注册与发现扩展:github.com/kitex-contr…
- Nacos 服务注册与发现扩展:github.com/kitex-contr…
- Zookeeper 服务注册与发现扩展:github.com/kitex-contr…
- polaris 扩展:github.com/kitex-contr…
还有一个丰富的示例代码与业务Demo:github.com/cloudwego/k…
Hertz
-
Hertz 安装
- 确保
GOPATH环境变量已经被正确地定义(例如export GOPATH=~/go)并且将$GOPATH/bin添加到PATH环境变量之中(例如export PATH=$GOPATH/bin:$PATH);请勿将GOPATH设置为当前用户没有读写权限的目录 - 安装 hertz:
go install github.com/cloudwego/hertz/cmd/hz@latest
- 确保
-
Hertz 基本使用
如图代码所示:
-
Hertz 路由
- 提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由
- 提供了GET、POST、PUT、DELETE、ANY等方法用于注册路由
-
提供了路由器(Group)的能力,用于支持路由分组的功能。
-
提供了参数路径和通配路由,其中,路由的优先级为:静态路由 > 命名路由 > 通配路由
- Hertz 参数绑定
- Hertz 提供了Bind、Validate、BindAndValidate函数用于进行参数绑定和校验
- 参数绑定优先级:path > form > query > cookie > header > json > raw_body
- Hertz 提供了Bind、Validate、BindAndValidate函数用于进行参数绑定和校验
-
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 // ... } } - 如何终止中间件调用链的执行:
- c.Abort
- c.AbortWithMsg
- c.AbortWlthStats
- 更多内容可见:www.cloudwego.io/zh/docs/her…
- Hertz的中间件主要分为客户端中间件和服务端中间件
-
Hertz Client
- client的代码的主要意思都差不多
- 详细见代码:qithub.com/cloudwego/h…
-
Hertz 代码生成工具
- Hertz 提供了代码生成工具 Hz,通过定义 IDL(inteface description language)文件即可生成对应的基础服务代码,
- 代码生成工具与kitex有所不同
- 详见:hz 命令行工具使用 | CloudWeGo
-
Hertz 性能
-
Hertz 生态
具体内容(扩展):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…