这是我参与「第五届青训营 」伴学笔记创作活动的第 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支持的协议有:thrift和protobuf,Kitex可以根据协议文件来生成接口的定义以及代码,下面以thrift为例进行介绍。
thrift是一个RPC框架,用于各个服务之间的RPC通信,支持跨语言,支持常用的语言有Java、C++、Python、Go、C#、Erlang、Node.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代表命名空间,上面示例的命名空间为api,go代表go语言,如果用python语言来使用的话,就写python。
service就代表一个服务,例如示例中的Hello服务,这个Hello服务提供了一个echo方法。
struct结构体用来定义参数或响应类型。
代码生成
定义好了IDL后,就可以使用kitex生成代码了。执行以下命令来生成项目代码:
kitex -module learning -service Hello hello.thrift
-module是模块名或者说是项目名
-service是服务名
执行完成之后,生成的代码目录如下:
生成的文件说明如下:
- build.sh 构建脚本,可以把代码变成可执行文件
- kitex_gen IDL内容相关的生成代码,主要是基础的Server/Client代码
- main.go 程序入口
- handler.go 用户在该文件里实现IDLservice定义的方法
Kitex基础使用
需要在handler.go实现Hello服务的echo方法,kitex默认监听8888端口。
对Hello服务的代码实现,只需要在文件中的echo方法加入业务代码就可以了,复杂的代码逻辑的话可以按照MVC模式进行代码分层。
代码示例:
Client发起请求
创建客户的,需要使用NewClient方法,该方法第一个参数代表服务名,在服务发现中可以使用,第二个参数是服务端地址。
NewClient方法创建客户端后就可以发起请求了,需要根据IDL定义传入参数,还可以指定超时时间。
服务注册与发现
目前kitex的服务注册与发现已经对接了主流的服务注册与发现中心,例如:ETCD、Nacos等。
服务端启动后,将服务注册到注册中心,客户端从注册中心获取服务。
下面就以Nacos作为注册中心为例看下使用方法:
先安装依赖包。
go get -u github.com/kitex-contrib/registry-nacos
go get -u github.com/nacos-group/nacos-sdk-go
服务端代码:
- 先配置好
Nacos的地址和端口 - 定义好
Nacos的命名空间以及账号密码 - 通过
NewServer来进行连接注册 - 指定服务名为
Hello
客户的代码:
- 先配置好
Nacos的地址和端口 - 定义好
Nacos的命名空间以及账号密码 - 通过
NewClient来进行连接并获取服务 - 调用服务
Kitex生态
Kitex有非常丰富的扩展生态,如:
XDS扩展opentelemetry扩展ETCD服务注册与发现扩展Nacos服务注册与发现扩展Zookeeper服务注册与发现扩展Polaris扩展- 丰富的实例代码与业务Demo
详细扩展代码请查看GitHub
引用
字节内部视频——Go框架三件套详解(Web/RPC/ORM)