zoukankan      html  css  js  c++  java
  • 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帮你生成好的代码,
    */
  • 相关阅读:
    Do You See Me? Ethical Considerations of the Homeless
    ELDER HOMELESSNESS WHY IS THIS AN ISSUE?
    Endoflife support is lacking for homeless people
    html内联框架
    html字体
    html块 div span
    html列表
    html表格
    SQL Server管理员专用连接的使用   作为一名DBA,经常会处理一些比较棘手的服务无响应问题,鉴于事态的严重性,多数DBA可能直接用“重启”大法,以便尽快的恢复生产环境的正常运转,但是多数情况
    如何配置最大工作线程数 (SQL Server Management Studio)
  • 原文地址:https://www.cnblogs.com/lixiaoxuan/p/8990648.html
Copyright © 2011-2022 走看看