RPC框架之Thrift分析(转)

一、简介

1、Thrift是Facebook开发的跨语言的RPC服务框架。随后贡献给Apache开源组织。成为RPC服务的主流框架。

2、特点:

优点:

跨语言,支持java、c/c++、python等多种编程语言

IDL定义接口函数和数据类型

支持二进制传输,效率高

支持多种工作模型,单线程模型、线程池模型、非阻塞模型

缺点:

文档不多

各版本不兼容,升级不方便

二、分析

Thrift分为服务端(server)和客户端(Client)两个对应的部分。代码分层设计,分为Transport(传输层)、Protocol(协议层)、Processor(处理层)和Server(服务层)。

1、主要的处理流程:

各部分类图:

传输层

TTransport:客户端传输层抽象基础类,主要方法:read、write、flush、open、close。read、write方法为核心

TSocket 与 TNonBlockingSocket:分别是基于BIO和NIO客户端传输类。 TSocket持有Socket,设置输入输出流使用1K的BufferedStream,

TNonBlockingSocket持有SocketChannel,read和write方法里的byte会每次被wrap成一个ByteBuffer。

TServerSocket 与 TNonBlockingServerSocket:分别是基于BIO和NIO服务端传输类。TServerSocket持有ServerSocket,TNonBlockingServerSocket持有ServerSocketChannel。

TFramedTransport与TFastFramedTransport:将数据封装Frame(帧)实现的, TFastFramedTransport效率内存使用率高,使用了自动扩展长度的buffer

TZlibTransport:读取时按1K为单位将数据读出并调用JDK的zip函数进行解压再放到Buffer,写入时,在flush时先zip再写入。

TSaslClientTransport与TSaslServerTransport:提供SSL校验

协议层:

1)IDL 定义支持类型:

基本类型: i16,i32,i64, double, boolean,byte,byte[], String。

容器类型: List,Set,Map,TList/TSet/TMap类包含其元素的类型与元素的总个数。

Struct类型:即面向对象的Class,继承于TBase。TStruct类有Name属性,还含有一系列的Field。TField类有自己的Name,类型,顺序id属性。

Exception类型:Struct,继承于TException这个checked exception。

Enum类型:传输时是个i32。

Message类型:封装往返的RPC消息。TMessage类包含Name,类型(请求,返回,异常,ONEWAY)与seqId属性。

2) 类分析:

TProtocol:基础抽象类,拥有对IDL定义支持类型read和write方法,对于结构类型先readxxBegin()(或writexxBegin()),结束时调用readxxEnd() (或readxxEnd())方法。

TBinaryProtocol:二进制流传输协议类,把各类型转换成byte数组,交给TTransport传输。

TCompactProtocol:压缩方法二进制协议类,将Integer按照ZigZag

TTupleProtocol:继承TCompactProtocol,Struct使用时更省空间

TJSONProtocol:Json格式协议类,将数据封装成Json格式,再转为byte数组交给传输层。

TSimpleJSONProtocol:Json格式协议类,但只支持写的功能。

TProtocolFactory:TProtocol的工厂基础类,每个TProtocol实现类均有一个工厂实现。

Server层:

TServer :基础抽象类,实际上类似一个容器,持有TProcessor、TTransport、TProtocol的工厂对象,AbstractServerArgs作为参数抽象类,提供一个serve()方法,用于启动服务,stop()方法停止服务。

TSimpleServer :单线程阻塞式服务,只用于做测试的简单服务类。

TNonblockingServer:支持非阻塞单线程服务模型,基于NIO的Select实现。

THsHaServer:继承TNonblockingServer。单线程处理I/O,线程池请求的处理。

TThreadedSelectorServer: 继承AbstractNonblockingServer。维持两个线程池,一个线程池处理I/O,另一个线程池处理请求。  TThreadPoolServer:专门的线程接受请求并交给线程池处理,完成后线程池连接释放。请求处理线程和I/O线程为同一线程。阻塞式线程池模型。

以上五种模型参见:

https://github.com/m1ch1/mapkeeper/wiki/Thrift-Java-Servers-Compared

http://blog.csdn.net/houjixin/article/details/42779915

Processer层:

TProcessor:基础接口,抽象方法process(TProtocol in, TProtocol out)

TBaseProcessor :基础抽象类,持有processMap对象,key为方法名标示,value为方法(ProcessFunction的实例),实现TProcessor的方法process,in.readMessageBegin()拿到传过来的方法名,如果存在则准备交给具体业务类执行,否则抛出无效方法的异常。

Processor:IDL生成,实现TProcessor接口并继承TBaseProcessor类。

TAsyncProcessor:异步处理接口,抽象方法process(final AsyncFrameBuffer fb) TBaseAsyncProcessor:异步处理抽象类,持有processMap对象,key为方法名标示,value为方法(AsyncProcessFunction的实例),实现TAsyncProcessor的方法process(final AsyncFrameBuffer fb),AsyncProcessFunction的getResultHandler方法拿到一个AsyncMethodCallback,带执行start方法后通过sendResponse方法返回。 AsyncProcessor 由IDL生成,实现TAsyncProcessor接口并继承TAsyncProcessor类。

TProcessorFactory: 构建 TProcessor的工厂类

总结,Thrift代码分析,可以借鉴和学习的方面:

1、代码分层设计,Thrift分传输层、协议层、处理层、服务层四个层设计,上层只依赖下层,方便扩展和维护。

2、基于接口编程和多用抽象工厂设计,每层之间都有一个核心的接口,各个实体初始化基本是使用工厂设计模式,降低耦合。

3、基于BIO和NIO,满足不同情景,便于性能调优。

原文链接: https://my.oschina.net/caiz/blog/667352

原文地址:https://www.cnblogs.com/lenmom/p/9550006.html

时间: 2024-10-16 16:52:24

RPC框架之Thrift分析(转)的相关文章

rpc框架之 thrift连接池实现

接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getPort() { return port; } public void setPort(i

rpc框架之thrift教程1 - 安装 及 hello world

thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.org 跨语言通常有二种做法, 一是将其它语言转换成某种主流的通用语言,比如:delphi.net以前就是先将delphi转换成c#,然后再编译成IL,从而实现delphi在.net上的运行(好久没关注delphi了,不知道现在还是不是这种机制) 二是先定义一种规范文件(可以简单的理解为『母版』),然后

RPC框架之Thrift

目前流行的服务调用方式有很多种,例如基于SOAP消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善. 本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PH

rpc框架之thrift教程2 - 基本概念

thrift的基本构架: 上图源自:http://jnb.ociweb.com/jnb/jnbJun2009.html 底层Underlying I/O以上的部分,都是由thrift编译器生成的代码,其中: Your Code 这是根据thrift文件中定义的dto及service接口方法 FooService.Client及FooService.Processer是thrift生成的用于客户端及服务端的标准代码 Foo.read/write 参数对象及结果对象在传输时,最终需要在client.

Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架

本文首先介绍了什么是Apache Thrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thrift的可扩展的分布式RPC调用框架,在中小型项目中是一个常见的SOA实践. Thrift介绍 Apache Thrift是Facebook 开发的远程服务调用框架,它采用接口描述语言(IDL)定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java,

一个简单的"RPC框架"代码分析

0,服务接口定义---Echo.java /* * 定义了服务器提供的服务类型 */ public interface Echo { public String echo(String string); } 一,客户端代码分析--实现类:MainClient.java 客户端实现包括:获得一个代理对象,并使用该代理对象调用服务器的服务.获取代理对象时,需要指定被代理的类(相当于服务器端提供的服务名),Server IP,Port. Echo echo = RPC.getProxy(Echo.cl

微博轻量级RPC框架Motan正式开源:支撑千亿调用

支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan. 微博轻量级RPC框架Motan正式开源 Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用.高可用的 RPC 服务框架. Motan 功能特点:简单.易用.高可用 无侵入集成.简单易用,通过 Spring 配

RPC框架分析

RPC框架分析 RPC 是什么? RPC 的全称是 Remote Procedure Call 是一种进程间通信方式.它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节.即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同. RPC 起源 RPC 这个概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出.这里我们追溯下当初开发 RPC 的原动机是什么?在 Nelson 的论文 "Implementing

RPC框架Thrift例子-PHP调用C++后端程序

更新 2016-02-22: Response对象不用主动创建. 前言 前段时间用了一下Facebook的开源RPC框架Thrift,做PHP客户端调用C++后端程序,真心觉得Thrift不错! 本文项目地址:https://github.com/zekunyan/ThriftDemo_PHP_CPP 先看看本文的例子示意图: 流程 PHP客户端发起请求,请求参数是“Request”类型,里面有studentID参数. CPP服务端收到请求返回数据,返回类型为“Response”,里面包含了st