作为 多种语言 rpc 通信的王者,Thrift无疑是最为突出的,尤其在现在讲究 微服务 中,前后端分离的思想,现在常用的前后端分离的语言搭配经常是这样的。
后端 java 前端 nodejs
后端 java 前端 swift【ios】
后端 java 前端 python
后端 golang 前端 nodejs
后端 golang 前端 php
后端 scala 前端 nodejs
后端 c# 前端 nodejs
可以看到八大语言 几乎全部可以通过Thrift 支持 多种语言RPC通信
今天首先使用 mac 通过实例安装 Thrift 并运行Thrift实例,实现了 java 与 python 与nodejs 的Rpc通信 及其自己语言server和client对调。
1.mac 安装 Thrift
使用 homebrew 安装 Thrift 0.10.0
在Terminal 中 brew install thrift
如果安装成功后 ,输入 thrift 会有相关输出
2.创建一个 后缀为 .thrift 的文件,比如 user.thrift
编写thrift文件内容,主要是两大块 ,struct 结构类似 java bean,service 结构类似 java 的接口 interface,在struct中 写字段,需要在字段前 写 index: ,例如 1:i32 age, 2:bool gender,在service中写方法的声明,不许写方法体。
写完后点击保存,然后 编译 thrift文件生成 对应的 语言 代码,从Terminal 进入到thrift 的目录 ,比如 我们服务端是使用java ,客户端使用nodejs 和 python 移动端 swift ,那我们需要生成 java 和nodejs python swift 的代码。命令如下:
thrift --gen java user.thrift #生成java 代码,在 gen-java 目录中
thrift --gen js:node user.thrift # 生成 nodejs 代码 在 gen-node 目录中
thrift --gen py user.thrift # 生成 python 代码 在 gen-py 目录中
新建 java maven 服务端项目,首先需要引入 thrift jar 包依赖,然后将 gen-java目录中的java 文件 复制粘贴到 该java 服务项目中,创建thrift service 的实现类,并实现重写 Iface中的 其声明的方法,并编写 socket server 类,之后使用 java Application 运行 该socket server 类 main()方法,监听 客户端请求。
新建 nodejs express 客户端项目, 首先 nodejs 需要安装 thrift ,
sudo npm -g -dev install thrift
将thrift 编译生成的gen-node 中的js 代码 全部复制粘贴到 nodejs客户端项目中。引入 thrift 依赖 ,调用thrift 相关接口,实现客户端调用,nodejs 在回调时 的数据在解析 会遇到一些小小的问题,出现 【object promise】等于是半成品,需要下功夫修改。
新建 python 项目 客户端,首先 python 也需要安装 thrift ,我使用 python 3.5
sudo pip install thrift
将之前 thrift文件生成的gen-py目录下的文件复制粘贴到 python 客户端项目中,引入thrift 依赖,调用 thrift 相关接口,实现客户端调用,python 3.5 由于不兼容 python 2.*版本 在这里调试会修改一些代码 ,另外 调用本地 gen-py 包 在pycharm 会标红线,但是不影响使用。
其中 需要注意的就是 thrift文件 的service 中方法的定义一定要清晰明确,struct的字段也类似,否则如果有 接口的修改,就需要 更新thrift文件,重新生成 对应的语言代码,还是非常容易引起冲突 出错。
thrift 的 相关组件 需要深入了解 Transport ServerSocket Protocol Process Sever ,只有了解他们的具体使用原理才可以灵活运用
相关的代码 ,会在之后整理 上传到 github中