什么是RPC
rpc是远程过程调用(Remote Procedure Call)的缩写,简单的来讲就是调用远处的一个节点所提供的服务,至于这个远处有多远呢?可能是一个文件内,不同的函数,也可能是同一个机器上的另一个进程的函数,也可能是远在另外省份的机器所提供的函数。
rpc 入门
rpc是分布式微服务系统中不同节点之间流行的通信方式,在现今互联网时代,rpc已经是一个不可缺少的基础组件,因此GO语言的标准库也提供了简单的RPC实现,我们将以此为入口学习RPC的各种用法。
rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问。服务端注册一个对象,使它作为一个服务被暴露,服务的名字是该对象的类型名。注册之后,对象的导出方法就可以被远程访问。服务端可以注册多个不同类型的对象(服务),但注册具有相同类型的多个对象是错误的。
只有满足如下标准的方法才能用于远程访问,其余方法会被忽略:
- 方法是导出的
- 方法有两个参数,都是导出类型或内建类型
- 方法的第二个参数是指针
- 方法只有一个error接口类型的返回值
事实上,方法必须看起来像这样:
func (t *T) MethodName(argType T1, replyType *T2) error
项目实操
我们在服务端提供了一个Hello的服务,有着一个Print的方法。
服务端
package main
import (
"log"
"net"
"net/rpc"
)
type Hello struct {
}
//方法需要满足前面所描述的约束条件
func (h *Hello) Print(from string, reply *string) error {
*reply = from + ":Hello World"
return nil
}
func main() {
rpc.Register(new(Hello)) //注册服务
//Register 会将独享中满足约束条件的方法全部注册为RPC函数
//所有注册的方法会放到服务名为对象名的服务之下(RegisterName 可以自定义服务名称)
listen, err := net.Listen("tcp", ":1234") //监听服务
if err != nil {
log.Fatal("listen errpr", err)
}
for {
conn, _ := listen.Accept() //同意连接
rpc.ServeConn(conn) //