RPC框架之thrift学习笔记之一
前言
在今年一月份准备大三实习,很幸运拿到几家公司的offer。目前也入职在猫眼娱乐实习。进来开始接触RPC框架,之前在学校还不懂也没有机会尝试这一块,so 现在把自己学到的记录一下。
RPC(Remote Procedure Call)
RPC即远程过程调用,是一个计算机通信协议,该协议允许运行于一台计算机的程序调用另外一台计算机的子程序,而程序员无需额外地为这个交互作用编程。
目前常见的RPC开源框架有:
- Thrift(Facebook开源,支持多语言)
- gRPC(Google开源,支持多语言)
- Dubbo(国内阿里巴巴开源,多数应用于Java)
- motan(国内新浪微博开源,支持Java、Go、PHP)
Thrift RPC框架
为啥会出现RPC框架?一个公司内部不同接口服务可能使用的语言不一样,比如Java、PHP、Go、Python等等。各种语言混合使用,为了实现跨平台、跨语言的服务调用,产生出这些RPC框架。RPC使用接口描述语言
即(interface description language IDL)进行接口的定义,至于接口实现的使用不同语言,调用也是一样,可以多语言混合调用。所以在使用之前我们都会写一个接口文件,然后再对其进行实现。
Thrift安装
如果你是Mac用户,结合brew安装thrift很简单。不会安装brew包管理工具?这里博主有一篇文章介绍哦
brew install thrift # 即可
而对于Windows、Linux用户来说官方给出相应的安装方法,这里就不在累赘啦。(可能Windows用户安装起来麻烦一点。) 官方安装教程
Thrift类型系统
对于写个接口的童鞋们都知道,定义接口时候都会有需要什么类型的参数,返回类型有是啥。不例外,thrift类型系统就是解决这个的,但是对于接口实现的语言不同,定义接口thrift通过一个统一的书写定义,最后通过编译产生指定语言的接口文件。
命名空间
这个好理解吧,写个Java的都知道有一个叫做package包, 统一个包中类名不能重复,不同包中类名可以相同,因此有一个命名空间的说法来区分(namespace)。 # 例子 namespace java com.icharle.thrift.user # java 就是定义说明编译生成Java接口 而后面的com.icharle.thrift.user 就是命名空间 namespace py user.api # python例子 namespace php App.Library.Thrift.Client # PHP例子
基本类型
bool:布尔值(true或false) byte:8位有符号整数 i16:16位有符号整数 i32:32位有符号整数 i64:64位有符号整数 double:64位浮点数 string:字符串 注意没有无符号整数类型。这是因为许多编程语言中没有无符号整数类型。
服务
# 等同于在面向对象的编程中定义接口,也就是定义接口 service sayHello { # 这样相当于有一个sayHello抽象类,然后再里面定义sayHelloWorld方法并且这个方法需要一个字符串参数 void sayHelloWorld(1:string message); }
结构体
# struct有一组强类型字段,每个字段都有唯一的名称标识符。等同于没有继承的类。跟写C语言的结构体差不多。 # 像这样定义接口返回类型的类 struct Response { 1: i32 code; // 返回状态码 2: string msg; // 码字回提示语名 3: string data; // 返回内容 }
容器类型
# Thrift容器是强类型容器,可映射到大多数编程语言中常用和常用的容器类型。 1. list 有序的元素列表,元素可以重复。 2. set 一组无序的元素,元素不可重复。(注意:PHP不支持集合,因此它被视为类似于List) 3. map<K, V> k-v映射对应,Java HashMap,PHP关联数组,Python / Ruby字典
特殊类型
binary:一系列未编码的字节
异常
# 异常在功能上等同于结构。 exception Invalid { 1: i32 code; // 返回状态码 }
编译接口文件
当你按照你的业务需求,编写好thrift接口文件,你需要用thrift进行编译产生对应语言的接口类。
# Java例子
thrift --gen java -out ./src/main/java/(这个是编译后产生的类的文件存放位置) hello.thrift(你实际的thrift文件位置)
# Python例子
thrift --gen py -out ../ hello.thrift
# PHP例子
thrift -gen -out ../ php:server,psr4 hello.thrift # 生成服务端 psr4是PHP一种规范,可以不添加。
thrift -gen -out ../ php,psr4 hello.thrift # 生成客户端