Kitex 入门 | 青训营笔记

120 阅读1分钟

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

Kitex

安装 Kitex

首先,我们需要安装使用本示例所需要的命令行代码生成工具:

  1. 确保 GOPATH 环境变量已经被正确地定义(例如 export GOPATH=~/go)并且将$GOPATH/bin添加到 PATH 环境变量之中(例如 export PATH=$GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录

  2. 安装 kitex:go install github.com/cloudwego/kitex/tool/cmd/kitex@latest

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

    安装成功后,执行 kitex --version 和 thriftgo --version 应该能够看到具体版本号的输出(版本号有差异,以 x.x.x 示例):

    $ kitex --version
    vx.x.x
    
    $ thriftgo --version
    thriftgo x.x.x
    
  4. 如果在安装阶段发生问题,可能主要是由于对 Golang 的不当使用造成,请依照报错信息进行检索

    转自:快速开始 | CloudWeGo

定义 IDL(interface description language)

创建一个名为 echo.thrift 的 thrift IDL 文件,然后在里面定义服务

image.png

使用 IDL 定义服务与接口

如果我们要进行 RPC 通信,就需要知道对方的接口是什么,需要传递什么参数,同时也知道返回值是什么样的

这时候,就需要通过 IDL 来约定双方的协议,就像写代码的时候需要调用某个函数,我们需要知道函数签名一样

Kitex 生成代码

在完成 IDL 的编写之后,执行一下命令

$ kitex -module example -service example echo.thrift

上述命令中,-module 表示生成的该项目的 go module 名,-service 表明我们要生成一个服务端项目,后面紧跟的 example 为该服务的名字。最后一个参数则为该服务的 IDL 文件

image.png

其中:

  • build.sh:构建脚本
  • kitex_gen:IDL 内容相关的生成代码,主要是基础的 Server/Client 代码
  • main.go 程序入口
  • handler.go 实现 IDL service 定义的方法

Kitex 基本使用

服务默认监听 8888 端口

编写的服务端逻辑都在 handler.go 这个文件中,示例如下

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
}

简单的需求或代码可以都写着 Echo 里面,如果需求比较复杂,可以参考 MVC 进行分层

Kitex Client 发起请求

创建 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)

Kitex 服务发现与注册

Kitex 框架提供服务注册与发现的扩展,目前已经支持与业界主流注册中心对接。

服务注册

image.png

服务发现

image.png

Kitex 生态

Kitex 扩展非常丰富,下面是一些常用的扩展

扩展Github 仓库
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…