• Thrift接口简介


    参考地址:http://roclinux.cn/?p=3316

    【thrift是什么】

    计算机技术里一款著名的通信框架 – thrift框架

    thrift的全名叫做Apache thrift,是一款软件开发RPC(remote procedure call,远程过程调用)框架,可以很高效地实现跨语言的RPC服务(远程过程调用协议)

    (什么是RPC?https://baike.baidu.com/item/远程过程调用协议?fromId=32726&redirected=seachword)

    【还有哪些RPC框架】

    protobuf、Avro、MessagePack等

    【为什么使用thrift】

    项目举例:

    给“托福考试成绩数据库”增加一个“成绩查询”的功能,客户端提供“用户ID”向服务器端发起查询请求,服务器端接到查询请求后从数据库中取回此用户ID对应的姓名和成绩,并返回给客户端。

    上图是CS架构的数据传输,正常的话,开发同学就需要考虑三次握手,四次挥手,还要考虑服务端跟客户端的语言是否一致,编写大量代码,实现需求。

    但是如果使用thrift工具的话,只需要调用下RPC框架工具,就可以直接生成上述所有代码。即使语言不通。大大简化了开发的工作量

    【怎么使用thrift】

    1. 明确交互的数据类型(例UserGradeInfo),和方法(search),定义thrift接口描述文件

    2. 调thrift工具,依据thrift接口文件,生成RPC代码

    3. 服务器端程序引用PRC代码,实现其中的search动作逻辑,启动监听,等待客户端发送请求

    4. 客户端引用RPC代码,与服务端通信

    【thrift实例】

    我们来定义上面的thrift文件

    //定义数据类型-结构体

    struct UserGradeInfoTDto{

      1: string userName;

      2: double userGrade;

    }

    //项目举例,项目中的接口文件描述的还是比较简单易懂的,结构体定义比较简单,服务的定义就是:返回数据对象   方法名称(参数...)

    namespace java com.sogou.adm.bizdev.griffin.thrift.dto.accountinfo
    
    struct AccountBaseTDto{
        1:  i64 accountId;
        2:  string email;
        3:  string companyName;
        4:  string status;
        5:    i64 agentId;
    }
    
    struct KaAchievementAccountTDto{
        1:  i64 accountId;
        2:  string companyName;
    }
    
    struct AgentBaseInfoTDto{
        1: i64 agentId;// 代理商ID
        2: string agentName;// 代理商名称
        3: i32 agentType;// 代理商类型
        4: i32 contract;// 签署公司:搜狗信息or搜狗网络
        5: i32 agentAchievementType;// 业绩归属,记中小业绩or记KA业绩
        6: string channelName;//渠道经理
        7: i64 channelId;// 渠道经理ID
        8: string status;// 状态
    }
    
    struct AgentBaseInfoApiTResult{
        1: bool success;// 成功标识
        2: string message;// 返回消息
        3: list<AgentBaseInfoTDto> agentList;// 代理商列表
    }
    accountbaseinfodto.thrift
    namespace java com.sogou.adm.bizdev.griffin.thrift.iface.account
    
    include "accountbaseinfodto.thrift"
    
    service QueryAccountInfoTService {
          //根据agentName查询计ka业绩代理商
        list<accountbaseinfodto.KaAchievementAccountTDto> getKaAchievementAgentByName(1:string agentName);
        // 根据代理商名称(模糊查询)、代理商类型、计业绩类型,查询代理商信息
        accountbaseinfodto.AgentBaseInfoApiTResult getAgentListByNameTypeAchivement(1:string agentName, 2:i32 agentType, 3: i32 achivementType);
    }
    queryaccountinfo.thrift

    //服务定义,可以继承其他服务,

    service Calculator extends shared.SharedService {

    /**

    * 服务中方法的定义非常类似于C语言的语法。它会包括一个返回值,
    * 一个参数列表以及一个可以抛出的异常列表(可选)
    * 可以提前告诉大家的是,定义参数列表的方法、定义异常列表的方法,
    * 和定义结构体的方法都是相似的,可以从下面的例子中看出。
    * 除了最后一个方法,其他的方法最后都要有一个逗号,大家可不要忽略这个细节。
    公式:
     返回数据对象   方法名称(参数...)
    */
     
    void ping(),
     
    i32 add(1:i32 num1, 2:i32 num2),
     
    /**
    * 在异常列表前,需要加throws关键字。
    */
    i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),

    list<struct UserGradeInfoTDto> getuserGradeByName(1: string userName);

    /**
    * 如下的这个方法有一个oneway修饰符,还记得他的作用么
    * 这表示这个方法在调用后会立即返回,不会等待远端的回复。
    * 要注意的是,oneway只能修饰void返回类型。
    * oneway在英语里就是“单向”的意思,还是很形象滴。
    */
    oneway void zip()
     
    }

    /**

    * 在你使用thrift编译工具编译此文件后,
    * 会在当前目录产生一个“gen-&lt;你选择的开发语言&gt;”
    * 文件夹,比如你选择的是C++语言,则会产生gen-cpp文件夹,
    * 里面放着的便是thrift帮你生成好的代码,
    */
  • 相关阅读:
    error C2143: syntax error : missing ';' before 'type'
    【剑指Offer面试编程题】题目1360:乐透之猜数游戏--九度OJ
    【剑指Offer面试编程题】题目1362:左旋转字符串--九度OJ
    【剑指Offer面试编程题】题目1361:翻转单词顺序--九度OJ
    【剑指Offer面试编程题】题目1354:和为S的连续正数序列--九度OJ
    【剑指Offer面试编程题】 题目1350:二叉树的深度--九度OJ
    Oracle个人自学笔记
    【转载】Oracle sqlplus中最简单的一些命令,设置显示的格式
    IntelliJ IDEA常用快捷键大全
    凤凰系统(Phoenix OS)PC版安装,电脑上体验功能丰富的安卓系统
  • 原文地址:https://www.cnblogs.com/lixiaoxuan/p/8990648.html
Copyright © 2020-2023  润新知