这两天看了好多关于thrift gprc的资料和文档,但依旧有点问题,虽然服务最后跑起来了,但是要解决的还有很多问题。
做一下总结 也算是自己组都梳理
thrift总的来说就是一个中间件。一般用来作为扩展进行跨语言的服务开发
自上而下分为四层,在程序编写中这四层是不可获取的就像是消息中心那样每一个组件都有必须的意义
Transport(包含了TCP,HTTP等)网络传输
有网络传输当然就有协议
Protocol(JSON等)传输协议
数据传输需要有载体有信道
Processor 负责RPC接口处理函数的分发,IDL定义接口的实现,服务的停留注册
该准备的都准备好了,那么就要ps 了。生成服务进程
Server 服务器调度 可以是单线程也可以是多线程
Thrift自身的特性应该就是还是老一套,C/S模式,通过专门的代码生成工具来生成指定语言的服务端代码和客户端代码可以高效率的进行数据传输,从而实现跨语言。客户端调用服务,服务端提供服务,在protocol这一层定义数据传输格式,在transport层定义传输方式合起来可以视为运行库或扩展。
https://studygolang.com/articles/3110 详细的可以指看看 我这里用的是go和php结合也就以此为例
golang 使用thrift要先获取thirft包,上面连接里的是apache官方的包,但是网上有不少修改的用起来比较方便,有兴趣可以找找。
在者就是下载代码生成工具thrift.exe这个百度一下就知道了
当一切准备工作做好,就要先开始做跨语言了
先是创建一个IDL文件也就是thrift的文件,这个作为接口文件也有着各种基本的数据类型
- bool: 布尔值 (true or false), one byte
- byte: 有符号字节
- i16: 16位有符号整型
- i32: 32位有符号整型
- i64: 64位有符号整型
- double: 64位浮点型
- string: Encoding agnostic text or binary string
- struct 结构体
注意:thrift不支持无符号,这个在使用的时候要注意
在创建thrift IDL文件时要一点的就是 除了上述的类型 还有数据容器
list(t) :元素类型为t的有序表,允许元素有重复,针对不同语言,java有相应的list php的就等于下标自增的数组
set(t) :元素类型为t的无序表,不容许元素重复。对应c++中的set,java中的HashSet,python中的set,php中没有set,则转换为list类型
map(t,t) :(key)键类型为t,(value)值类型为t的kv对,(key)键不容许重复。对用c++中的map, Java的HashMap, PHP 对应 array, Python/Ruby 的dictionary
上面三种也都是语言常用的类型基本上满足所有语言的相互调用
接口文件建好后,使用thrit --gen <语言>go XXX.thrift 生成go<语言>的使用接口代码,当然服务器端和客户端命令和生成的代码包不一样
创建Go Server端代码 环境要先获取thrift包 将thrift生成的开发库放到GOPATH中,一般go项目都会有mod文件,也可以直接
go mod tidy 这里要设置环境env
然后我们就可以进行thrift运行代码实现了,在入口文件main.go中
先设置传输层transportFactory 再确定传输协议protocolFactory 这些都可以使用go get已经获取到的包里面现有默认方法
先初始化processer 生成进程载体(处理器),将现有项目的service注册到处理器中,使用serverTransport绑定ip端口进行监听,将上述四层放入server层(服务),开启服务监听端口调用。
以上就是服务器层的配置
php端的设置和服务端相似,thrift --gen php XXX.thrift 生成gen-php将该文件夹下的所有内容复制到php项目的指定文件目录(最好放外层自己订只要能调用)
https://github.com/apache/thrift 将thrift包下载到项目根目录下