美文网首页程序员
Apache Thrift 实现RPC通信笔记摘要

Apache Thrift 实现RPC通信笔记摘要

作者: 爱学习的蹭蹭 | 来源:发表于2019-04-19 22:25 被阅读3次

Thrift简要

  • thrift官方
  • Apache Thrift软件框架,用于可扩展的跨语言服务开发,将软件堆栈与代码生成引擎相结合,构建可在C ++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#之间高效无缝工作的服务, Cocoa,JavaScript,Node.js,Smalltalk,OCaml和Delphi等语言。
  • Thrift 是由Facebook开发的个框架,后贡献了Apache进行维护

Thrift特征(掌握点)

  • Thrift跟protobuf同样有自己的生成编译器以.thrif后缀文件
  • Thrift是一个典型的CS结构,客户端和服务器可以用不同Language开发,使用一种中间Language来关联客户端和服务端的语言,这种语言就是IDL(Inteface Description Language)
  • Thrift不支持无符号类型,很多语言都不存在无符号的类型,如:Java语言

Thrift的容器类型

  • Thrift的容器类型,集合中的元素可以是除了service之外的任何类型,包括Exception
  • List set map

Thrift的数据类型(掌握点)

  • byte 有符号的字节
  • i16 16位有符号的整数
  • i32 32位有符号的整数
  • i64 64为有符号的整数
  • double 64位浮点数
  • string 字符串

Thrift如何实现多语言之间的通信(重点)

  • 数据传输使用Socket(多种语言的支持)数据再以特定的的格式(String等)发送,接收方语言进行解析

Thrift工作原理(重点)

  • 定义thrift文件,有thrift文件(IDL)生成双方不同语言的接口,Model,在生成Model以及接口中的解码和编码的代码

Thrift语法与使用

  • 1、结构体(struct) 目的将一些数据聚合在一起,方便传输管理
  • 2、枚举、Exception规则与strut一样
  • 3、服务于Java创建Interface一样
  • 4、类型定义,类似c++ 一样,用typedef关键字对字段进行(起别名)
  • 5、常量:使用const关键字
  • 6、命名空间:组织代码,格式: namespace 语言名 路径
  • 7、文件包含(include),相当于c / c++ 中的include, Java中的import使用。
  • 8、注释:支持shell风格注释,支持C/C++风格的注释,即#和//开头的语句 /**/包裹的语句注释
  • 9、requied 必填,optional可选 (在开发过程中可选推荐使用)
  • 10、Thrift不支持Date类型,使用String的约束,用代码进行转换

Thrift重要的类说明(重点)

  • THsHaServer高可用的一个服务类(半同步,半异步)
  • TNonblockingServerSocket 非阻塞
  • serve方法是一个死循环
  • TCompactProtocol压缩协议,客户端和服务端的协议必须是要一致
  • TBinaryProtocol 二进制格式
  • TSimpleJSONProtocol 提供只写协议,生成一个文件,很容易通过传输方式脚本语言进行解析
  • TDebugProtocol使用易懂的可读文本格式,便于debug调试
  • TSocket 阻塞式的Socket
  • TFramedTancsport 以fram为单位进行传输非阻塞式服务中,使用一端向另外一端传输数据会切割frame的单位
  • TFileTransport 以文件进行传输
  • TMemoryTransport 将内存用于I/O
  • TZlibTransport 使用zlib进行压缩与其他传输方式使用

支持的服务模型

  • TSimpleServer 简单的单线程服务模型,常用于test
  • TThreadPoolServer 多线程服务模型使用标准的阻塞IO
  • TNonblockingServer 多线程服务模型使用非阻塞IO,需要使用TFramedTransport数据传输方式
  • THsHaServer - THsHa引入了线程池去处理,其模型把读写任务放到线程池去处理,Half-sync / Half-async的处理模型,Half-aysnc在处理IO事件上(accep、read、write )Half-sync用于Handler对RPC同步处理

thrift IDL多文件导入进行使用


namespace java com.flong.thrift.service.struct
namespace php com.flong.thrift.service.struct

const string VERSION = "1.0.1"

/****************************************************************************************************
* 为ThriftResult添加数据不完全和内部错误两种类型
* 枚举类型ThriftResult,表示返回结果,成功或失败,如果失败,还可以表示失败原因
* 每种返回类型都对应一个封装的结构体,该结构体其命名遵循规则:"Result" + "具体操作结果类型",结构体都包含两部分内容:
* 第一部分为枚举类型ThriftResult变量result,表示操作结果,可以 表示成功,或失败,失败时可以给出失败原因
* 第二部分的变量名为value,表示返回结果的内容;
*****************************************************************************************************/
enum ThriftResult
{
  SUCCESS,           /**成功*/
  SERVER_UNWORKING,  /**服务器处于非Working状态*/
  NO_CONTENT,        /**请求结果不存在*/
  PARAMETER_ERROR,   /**参数错误*/
  EXCEPTION,         /**内部出现异常*/
  INDEX_ERROR,       /**错误的索引或者下标值*/
  UNKNOWN_ERROR      /**未知错误*/
  DATA_NOT_COMPLETE      /**数据不完全*/
  INNER_ERROR    /**内部错误*/
}

/**bool类型返回结果*/
struct ResultBool 
{
  1: ThriftResult result,
  2: bool value
}

/**int类型返回结果*/
struct ResultInt
{
  1: ThriftResult result,
  2: i32 value
}

/**String类型返回结果*/
struct ResultStr
{
  1: ThriftResult result,
  2: string value
}

/**long类型返回结果*/
struct ResultLong
{
  1: ThriftResult result,
  2: i64 value
}

/**double类型返回结果*/
struct ResultDouble
{
  1: ThriftResult result,
  2: double value
}

/**list<string>类型返回结果*/
struct ResultListStr 
{
  1: ThriftResult result,
  2: list<string> value
}

/**Set<string>类型返回结果*/
struct ResultSetStr 
{
  1: ThriftResult result,
  2: set<string> value
}

/**map<string,string>类型返回结果*/
struct ResultMapStrStr 
{
  1: ThriftResult result,
  2: map<string,string> value
}


  • include关键字导入文件
namespace java com.flong.thrift.service
include "ThriftDataType.thrift"
service ThriftService
{
    /**
    *value 中存放两个字符串拼接之后的字符串
    */
    ThriftDataType.ResultStr getStr(1:string srcStr1, 2:string srcStr2),
    ThriftDataType.ResultInt getInt(1:i32 val)
}

使用thrift生成的代码结构

import java.io.IOException;

public class GenerateClass {
    public static void main(String[] args) {
        String thrifFile = "ThriftService.thrift";//
        //String strCmd = "./src/main/java/thrift-0.9.3.exe -r -gen java ./src/main/java/"+thrifFile;
        String strCmd = "./src/main/java/thrift-0.9.3.exe -r -gen php ./src/main/java/"+thrifFile;
        
        cmd2(strCmd);
    }
    
    protected static void cmd2(String thrifFile) {
        //thrift-0.9.3.exe -r -gen java D:\work\workspace\thriftworkspace\demo1\DemoHello.thrift
        
        try {
            Runtime.getRuntime().exec(thrifFile);
            System.out.println("执行完===");
        } catch (IOException e) {
            e.printStackTrace();
        } // 通过执行cmd命令调用protoc.exe程序
    }
}
thrift编辑器 编辑器生成的结构

推荐学习的博客

相关文章

网友评论

    本文标题:Apache Thrift 实现RPC通信笔记摘要

    本文链接:https://www.haomeiwen.com/subject/helhgqtx.html