1月28日Day7 Go框架Kitex|青训营笔记

209 阅读2分钟

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

Kitex

Kitex 简介

Kitex 为字节开源的RPC框架,与go-micro等不同,kitex主打强扩展性,在协议上不仅支持Thrift(Buffered与Framed),同时也支持Kitex Protobuf等。Kitex 是一个 RPC 框架,底层支持两大功能:

  • Serialization 序列化
  • Transport 传输
  • Kitex 框架及命令行工具,默认支持 thrift 和 proto3 两种 IDL(Interface Definition Language,接口定义语言),对应的 Kitex 支持 thrift 和 protobuf 两种序列化协议。
  • 传输上 Kitex 使用扩展的 thrift 作为底层的传输协议(注:thrift 既是 IDL 格式,同时也是序列化协议和传输协议)。

准备工作

  • 准备本地的 Golang 环境,设置好 GOPATH,建议使用较新的 Go 版本。
  • 安装 Kitex 和 thriftgo 两个命令行工具
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
go install github.com/cloudwego/thriftgo@latest

可以在命令行运行 kitex --version 和 thriftgo --version 进行验证。

创建 IDL 文件

Kitex 的典型使用场景是基于 thrift 定义的 IDL 来定义服务接口,实现客户端与服务端之间的通信。

为什么要使用 IDL
如果我们要进行 RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的,就好比两个人之间交流,需要保证在说的是同一个语言、同一件事。这时候,就需要通过 IDL 来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。

namespace go api

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

Kitex 生成 echo 服务代码

kitex -module example -service example echo.thrift
  • -module 表示生成的该项目的 go module 名
  • -service 表明我们要生成一个服务端项目
  • example 为该服务的名字
  • 最后一个参数则为该服务的 IDL 文件
| - build.sh
| - echo.thrift
| - hamd;er.go
| - kitex_gen
    | - api
        | - echo
            | - client.go
            | - echo.go
            | - invoker.go
            | - server.go
        | - echo.go
        | - k-echo.go
| - main.go
| - script
    | - boostrap.sh
    | - settings.py
  • build.sh: 构建脚本
  • kitex_gen: IDL内容相关的生成代码,主要是基础的 Server/Client代码。
  • main.go 程序入口
  • handler.go 用户在该文件里实现IDL service 定义的方法

编写 server

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 *api.Request) (resp *api.Response, err error) {
  // TODO: Your code here...
  return
}

注:服务端逻辑的编写应在 handler.go 文件中进行。

编写 client

import "example/kitex_gen/api/echo"
import "github.com/cloudwego/kitex/client"

...
c, err := echo.NewClient("example", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
  log.Fatal(err)
}

调用和运行

import "example/kitex_gen/api"

...
req := &api.Request{Message: "my request"}
resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
if err != nil {
  log.Fatal(err)
}
log.Println(resp)

运行

sh build.sh
sh output/bootstrap.sh

生态

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…
丰富的示例代码与业务 Demogithub.com/cloudwego/k…