前言
Kitex是字节跳动研发的RPC框架,今天我和大家一起来实战操作一番,使用Thrift协议作为RPC通信协议来编写两个服务,一个作为RPC的Server,一个作为RPC的client
开发环境
编码软件 :Vscode
操作系统 :Centos
Centos安装在vmware虚拟机里面,使用Windows的Vscode连接到虚拟机进行编程。之所以选择Linux系统是因为Kitex的代码生成工具目前对Windows的支持不是很好,不过问题不大,大家都知道正式部署还是以Linux为主,平时多使用Linux也没什么坏处
开始实践
安装依赖
我们需要安装Kitex 和thriftgo ,安装thriftgo 是因为我们使用的是thrift协议作为RPC调用的通信协议,所以需要安装Go语言的thrift插件。
输入go install github.com/cloudwego/kitex@latest
安装kitex
输入go install github.com/cloudwego/thriftgo@latest
安装thriftgo
安装好后,在终端输入kitex -version
查看版本

如果输入命令出现提示 kitex:未找到命令 可能是GOPATH 环境变量没有设置,因为Go语言有个env文件,里面存了GOPATH 路径,但是系统环境变量里面还没有GOPATH 这个环境变量,所以我们需要新建一个名为GOPATH 的系统环境变量,把下面的/bin
文件夹暴露出去就好了。
编写thrift文件
user.thrift
thrift
namespace go usermodel
struct User {
1: required i64 ID,
2: required string loginName,
3: required string password,
4: required string nickName,
}
service UserService {
// 登录接口
bool signIn(1: User user),
// 注册接口
bool signUp(1: User user),
// 获取所有用户
list<User> getUserList(),
// 根据UserId获取用户
User getUserById(1: i64 id),
}
这里没有thrift的语法高亮支持,小伙伴们将就看看。这里面描述了一个User
结构体,描述了一个UserService
服务,服务里面描述了4个方法。
生成代码
我准备编写两个服务,一个 kitex-service ,一个 kitex-client 。从名字就很容易判断出来,一个服务对外提供RPC服务,一个服务负责调用写好的RPC服务。
编写的user.thrift
文件先放在 kitex-service 文件夹下
输入命令kitex -module moduleName -service serviceName
moduleName
通常是我们 go.mod
文件中定义的模块名,serviceName
是自己这个RPC服务的名称。输入命令回车确定后,我们在 kitex-service 文件夹下的handler.go
里面去补充我们的服务具体代码。
handler.go
Go
// ... ... 省略package 和 import代码
var users []*usermodel.User
func init() {
users = make([]*usermodel.User, 3)
for i := 0; i < 3; i++ {
users[i] = &usermodel.User{
ID: int64(i + 1),
LoginName: fmt.Sprintf("userLoginName_%d", i+1),
Password: "password",
NickName: fmt.Sprintf("user_%d", i+1),
}
}
}
// ... ... 省略一些生成的文件
// GetUserById implements the UserServiceImpl interface.
func (s *UserServiceImpl) GetUserById(ctx context.Context, id int64) (resp *usermodel.User, err error) {
fmt.Println("接收到远程RPC调用,参数是:", id)
return users[id], nil
}
我们就只把getUserById
补充一下,其他的方法就让它空着,毕竟只是做测试,测试一个方法就够了。
注册到Nacos
Go
// ... ... 省略package和import代码
func main() {
cli, err := clients.NewNamingClient(vo.NacosClientParam{
// 客户端配置
ClientConfig: &constant.ClientConfig{
NamespaceId: "go-framework-practice",
TimeoutMs: 5000,
NotLoadCacheAtStart: true,
LogDir: "/tmp/nacos/log",
CacheDir: "/tmp/nacos/cache",
LogLevel: "info",
},
// 配置Nacos的地址和端口
ServerConfigs: []constant.ServerConfig{
*constant.NewServerConfig("192.168.209.159", 8848),
},
})
if err != nil {
panic(err)
}
// 初始化server服务
svr := usermodel.NewServer(
new(UserServiceImpl),
server.WithRegistry(registry.NewNacosRegistry(cli)),
server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{
ServiceName: "userService",
}),
// 配置当前RPC服务对外暴露的IP和端口
server.WithServiceAddr(&net.TCPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 8081,
}),
)
err = svr.Run()
if err != nil {
log.Println(err.Error())
}
}
这里面有一些代码需要注意,NamespaceId
是设置在Nacos上面的命名空间的ID,要求Nacos上面要有同样的命名空间ID。
如果没有手动新建命名空间的话,在Nacos上面是看不到这个服务的。
客户端的配置的话,还有其他非常多的配置项,可以Ctrl+鼠标左键点进constant.ClientConfig
里面查看所有的配置项。
这个代码里面有比较多的配置项,可以访问 cloudwego 的官网查看 Kitex 的文档查看配置项的解释以及更多的配置。
kitex连接Nacos的示例代码是在GitHub上查看的,我做了一些小的改动写出来了这个Demo,官方示例在https://github.com/kitex-contrib/registry-nacos/
仓库里面。当然,这样的话就不用局限于Nacos了,小伙伴们如果想对接其他的服务注册与发现的话,可以访问kitex-contrib
的仓库,只要是官方支持的,都能找到示例代码快速入门。
接下来在kitex-service
文件夹下执行go run .
命令查看具体效果。

接下来在Nacos上面查看服务是否成功注册

可以看到,服务已经成功注册!
总结
绝大部分的代码都是由kitex
来生成,我们只需要编写好.thrift
文件,然后完善handler.go
文件。至于注册到Nacos的配置项,可以参照官网仓库里面的代码示例来编码,再通过阅读源码理解一下,根据自己的需求完善代码。下期我们来完成client
端的代码,拜拜!