图片来源于gitHub

1.调用客户端句柄;实行传送参数2.调用本地系统内核发送网络3.传送到远程主机4.做事器句柄得到并取得参数5.实行远程过程6.实行的过程将结果返回做事器句柄7.做事器句柄返回结果,调用远程系统内核8.传回本地主机9.客户句柄由内核吸收10.客户吸收句柄返回的数据

Go措辞供应对RPC的支持:HTTP、TCP、JSPNRPC,但是在Go中RPC是独一无二的,它采取了GoLang Gob编码,只能支持Go措辞!

GoLang Gob:是Golang包自带的一个数据构造序列化的编码/解码工具。
编码利用Encoder,解码利用Decoder。
一种范例的运用处景便是RPC(remote procedure calls)。

HTTP RPC Demo

jspjsonrpcGo说话实现RPC Bootstrap

做事真个代码

Go RPC 的函数只有符合四个条件才能够被远程访问,不然会被忽略函数必须是首字母大写(可以导出的)必须有两个导出类型的参数第一个参数是接管的参数,第二个参数是返回给客户真个参数,而且第二个参数是指针的类型函数还要有一个返回值error

T、T1和T2类型必须能被encoding/gob包编解码。
客户真个代码

运行的结果图

go run GoRPCWeb8.go 127.0.0.1:1234 20 3go run 运行的命令GoRPCWeb8.go :这是文件的名称,须要到指定的目录下启动cmd127.0.0.1:1234 : ip地址和端口号20 3 这是客服端传入的值:一个除数,一个被除数,传入到做事器做乘法运算 乘法: 203=60和除法取整数: 20/3=6 余数 2,怎么做的,客户端不关心,给到做事端去完成os.Args[0]=[C:\Users\win7\AppData\Local\Temp\go-build011170718\command- line-arguments\_obj\exe\GoRPCWeb8.exe 127.0.0.1:1234 20 3]

TCP RPC Demo

基于TCP协议实现的RPC,做事真个代码

运行结果图

结果图

E:\new_code\GoDemo\web_server>go run GoTCPRPCWeb10.go 127.0.0.1:1234 20 1客户端 其他端 去调用的地方 对应的例子是 GoTCPRPC9.go长度必须即是4,由于呢,你输入切实其实定是一个ip的地址ip= 127.0.0.1:1234 嘿嘿,加上后面的被除数os.Args[2]= 20 和除数os.Args[3]= 1我进行正常结果如下Num : 201=20Num: 20/1=0 余数 0E:\new_code\GoDemo\web_server>go run GoTCPRPCWeb10.go 127.0.0.1:1234 20 2客户端 其他端 去调用的地方 对应的例子是 GoTCPRPC9.go长度必须即是4,由于呢,你输入切实其实定是一个ip的地址ip= 127.0.0.1:1234 嘿嘿,加上后面的被除数os.Args[2]= 20 和除数os.Args[3]= 2我进行正常结果如下Num : 202=40Num: 20/2=0 余数 0E:\new_code\GoDemo\web_server>go run GoTCPRPCWeb10.go 127.0.0.1:1234 20 3客户端 其他端 去调用的地方 对应的例子是 GoTCPRPC9.go长度必须即是4,由于呢,你输入切实其实定是一个ip的地址ip= 127.0.0.1:1234 嘿嘿,加上后面的被除数os.Args[2]= 20 和除数os.Args[3]= 3我进行正常结果如下Num : 203=60Num: 20/3=0 余数 2在定义BDemo 的时候, 如果定义的DD, CC int和做事端不一样,就会报错 reading body gob: type mismatch: no fields matched compiling decoder for ,实在创造好多种情形,也会涌现这种缺点,但是目前不知道为啥会这样,后续,等源码深入一点,回来看这个问题 todo2018/07/19这种TCP办法和上面的HTTP不同的是HTTP:指定的网络地址连接到HTTP RPC做事器

//DelayHTTP在指定的网络地址连接到HTTP RPC做事器 ///在默认HTTP RPC路径上监听。
client, err := rpc.DialHTTP(\公众tcp\"大众, serverAddress)TCP:指定的网络地址连接到HTTP RPC做事器

client,err:=rpc.Dial(\"大众tcp\公众,service)

JSON RPC

JSON RPC是数据编码采取了JSON,而不是gob编码,其他和上面先容的RPC观点千篇一律的。
做事真个代码如下

package mainimport ( \"大众fmt\公众 \"大众net/rpc\"大众 \"大众net\"大众 \公众net/rpc/jsonrpc\公众)//利用Go供应的json-rpc 标准包func init() { fmt.Println(\"大众JSON RPC 采取了JSON,而不是 gob编码,和RPC观点千篇一律,\公众)}type Work struct { Who,DoWhat string}type DemoM stringfunc (m DemoM) DoWork(w Work,whoT string) error { whoT=\公众是谁:\"大众+w.Who+\公众,在做什么---\"大众+w.DoWhat return nil}func main() { str:=new(DemoM) rpc.Register(str) tcpAddr,err:=net.ResolveTCPAddr(\公众tcp\"大众,\公众:8080\公众) if err!=nil{ fmt.Println(\"大众大哥发生缺点了啊,请看缺点 ResolveTCPAddr err=\公众,err) } listener,err:=net.ListenTCP(\公众tcp\公众,tcpAddr) if err!=nil { fmt.Println(\"大众发生缺点了--》err=\"大众,err) } for { conn,err:= listener.Accept() if err!=nil { continue } jsonrpc.ServeConn(conn) }}客户真个代码

运行的结果如下

运行结果

E:\new_code\GoDemo\web_server>go run GoJSONRPCWeb11.go 127.0.0.1:8080 shiming gongzuo这是客户端,用来启动,通过命令行来启动客户端 其他端 去调用的地方 对应的例子是 GoTCPRPC9.go长度必须即是4,由于呢,你输入切实其实定是一个ip的地址ip= 127.0.0.1:8080 嘿嘿,加上后面的被除数os.Args[2]= shiming 和除数os.Args[3]= gongzuo收到信息了 是谁:shiming,在做什么---gongzuoE:\new_code\GoDemo\web_server>go run GoJSONRPCWeb11.go 127.0.0.1:8080 shiming qiaodaima这是客户端,用来启动,通过命令行来启动客户端 其他端 去调用的地方 对应的例子是 GoTCPRPC9.go长度必须即是4,由于呢,你输入切实其实定是一个ip的地址ip= 127.0.0.1:8080 嘿嘿,加上后面的被除数os.Args[2]= shiming 和除数os.Args[3]= qiaodaima收到信息了 是谁:shiming,在做什么---qiaodaimaos.Args是一个数组 var Args []string,通过输入获取到,然后把这个客户端输入的内容传送到做事端,做事端做些操作,然后在返回给客户端Go已经供应了RPC良好的支持,通过HTTP TCP JSONRPC的实现,可以很方便开拓分布式的Web运用,但是我目前还不会,在学习中。
遗憾的是Go没有供应SOAP RPC的支持~~~