Thrift2Protocal.java:
重写父类AbstractProxyProtocol的二个抽象方法doExport及doRefer即可,doExport用于对外暴露RPC服务,在这个方法里启动thrift server,dubbo service provider在启动时会调用该方法。而doRefer用于dubbo service consumer发现服务后,获取对应的rpc-client。
参考这个思路,avro也很容易集成进来:
AvroProtocol.java
不要忘记在META-INF/dubbo/internal下添加名为com.alibaba.dubbo.rpc.Protocal的文件,内容为:
接下来谈谈如何打包到dubbo的jar里:
dubbo-rpc/pom.xml里,把二个新增的项目加进来:
然后dubbo/pom.xml里:
dependencies节也要增加:
这样打包出来的dubbo-xxx.jar里,就包括新增的Protocol。至于google的protobuf,目前处于3.x -beta阶段,等以后出正式版了,再看情况整合起来。
最后,对dubbo/thrift/avro/rest这4种协议,做了下简单的对比测试,测试用例很简单:
客户端调用ping方法,服务器返回字符串"pong",在mac book pro上做5万次调用,结果如下:
这跟预期一致,REST走http协议,自然最慢,avro与dubbo底层的网络通讯都是借助netty实现,在同一个数量级,但是avro的二进制序列化效率更高,所以略快,而thrift则是从里到外,全都是facebook自己实现的,性能最优,完胜其它协议。
个人建议:对于一个服务接口,对外同时提供thrift、REST二种形式的服务实现,内部子系统之间用thrift方式调用(因为thrift跨语言,其实从外部进来的调用,也可以用thrift-rpc方式),一些不方便直接用thrift-client调用的场景,仍然走传统的REST.