thrift

Leo_wlCnBlogs Leo_wlCnBlogs     2022-08-23     246

关键词:

Thrift

公司的一些平台服务框架底层封装了thrift提供服务,最近项目不是很紧,于是研究了一下,刚刚入门,理解得不深,写这篇博文来整理一下思路.

什么是thrift?

  简单来说,是Facebook公布的一款开源跨语言的RPC框架.

  那么问题来了.

  什么是RPC框架?

    RPC全称为Remote Procedure Call,意为远程过程调用.

    假设有两台服务器A,B.A服务器上部署着一个应用a,B服务器上部署着一个应用b,现在a希望能够调用b应用的某个函数(方法),但是二者不在同一个进程内,不能直接调用,就需要通过网络传输,在AB服务器之间建一条网络传输通道,a把参数传过去,b接收到参数调用自己的方法,得到结果,再通过网络传回给a,简单讲就是A通过网络来调用B的过程.这个过程要涉及的东西很多,比如多线程,Socket,序列化反序列化,网络I/O,很复杂,于是牛掰的程序员把这些封装起来做成一套框架,供大家使用,就是RPC框架.       

  thrift的跨语言特型

    thrift通过一个中间语言IDL(接口定义语言)来定义RPC的数据类型和接口,这些内容写在以.thrift结尾的文件中,然后通过特殊的编译器来生成不同语言的代码,以满足不同需要的开发者,比如java开发者,就可以生成java代码,c++开发者可以生成c++代码,生成的代码中不但包含目标语言的接口定义,方法,数据类型,还包含有RPC协议层和传输层的实现代码.

  thrift的协议栈结构

   thrift是一种c/s的架构体系.在最上层是用户自行实现的业务逻辑代码.第二层是由thrift编译器自动生成的代码,主要用于结构化数据的解析,发送和接收。TServer主要任务是高效的接受客户端请求,并将请求转发给Processor处理。Processor负责对客户端的请求做出响应,包括RPC请求转发,调用参数解析和用户逻辑调用,返回值写回等处理。从TProtocol以下部分是thirft的传输协议和底层I/O通信。TProtocol是用于数据类型解析的,将结构化数据转化为字节流给TTransport进行传输。TTransport是与底层数据传输密切相关的传输层,负责以字节流方式接收和发送消息体,不关注是什么数据类型。底层IO负责实际的数据传输,包括socket、文件和压缩数据流等。

MAC OS下thrift的下载与安装

  我的电脑是mac,第一次安装也碰到了一些问题,所以有必要记录一下.

  首先,在官网下载安装包http://thrift.apache.org/download 目前官网是0.10.0版本.下载完之后解压到想要安装的目录.

  进入根目录:

step1:cd thrift-0.10.0
step2:./configure
step3:make
step4:make install

  安装的时候,第二步出现了问题,提示:

Bison version 2.5 or higher must be installed on the system!

  原因是Bison版本过低,mac默认安装的版本是2.3,因此需要安装最新版的Bison,命令行输入:brew install bison安装最新版bison,如果你的命令行反馈:Command not found,很可能是因为你没装homebrew,命令行输入:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  等待安装完homebrew就可以安装bison了,最新版本3.0.4安装完以后,执行第二步,发现依然提示上面那个警告,原因是因为它读取的仍然是默认的bison,于是找到系统安装的bison目录,我的mac是

/Library/Developer/CommandLineTools/usr/bin/bison,解决方法也比较简单,可以先将这个目录下的bison名字改一下,再将最新版的bison复制进来,于是,在bin目录下,执行命令:

sudo mv bison bison111

sudo cp /usr/local/opt/bison/bin/bison  /Library/Developer/CommandLineTools/usr/bin/

  现在,再按照上面的步骤进行下去,就可以正确安装thrift了.

进入thrift大门的第一个java小实例

   1,创建一个服务Hello,创建文件Hello.thrift,代码如下:

namespace java service.demo
service Hello{
    string helloString(1:string para)
}

  这里定义了一个名为helloString的方法,入参和返回值都是一个string类型的参数.

   2,终端进入Hello.thrift所在目录,执行命令:

thrift -r -gen java Hello.thrift

  发现在当前目录下多了一个gen-java的目录,里面的有一个Hello.java的文件.这个java文件包含Hello服务的接口定义Hello.Iface,以及服务调用的底层通信细节,包括客户端的调用逻辑Hello.Client以及服务端的处理逻辑Hello.Processor,

   3,创建一个Maven管理的Java项目,pom.xml中添加相关的依赖,并将Hello.java文件复制到项目中:

复制代码
    <dependency>
      <groupId>org.apache.thrift</groupId>
      <artifactId>libthrift</artifactId>
      <version>0.10.0</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.5</version>
    </dependency>
复制代码

       4,创建HelloServiceImpl实现Hello.Iface接口:

复制代码
package service.demo;
import org.apache.thrift.TException;
/**
 * @author yogo.wang
 * @date 2017/02/21-下午2:13.
 */
public class HelloServiceImpl implements Hello.Iface {
    public String helloString(String para) throws TException {
        return "result:"+para;
    }
}
复制代码

  5,创建服务端实现代码HelloServiceServer,把HelloServiceImpl作为一个具体的处理器传递给Thrift服务器:

复制代码
package service.demo;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;

/**
 * @author yogo.wang
 * @date 2017/02/21-下午2:15.
 */
public class HelloServiceServer {
    /**
     * 启动thrift服务器
     * @param args
     */
    public static void main(String[] args) {
        try {
            System.out.println("服务端开启....");
            TProcessor tprocessor = new Hello.Processor<Hello.Iface>(new HelloServiceImpl());
            // 简单的单线程服务模型
            TServerSocket serverTransport = new TServerSocket(9898);
            TServer.Args tArgs = new TServer.Args(serverTransport);
            tArgs.processor(tprocessor);
            tArgs.protocolFactory(new TBinaryProtocol.Factory());
            TServer server = new TSimpleServer(tArgs);
            server.serve();
            }catch (TTransportException e) {
            e.printStackTrace();
        }
    }
}
复制代码

  6,创建客户端实现代码HelloServiceClient,调用Hello.client访问服务端的逻辑实现:

复制代码
package service.demo;

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

/**
 * @author yogo.wang
 * @date 2017/02/21-下午2:35.
 */
public class HelloServiceClient {

    public static void main(String[] args) {
        System.out.println("客户端启动....");
        TTransport transport = null;
        try {
            transport = new TSocket("localhost", 9898, 30000);
            // 协议要和服务端一致
            TProtocol protocol = new TBinaryProtocol(transport);
            Hello.Client client = new Hello.Client(protocol);
            transport.open();
            String result = client.helloString("哈哈");
            System.out.println(result);
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        } finally {
            if (null != transport) {
                transport.close();
            }
        }
    }
}
复制代码

  全部工作完成后,下面来测试一下,先执行服务端main方法,在执行客户端main方法,会在客户端控制台打印出:result:哈哈.

相关博文:

Thrift入门初探(2)--thrift基础知识详解

参考文章:

     Apache Thrift - 可伸缩的跨语言服务开发框架

     Thrift RPC框架介绍

 
 
标签: thrift

thrift快速入门

Thrift简单示例2017-01-1916:47:57首先通过先面两个示例简单感受一下Thrift(RPC)服务端与客户端之间的通信......RPC学习----Thrift快速入门和Java简单示例Thrift入门及Java实例演示Thrift是什么?Thrift源于大名鼎鼎的facebook之手,在2007年facebo... 查看详情

thrift关键字

在编译thrift文件的时候发现报了如下的错误Cannotusereservedlanguagekeyword:"class"后来查了一下,发现class是thrift的关键字之一,变量起名的时候不能和关键字重复thrift的全部关键字可以查看thrift的源码https://github.com/apache/thrift/blob/master/comp... 查看详情

thrift安装

下载thrift版本:thrift-0.10.0解压并安装tar-zxfthrift-0.10.0.tar.gzcdthrift-0.10.0/./configuresudomakesudomakeinstall验证:  thrift-version 查看详情

thrift官方安装手册(译)

本篇是Thrift官网安装文档的翻译,原地址点击这里。Thrift之前是不支持Windows的。但是似乎0.9版本以后已经支持Window了。介绍了Thrift安装的环境要求以及在centos,Debian/Ubuntu,OSX和Windows下的安装过程。并提出了一些安装过程中可能遇... 查看详情

thrift基础知识

1. 架构图Thrift包含一个完整的堆栈结构用于构建客户端和服务器端。下图描绘了Thrift的整体架构。图1.架构图如图所示,图中黄色部分是用户实现的业务逻辑,褐色部分是根据Thrift定义的服务接口描述文件生成的客户端和服... 查看详情

thrift基础教程安装篇

1、Thrift简单介绍Thrift是一款由Fackbook开发的可伸缩、跨语言的服务开发框架,该框架已经开源而且增加的Apache项目。Thrift主要功能是:通过自己定义的Interface Definition Language(IDL)。能够创建基于RPC的client和服务端的服务代... 查看详情

thrift框架-安装

1.前言今天接触了使用PRC【远程过程调用协议】的Thrift框架 ,留下随笔心得,这是安装篇2.下载去apache官网下载Thrift脚本编译程序,window则下载一个exe文件,然后将文件的路径设置在系统环境变量path即可Thrift下载地址: &... 查看详情

thrift开发笔记(代码片段)

thrift开发笔记(4种由易到难的匹配系统)准备工作创建项目文件夹thrift_project业务逻辑图游戏节点,创建game文件夹;匹配系统节点,创建match_system文件夹;thrift相关文件,创建thrift文件夹thrift简单语法介绍使用Thrift开... 查看详情

thrift开发笔记(代码片段)

thrift开发笔记(4种由易到难的匹配系统)准备工作创建项目文件夹thrift_project业务逻辑图游戏节点,创建game文件夹;匹配系统节点,创建match_system文件夹;thrift相关文件,创建thrift文件夹thrift简单语法介绍使用Thrift开... 查看详情

Thrift RPC 从 c# 中的 thrift 客户端失败到在 HBase 服务器上旋转的 thrift 服务器

】ThriftRPC从c#中的thrift客户端失败到在HBase服务器上旋转的thrift服务器【英文标题】:ThriftRPCfailingfromathriftclientinc#toathriftserverspinnedoverHBaseserver【发布时间】:2014-01-0612:42:36【问题描述】:我正在做一个项目,我正在尝试从C#客户... 查看详情

跟我学thrift4:由浅入深thrift文件

参考技术A我们以顾客下单买车为例子,来深入了解下Thrift的一些细节1.自定义标识符VS自动标识符2.OptionalVSRequiredVSDefault3.struct的组合(struct不支持继承)首先是Thrift文件定义如下:namespacejavacom.whp.demo.thrift.optionalstructCar1:requiredi32... 查看详情

thrift说明(代码片段)

thrift链接:https://www.cnblogs.com/sxrtb/p/12209455.html一总体介绍  thrift中主要文件包括.thrift文件(其中包括访问的接口、接口中的相关字段和异常处理等),服务器端实现.thrift文件中的接口文件(可以处理相关异常),服务器根据thrift... 查看详情

调用thrift出现nohandlerscouldbefoundforlogger"thrift.transport.tsocket"

1.问题使用thrift版本为0.10,在0.8没有这个问题其中ncTAgent是代码中封装的thrift接口的结构,在thrift服务端没有启动的时候,应该拋错为连接不到。但是拋错的堆栈输出之前,还有一句日志异常错误。这是不期望出现的>>>from... 查看详情

thrift安装(代码片段)

安装thrift-0.9.2步骤如下:1.下载#wgethttp://archive.apache.org/dist/thrift/0.9.2/thrift-0.9.2.tar.gz2.安装依赖#yum-yinstallautomakelibtoolflexbisonpkgconfiggcc-c++boost-devellibevent-develzlib-develpython-develrub 查看详情

thrift入门

从官网介绍看应该是个RPC框架,通过thrift定义接口,根据thrift文件生成各种语言的代码,c++,python,java....这里工作主要用到java。从晚上抄了个乘法的例子1.pom依赖<dependency><groupId>org.apache.thrift</groupId><artifactId>libth... 查看详情

Thrift 库:TServerEventHandler 的使用

】Thrift库:TServerEventHandler的使用【英文标题】:ThriftLibrary:UsageofTServerEventHandler【发布时间】:2014-10-1310:49:13【问题描述】:我是Thrift新手,我想知道是否有任何方法可以知道/区分传入Thrift服务器和前往Thrift客户端(RPC响应)的... 查看详情

thirft简单使用

安装Thrift到thrift官网下载thrift.exehttp://thrift.apache.org/download 将thrift-0.10.0.exe复制到C:ProgramFiles hrift并改名为thrift.exe  配置环境变量  打开dos窗口输入thrift-version查看thrift安装版本,出现下图,则成功& 查看详情

thrift设计与实现

文章简介从Thrift的C++源代码中看,thrift的设计思想,讨论跨语言优质RPC解决方案。 Thrift的诞生背景Thrift的诞生时间大概断定为2007年左右,随着Facebook网站流量的增加和站点功能的日益丰富,已经远远超出了原有LAMP架构的处... 查看详情