前言
上篇文章已经把Kitex的Server端搭建好了,并且注册到了Nacos里面,我们需要在Client里面使用服务发现来发现这个服务并远程调用。
开始实战
生成代码
进入 kitex-client 文件夹下使用和服务端同样的IDL文件生成客户端的代码,这里生成的代码会包含服务端RPC调用的代码,相当于是一个.thrift
文件会同时生成 client
和server
的代码,我们在调用端调用的时候只用client
的代码就行了,多出来的代码可以删除掉,但是对于删除哪部分代码拿不准的小伙伴可以选择不去动那个代码。
输入 kitex -module moduleName -service serviceName
生成代码,这里moduleName
和serviceName
已经在上一篇讲过了,大家按照自己的需求来填写就行
完善代码
client
端的代码比较简单,我们不用去补全handler.go
的文件,因为那个是server
端才会对外提供这个服务,我们只需要在client
端新建一个client
然后去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",
},
ServerConfigs: []constant.ServerConfig{
*constant.NewServerConfig("192.168.209.159", 8848),
},
})
if err != nil {
log.Fatal(err)
}
// 创建客户端
clt := usermodel.MustNewClient("userService",
client.WithResolver(resolver.NewNacosResolver(cli)),
)
for i := 0; i < 10; i++ {
id := rand.Int63n(3)
user, err := clt.GetUserById(context.Background(), id, callopt.WithConnectTimeout(10*time.Second))
if err != nil {
fmt.Println(err.Error())
continue
}
fmt.Printf("请求返回的结果是:%+v\n", user)
time.Sleep(2 * time.Second)
}
}
这里就只有一个main
函数,里面的逻辑也非常简单,就是使用自定义的配置来创建客户端,然后发起调用。还记得我在server
端新建了3个对象吗,它们的Id才0递增到2.这里我调用的GetUserById
传入我随机生成的0~2
的ID查询10次来模拟更真实的业务环境。方法调用的最后一个参数callopt.WithConnectTimeout(10*time.Second)
是定义RPC调用超时的时间,我这里设置的是10秒,大家可以根据实际的需求来设置。
最终效果
这是client
端调用的结果
这是server
端打印的信息
总结
RPC服务作为服务之间同步通信的手段在微服务开发中非常常见,我们非常有必要掌握RPC的大致原理和具体编码。