Apache Thrift
Thrift 是一种接口描述语言,通过二进制通信协议为多种编程语言定义和创建服务。Thrift是一种可扩展的跨语言服务的RPC框架,由Facebook开发并且开源。
应用
安装
MAC
brew install thrift
其他安装方式
下载安装包:http://www.apache.org/dyn/closer.cgi?path=/thrift/0.9.3/thrift-0.9.3.tar.gz
解压后进入目录执行:./configure && make
编写IDL文件
安装好Thrift之后需要创建一个.thrift结尾的文件。该文件定义了thrift中的类型和服务。这些被定义的服务将被实现且能够被客户端调用。
IDL即:Interface definition language 接口描述语言,它是Thrift自己的一套接口定义语法。官方语法定义如下:
根据语法,编写简单的IDL文件如下:
文件名: exampleService.thrift
接口定义如下:
接口定义完成之后生成响应语言的代码,执行:thrift -r -gen php:server -v -strict -out /path/to/code/ /path/to/exampleService.thrift
服务实现
服务定义好之后,需要实现服务,实现服务的文件名称:PhpService.php,内容如下:
详细的代码请查看:thrift_example_code
启动服务
在nginx配置中添加如下配置,监听服务:
其中的fastcgi_param参数的值是PhpService.php文件的绝对路径.
执行nginx -s reload重启nginx。
客户端代码
客户端文件名:PhpClient.php,内容如下:
详细的代码请查看:thrift_example_code
执行客户端
执行客户端代码,请求服务。
在PhpStorm中执行PhpClient.php文件,会自动打开默认浏览器,通过浏览器执行POST请求,将请求发送到nginx。
打印输出如下:
可以看到返回的数据结构和我们的thrift文件中定义的数据结构是一模一样的。
远程部署与访问
上面的服务端代码和客户端代码可以部署到不通的主机上,实现远程调用。而且,客户端代码可以有多种实现方式,比如JAVA,Python等。
问题
- 多个客户端如何保证服务端解析代码的一致性呢?
- 服务端代码和客户端代码该如何在应用中管理呢?
等等一致性问题都可以通过composer来管理。