rpc框架使用总结

目前开源的rpc框架有很多,比较知名的有:grpc, thrift, dubbo等。rpc框架一般需要三部分:
1 服务发现(需要发现内部服务部署的主机IP与端口号)
2 通信协议(也可以理解为跟http协议类似的应用层)(包含结构体数据编码序列化过程,以及如何发送与接收调用信息等等,可以参考文献thrift通信过程 , thrift编码协议)
3 传输层(也即transport层)(相当于TCP协议)

RPC框架其实与http框架一样,只不过封装了调用过程,同时一般也提供了更方便的代码生成工具,相对http服务而言,传输效率也更高。但是一般情况下,不是特别追求效率,http框架更好用,同时也方便与前端进行对接。因此,一般内部的重要服务采用RPC框架,而一般服务大多采用Http框架。

一 原生rpc

go 中的包net/rpc,实现了简单的rpc功能,go语言的框架设计支持通过插件实现自定义的编解码,另外rpc框架构建在抽象的接口:io.ReadWriteCloser接口之上,因此可以将rpc构建在不同的通信协议上。使用范例如下:

type HelloService struct {}
func (p *HelloService) Hello(request string, reply *string) error {
    *reply = "hello:" + request
    return nil
}
服务端
func main() {
    rpc.RegisterName("HelloService", new(HelloService))
    listener, err := net.Listen("tcp", ":1234")
    if err != nil {...}
    conn, err := listener.Accept()
    if err != nil {...}
    rpc.ServeConn(conn) 
    // 使用json编解码器,rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
}
客户端:
func main() {
	//使用json编解码器,client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
    client, err := rpc.Dial("tcp", "localhost:1234")
    if err != nil {...}
    var reply string
    err = client.Call("HelloService.Hello", "hello", &reply)
    if err != nil {...}
}

二 grpc

grpc 基于protobuf开发而来,protobuf是谷歌开发的一套数据描述语言,通过附带的工具实现了结构体数据序列化的功能。利用protobuf文件,可以生成文件中对应的结构体的类代码,同时可以利用protobuf可以定义与语言无关的RPC服务接口。在具体实现的服务接口中可以使用json编码或protobuf编码(参考go高级编程,将protobuf与go原生的RPC框架结合,可以根据protobuf文件自动生成服务接口,序列化编码则采用默认编码格式gob)。

grpc是谷歌开发的基于protobuf的跨语言RPC框架,, 当然采用的是protobuf编码,支持流特性。对于grpc使用不多,后面有机会会再学习。

三 thrift

grpc与thrift都支持跨语言服务开发。参考维基百科thrift中的定义,thrift是一个远程过程调用RPC服务框架,由facebook开发,协议层与传输层是运行库的一部分,支持众多通讯协议,如:TBinaryProtocol, TCompactProtocol 等等, 支持众多的传输层协议,如TFileTransport, TSocket等等。同时thrift还提供众多的服务器,如TNonblockingServer,TSimpleServer等等。

针对已有的thrift库,公司的架构部门结合内部的服务注册与发现机制(consul),内部定制了RPC服务框架kite(与开源kite框架不一样,只是名称相同)。

参考: 维基百科thrift,
Go高级编程第四章

你可能感兴趣的:(分布式)