MENU

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 # 生成客户端
标签: RPC, Thrift
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码