Go语言Kitex对接Nacos实现RPC调用(Client端) | 青训营

前言

上篇文章已经把Kitex的Server端搭建好了,并且注册到了Nacos里面,我们需要在Client里面使用服务发现来发现这个服务并远程调用。

开始实战

生成代码

进入 kitex-client 文件夹下使用和服务端同样的IDL文件生成客户端的代码,这里生成的代码会包含服务端RPC调用的代码,相当于是一个.thrift文件会同时生成 clientserver的代码,我们在调用端调用的时候只用client的代码就行了,多出来的代码可以删除掉,但是对于删除哪部分代码拿不准的小伙伴可以选择不去动那个代码。

输入 kitex -module moduleName -service serviceName生成代码,这里moduleNameserviceName已经在上一篇讲过了,大家按照自己的需求来填写就行

完善代码

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的大致原理和具体编码。

相关推荐
Find24 天前
MaxKB 集成langchain + Vue + PostgreSQL 的 本地大模型+本地知识库 构建私有大模型 | MarsCode AI刷题
青训营笔记
理tan王子24 天前
伴学笔记 AI刷题 14.数组元素之和最小化 | 豆包MarsCode AI刷题
青训营笔记
理tan王子24 天前
伴学笔记 AI刷题 25.DNA序列编辑距离 | 豆包MarsCode AI刷题
青训营笔记
理tan王子24 天前
伴学笔记 AI刷题 9.超市里的货物架调整 | 豆包MarsCode AI刷题
青训营笔记
夭要7夜宵1 个月前
分而治之,主题分片Partition | 豆包MarsCode AI刷题
青训营笔记
三六1 个月前
刷题漫漫路(二)| 豆包MarsCode AI刷题
青训营笔记
tabzzz1 个月前
突破Zustand的局限性:与React ContentAPI搭配使用
前端·青训营笔记
Serendipity5651 个月前
Go 语言入门指南——单元测试 | 豆包MarsCode AI刷题;
青训营笔记
wml1 个月前
前端实践-使用React实现简单代办事项列表 | 豆包MarsCode AI刷题
青训营笔记
用户44710308932421 个月前
详解前端框架中的设计模式 | 豆包MarsCode AI刷题
青训营笔记