这是我参与「第五届青训营 」伴学笔记创作活动的第 6天
什么是RPC
RPC(Remote Procedure Call Protocol)远程过程调用协议。
RPC是一种协议一套规范,用来远程过程调用的。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
Kitex
Kitex 是一个 RPC 框架,既然是 RPC,底层就需要两大功能:
- Serialization 序列化
- Transport 传输
Kitex 框架及命令行工具,默认支持 thrift 和 proto3 两种 IDL,对应的 Kitex 支持 thrift 和 protobuf 两种序列化协议。传输上 Kitex 使用扩展的 thrift 作为底层的传输协议(注:thrift 既是 IDL 格式,同时也是序列化协议和传输协议)。IDL 全称是 Interface Definition Language,接口定义语言。
使用IDL定义服务与接口
Kitex生成代码各级目录作用
编译运行
kitex 工具已经帮我们生成好了编译和运行所需的脚本:
- 编译:
$ sh build.sh
执行上述命令后,会生成一个 output 目录,里面含有我们的编译产物。
- 运行:
$ sh output/bootstrap.sh
执行上述命令后,Echo 服务就开始运行啦!
编写客户端
有了服务端后,接下来就让我们编写一个客户端用于调用刚刚运行起来的服务端。
- 首先,同样的,先创建一个目录用于存放我们的客户端代码:
$ mkdir client
- 进入目录:
$ cd client
创建一个 main.go 文件,然后就开始编写客户端代码了。
创建 client
首先让我们创建一个调用所需的 client:
上述代码中,
echo.NewClient 用于创建 client,其第一个参数为调用的 服务名,第二个参数为 options,用于传入参数,此处的 client.WithHostPorts 用于指定服务端的地址。
发起调用
接下来让我们编写用于发起调用的代码: 上述代码中,我们首先创建了一个请求 req , 然后通过 c.Echo 发起了调用。 其第一个参数为 context.Context,通过通常用其传递信息或者控制本次调用的一些行为,你可以在后续章节中找到如何使用它。 其第二个参数为本次调用的请求。 其第三个参数为本次调用的 options ,Kitex 提供了一种 callopt 机制,顾名思义——调用参数 ,有别于创建 client 时传入的参数,这里传入的参数仅对此次生效。 此处的 callopt.WithRPCTimeout 用于指定此次调用的超时(通常不需要指定,此处仅作演示之用)同样的,你可以在 *** 基础特性*** 一节中找到更多的参数。
发起调用
在编写完一个简单的客户端后,我们终于可以发起调用了。
你可以通过下述命令来完成这一步骤:
$ go run main.go
如果不出意外,你可以看到类似如下输出:
2021/05/20 16:51:35 Response({Message:my request})
恭喜你!至此你成功编写了一个 Kitex 的服务端和客户端,并完成了一次调用!## 发起调用
在编写完一个简单的客户端后,我们终于可以发起调用了。
你可以通过下述命令来完成这一步骤:
$ go run main.go
如果不出意外,你可以看到类似如下输出:
2021/05/20 16:51:35 Response({Message:my request})
恭喜你!至此你成功编写了一个 Kitex 的服务端和客户端,并完成了一次调用!