zoukankan      html  css  js  c++  java
  • 探究thrift--Thrift C++ 服务器和客户端开发实例--学习笔记

    https://blog.csdn.net/feng973/article/details/70160571

    http://blog.jobbole.com/107828/

    https://blog.csdn.net/feng973/article/details/80434855

    上面的博客关于如何使用thrift已经说的很清楚了,下面就具体如何使用以及项目中如何使用进行说明(主要就c++,python来分别说明)

    先复习一下

     例子 - thrift接口描述文件
    #
    # 编写这个文件是为了教会你如何写thrift接口描述文件。
    # 第一个你应该掌握的知识点就是.thrift文件
    # 支持shell的注释方式,那就是用#符号。
     
    /**
    * 我们首先来复习一下thrift的常用数据类型,如下所示:
    *
    * bool 布尔型,1个字节
    * byte 有符号整数,1个字节
    * i16 有符号16位整型
    * i32 有符号32位整型
    * i64 有符号64位整型
    * double 64位浮点数值
    * string 字符串类型
    * binary 二进制数据类型(字节数组)
    * list 单类型有序列表,允许有重复元素
    * set 单类型无需集合,不允许有重复元素
    * map<t1,t2> Map型(key:value)
    *
    * 你发现了么,.thrift文件还支持C语言的多行注释形式。
    */
     
    // 不卖关子了,其实我们还支持C语言的单行注释形式呢 ^_^
     
    /**
    * .thrift文件可以引用其他.thrift文件,这样就可以方便地把一些公共结构和服务囊括进来。
    * 在引用其他.thrift文件时,既可以直接引用当前文件夹下的文件,也可以引用其他路径下的
    * 文件,但后者需要在thrift编译工具编译时加上-I选项来设定路径。
    *
    * 如果希望访问被包含的.thrift文件中的内容,则需要使用.thrift文件的文件名作为前缀,
    * 比如shared.SharedObject。我们在本例中引用了文件shared.thrift。
    */
    include "shared.thrift"
     
    /**
    * Thrift支持对.thrift文件中的类型设定namespace,这样可以有效避免名字冲突。
    * 这种机制在C++中也叫做namespace,而在Java中叫做Package。
    * thrift支持针对不同的语言设置不同的namespace,比如下面的例子。
    * thrift会在生成不同语言代码时,进行相应的设置。
    */
    namespace cpp tutorial
    namespace go tutorial
    namespace java tutorial
    namespace php tutorial
    namespace perl tutorial
     
    /**
    * thrift还可以使用typedef来给类型起别名。
    */
    typedef i32 MyInteger
     
    /**
    * Thrift也支持定义常量。
    * 对于结构复杂的常量,支持使用JSON形式来表示。
    */
    const i32 MY_NUM = 9853
    const map<string,string> MY_MAP = {'hello':'world', 'goodnight':'moon'}
     
    /**
    * 你还可以定义枚举类型, 其被指定为32位整型。域的值是可以自定义的,而且
    * 当不提供域的值时,默认会从1开始编号并递增。
    */
    enum Operation {
    ADD = 1,
    SUBTRACT = 2,
    MULTIPLY = 3,
    DIVIDE = 4
    }
     
    /**
    * 结构体则是一个复杂的数据类型。它由多个域组成,每个域会对应一个整数标识符,
    * 每一行的格式为:一个冒号,一个类型,一个域名称和一个(非必填的)默认值。
    *
    * 每个域都可以设置为optional或required来表示是否为必填域,以便thrift决定是否
    * 在数据传输时要包含这个域。不指定时,默认为required。
    */
    struct Work {
    1: i32 num1 = 0,
    2: i32 num2,
    3: Operation op,
    4: optional string comment,
    }
     
    /**
    * 在语法上,异常的定义方式和结构体是完全一样的。在发生问题时,可以抛出异常。
    */
    exception InvalidOperation {
    1: i32 what,
    2: string why
    }
     
    /**
    * 啊哈,我们现在到了最Cool的环节,即定义服务。
    * (一个服务可以使用extends来继承另一个服务。)
    */
    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),
     
    /**
    * 如下的这个方法有一个oneway修饰符,还记得他的作用么
    * 这表示这个方法在调用后会立即返回,不会等待远端的回复。
    * 要注意的是,oneway只能修饰void返回类型。
    * oneway在英语里就是“单向”的意思,还是很形象滴。
    */
    oneway void zip()
     
    }
     
    /**
    * 在你使用thrift编译工具编译此文件后,
    * 会在当前目录产生一个“gen-<你选择的开发语言>”
    * 文件夹,比如你选择的是C++语言,则会产生gen-cpp文件夹,
    * 里面放着的便是thrift帮你生成好的代码,
    * 代码并不那么晦涩,你可以打开看一看。
    */

    总结:

      https://www.cnblogs.com/tianhuilove/archive/2011/09/05/2167669.html

      

    来一个实际一点的例子

    例子(1)

    thrift接口文件student.thrift

    struct subjectscore
    {
        1: required    string     str_subject,       //科目
        2: required    i32        i_score,           //分数
    }
    
    struct student
    {
        1: optional list<subjectscore> list_subscores,
        2: required i32 i_uid,                  //学号
        3: required string str_name,            //姓名
        4: optional string str_sex,             //性别
    }
    
    struct sturesult
    {
        1: required i32 i_uid,                  //学号
        2: required string str_name,            //姓名
        3: optional string str_sex,             //性别
        4: required i32 i_subscore,            //总分
        5: required i32 i_avescore,            //平均分
        6: required string str_maxsub,            //最高分科目
        7: required string str_mixsub,            //最低分科目
    }
    
    service StudentServ
    {
        sturesult work_score(1: student stu)
    }

    https://www.cnblogs.com/cqvoip/p/8078975.html

  • 相关阅读:
    iOS APM性能统计
    iOS promise
    静态代码检测工具Infer的部署
    ES读写数据的工作原理
    关于 Elasticsearch 内存占用及分配
    Elasticsearch中数据是如何存储的
    ES中的选举机制
    .net core 3.1 webapi解决跨域问题 GET DELETE POST PUT等
    .net framework WEBAPI跨域问题
    Angular前端项目发布到IIS
  • 原文地址:https://www.cnblogs.com/bwbfight/p/9314525.html
Copyright © 2011-2022 走看看