每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序。

  做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯。采用http协议简单,但性能不高。采用TCP通讯,则需要考虑封包、解包、粘包等等很多因素,而且想写个高效的TCP服务,也很难。

  其实,对于此类需求,采用RPC(Remote Procedure Call Protocol)编程最靠谱。使用 RPC 编程被认为是在分布式环境中运行的客户机和服务器应用程序之间进行可靠通信的最强大、最高效的方法之一。

  Golang内置了对RPC支持,但只能适用于go语言程序之间调用,且貌似序列化、反序列化性能不高。如果go语言能使用Thrift开发,那么就如虎添翼了。可惜,thrift虽然很早就包含了golang的代码,但一直都存在各种问题无法正确执行,以至于GitHub上有许多大牛小牛自行实现的Thrift代码,但依然各种问题……直到0.9.1版本的发布!

  是的,最近,Apache Thrift 0.9.1正式发布了。新版的Thrift终于对Golang提供了完美的支持。经过实验,服务器端、客户端已经完美支持跨语言调用,且性能、尤其是内存占用上,编译型语言的特点展现出来,比java版的实现强了很多。

  下面,我们采用golang实现一个Thrift的Server端和Client端程序。

1、安装golang的Thrift包:

2、产生协议库:

  这是我定义的测试用IDL,为检验兼容性,采用了多种数据结构:

    3、生成开发库

  下载开发库编译器 http://www.apache.org/dyn/closer.cgi?path=/thrift/0.9.1/thrift-0.9.1.exe

  thrift-0.9.1.exe  -gen go RpcService.thrift

  自动生成出的源码结构如下:

其中 constants.go、rpc_service.go、ttypes.go 是协议库,编写程序需要用到。rpc_service-remote.go 是自动生成的例程,可以不用。

二、go语言实现

1、服务器端

下面,我们来写服务器端程序:

  加空行也不过才43行,怎么样简单吧。

2、客户端程序

  分别编译,先启动服务器端,然后在执行客户端程序。可以看到控制台正确打印出了信息,说明调用通过。

-->FunCall: 1380446325199 login map[name:qinerg passwd:123456]

三、Java版实现

  为了验证跨语言调用,下面我们分别再用java实现一下服务器端和客户端:

  生成Java版开发库:

  thrift-0.9.1.exe  -gen java RpcService.thrift

1、Java服务器版

2、Java客户端版

  好了,现在启动java版服务器端,用golang版客户端调用,完全没有问题。启动golang版服务器端程序,用java版客户端调用,同样OK。

  完美实现了跨语言调用。