go语言体验rpc调用过程
为了更好的理解之后的grpc框架,我们先体验下go语言rpc开发,即远程调用。
先实现server端
package main
import (
"net"
"net/rpc"
)
type HelloServer struct {}
func (hello *HelloServer) Hello(request string, reply *string) error {
// 注意这个方法并没有返回值,而是通过传进来的指针实现的,修改了指针的值
// 算是间接的返回一个值
*reply = "hello " + request
return nil
}
func main(){
// 实例化一个server,写一个套接字,就像python里的socket
listener, _ := net.Listen("tcp",":1234")
// 注册自己上面的业务逻辑到rpc
//第一个参数是自己的服务名字随便起,客户端调用的时候会用到
//第二个参数就是注册自己上面的struct,即业务逻辑,然后client端即可调用自己的业务逻辑函数。
_ = rpc.RegisterName("helloserver", &HelloServer{})
// 启动服务
conn, _ := listener.Accept() //接受一个请求,产生一个套接字
rpc.ServeConn(conn) //后续我们就把这个套接字交给rpc接管
}
客户端
import (
"fmt"
"net/rpc"
)
func main(){
// 建立连接
client, erro := rpc.Dial("tcp", "localhost:1234") //这里还是用的go语言rpc建立连接
if erro != nil{
panic("连接出错")
}
var reply *string = new(string)
// 调用自己服务器注册的服务(可以理解成微服务)
erro = client.Call("helloserver.Hello", "book", reply)
if erro != nil{
panic("调用失败")
}
// 打印结果
fmt.Println(*reply)
}
总结:
这是一个很简单的rpc例子,其实写过python http socket套接字的会有感觉,很像。但是调用方法会有些不一样,
区别就是它可以直接调用你的服务器里的函数。
go语言rpc和python中微服务框架nameko使用起来是差不多的,原理都是一样的。
学习http的一些框架如flask,django,之前我们最好先学习如何自己写tcp socket,并建立连接,才能更好的理解flask和django框架到底为我们都做了什么。这里的代码其实也是为了之后要学习的grpc框架做准备,知道grpc框架为我们做了什么。
这个go rpc序列化协议是go语言特有的GOB,不支持跨语言调用,如果需要跨语言调用需要修改它的序列化协议。
如果改成json的序列化协议,那么就可以支持多语言调用,无论python,java,nuby,php…都可以调用。