Go RPC框架——Kitex基础教程| 青训营笔记

820 阅读4分钟

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

前言

本文主要介绍字节内部开源的Go语言微服务框架——Kitex

Kitex是字节内部的Go语言微服务RPC框架,拥有高性能、强可扩展的主要特定,支持多协议并且拥有吩咐的开源扩展。

安装Kitex

Kitex可以生成代码,下面先安装Kitex

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

安装完成后,检查下是否安装成功:

~ kitex --version
v0.4.4

遇到问题: 第一次安装后,执行kitex命令提示我命令不存在,检查了下是因为我没有配置GOPTAH环境变量,配置好GOPTAH环境变量后,将GOPTAH下的bin目录也加入环境变量就好了。

安装Thrift

Kitex支持的协议有:thriftprotobufKitex可以根据协议文件来生成接口的定义以及代码,下面以thrift为例进行介绍。

thrift是一个RPC框架,用于各个服务之间的RPC通信,支持跨语言,支持常用的语言有JavaC++PythonGoC#ErlangNode.js等等还有很多其他语言,Thrift是一个典型的CS(客户端/服务端)结构,客户端和服务端可以使用不同的语言开发。

安装thrift

go install github.com/cloudwego/thriftgo@latest

安装完成后,检查下是否安装成功:

~ thriftgo --version
thriftgo 0.2.5

IDL

thrift通过一个中间语言IDL(接口定义语言)来定义RPC的数据类型和接口。

为什么要使用IDL?我们要进行RPC调用,就需要知道对方的接口是什么、需要传什么参数,同时也需要知道返回值是什么样的。这时候就需要通过IDL来约定双方的协议,就像在写代码的时候需要调用某个函数,需要知道函数前面一样。

定义IDL

使用thrift定义IDL需要创建一个文件以.thrift结尾,例如hello.thrift

namespace go api

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

namespace代表命名空间,上面示例的命名空间为apigo代表go语言,如果用python语言来使用的话,就写python

service就代表一个服务,例如示例中的Hello服务,这个Hello服务提供了一个echo方法。

struct结构体用来定义参数或响应类型。

代码生成

定义好了IDL后,就可以使用kitex生成代码了。执行以下命令来生成项目代码:

kitex -module learning -service Hello hello.thrift

-module是模块名或者说是项目名

-service是服务名

执行完成之后,生成的代码目录如下:

image.png

生成的文件说明如下:

  • build.sh 构建脚本,可以把代码变成可执行文件
  • kitex_gen IDL内容相关的生成代码,主要是基础的Server/Client代码
  • main.go 程序入口
  • handler.go 用户在该文件里实现IDLservice定义的方法

Kitex基础使用

需要在handler.go实现Hello服务的echo方法,kitex默认监听8888端口。

Hello服务的代码实现,只需要在文件中的echo方法加入业务代码就可以了,复杂的代码逻辑的话可以按照MVC模式进行代码分层。

代码示例:

image.png

Client发起请求

创建客户的,需要使用NewClient方法,该方法第一个参数代表服务名,在服务发现中可以使用,第二个参数是服务端地址。

NewClient方法创建客户端后就可以发起请求了,需要根据IDL定义传入参数,还可以指定超时时间。

image.png

服务注册与发现

目前kitex的服务注册与发现已经对接了主流的服务注册与发现中心,例如:ETCDNacos等。

服务端启动后,将服务注册到注册中心,客户端从注册中心获取服务。

下面就以Nacos作为注册中心为例看下使用方法:

先安装依赖包。

go get -u github.com/kitex-contrib/registry-nacos 
go get -u github.com/nacos-group/nacos-sdk-go

服务端代码:

  • 先配置好Nacos的地址和端口
  • 定义好Nacos的命名空间以及账号密码
  • 通过NewServer来进行连接注册
  • 指定服务名为Hello

image.png

客户的代码:

  • 先配置好Nacos的地址和端口
  • 定义好Nacos的命名空间以及账号密码
  • 通过NewClient来进行连接并获取服务
  • 调用服务

image.png

Kitex生态

Kitex有非常丰富的扩展生态,如:

  • XDS扩展
  • opentelemetry扩展
  • ETCD服务注册与发现扩展
  • Nacos服务注册与发现扩展
  • Zookeeper服务注册与发现扩展
  • Polaris扩展
  • 丰富的实例代码与业务Demo

详细扩展代码请查看GitHub

引用

字节内部视频——Go框架三件套详解(Web/RPC/ORM)