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

1,197 阅读4分钟

前言

Kitex是字节跳动研发的RPC框架,今天我和大家一起来实战操作一番,使用Thrift协议作为RPC通信协议来编写两个服务,一个作为RPC的Server,一个作为RPC的client

开发环境

编码软件:Vscode
操作系统:Centos
Centos安装在vmware虚拟机里面,使用Windows的Vscode连接到虚拟机进行编程。之所以选择Linux系统是因为Kitex的代码生成工具目前对Windows的支持不是很好,不过问题不大,大家都知道正式部署还是以Linux为主,平时多使用Linux也没什么坏处

开始实践

安装依赖

我们需要安装Kitexthriftgo,安装thriftgo是因为我们使用的是thrift协议作为RPC调用的通信协议,所以需要安装Go语言的thrift插件。
输入go install github.com/cloudwego/kitex@latest安装kitex
输入go install github.com/cloudwego/thriftgo@latest安装thriftgo
安装好后,在终端输入kitex -version查看版本

image.png
如果输入命令出现提示 kitex:未找到命令 可能是GOPATH环境变量没有设置,因为Go语言有个env文件,里面存了GOPATH路径,但是系统环境变量里面还没有GOPATH这个环境变量,所以我们需要新建一个名为GOPATH的系统环境变量,把下面的/bin文件夹暴露出去就好了。

编写thrift文件

user.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

// ... ... 省略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

// ... ... 省略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。

image.png 如果没有手动新建命名空间的话,在Nacos上面是看不到这个服务的。
客户端的配置的话,还有其他非常多的配置项,可以Ctrl+鼠标左键点进constant.ClientConfig里面查看所有的配置项。
这个代码里面有比较多的配置项,可以访问 cloudwego 的官网查看 Kitex 的文档查看配置项的解释以及更多的配置。
kitex连接Nacos的示例代码是在GitHub上查看的,我做了一些小的改动写出来了这个Demo,官方示例在https://github.com/kitex-contrib/registry-nacos/仓库里面。当然,这样的话就不用局限于Nacos了,小伙伴们如果想对接其他的服务注册与发现的话,可以访问kitex-contrib的仓库,只要是官方支持的,都能找到示例代码快速入门。
接下来在kitex-service文件夹下执行go run .命令查看具体效果。

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

image.png
可以看到,服务已经成功注册!

总结

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