微信号:luojilab

介绍:罗辑思维研发团队公众号

Thrift——跨越多语言RPC性能鸿沟

2016-07-30 20:01 刘建军
  1. RPC:远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务的方式.RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。

  2. thrift:Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。一种RPC框架。

    • 可以跨语言相互调用,比如java调用php。
    • 使用的4层网络模型。http是7层网络模型。
    • 速度比http要快。

demo:

首先安装thrift:
brew install thrift
文件目录说明:

client目录:

   JavaClient:php调用java的client端

  PhpClient: php实现的client端。(php写的server端)

thrift:目录:

test.thrift 生成的client端通信协议文件

lib目录:依赖的thrift的包

server目录:

 thrift:  test.thrift 生成的server端的通信协议文件

 TestServer.php  php实现的server端

 runserver.py  监控端口

 java项目地址:http://pan.baidu.com/s/1c4zE7G

  php项目地址:http://pan.baidu.com/s/1geD2FTL

3.通信协议的定义:文件名:test.thfit

  //查询

 namespace java thrift.service  //生成java时是报名

 namespace php thrift.service    //生成的php的文件路径

 const string version = "1.0.0"

service TestService {    //类名

 // 获取版本号

 string getServiceVersion();

 //方法

  string getData(1:string str,2:i32 id);    //通信协议,传的参数是字符串和整型,返回字符   串。

}

4.java作为server端,php和java作为客户端

 java通过thrift生成通信协议的文件。

 thrfit --gen java test.thrfit

  (1)server端

        实现thrift通信协议      


           server启动端口:

           java作为clent:

php作为client:

    (1)首先要生成php的客户端的通信文件:  

          thrift —gen php test.thrift 

    (2)导入依赖的lib文件。

    (3)实现client


5.php使用thrift.

        用php作为server端时,依赖于服务器。实现方式有两种。

     (1)使用python 启动一个端口监控

(2)把server端的文件放到apache服务器下面

      注意: 使用第一种方式时,client和server端的文件的第一行加//#!/usr/bin/env php

     第二种方式不用加。

php生成server端时和生成client端的通信文件的命令是不一样的。

server端:thrift -r —gen php:server Test.thrift

client端:thrift —gen php test.thrift


   (1)第一种启动方式:./runserver.py
         请求方式:  server: php PhpClient.php
   (2)第二种启动方式:把php项目放到apache下面
        请求方式server: php PhpClient.php

结果:

6.java服务器端和php服务器端区别:

(1)java直接打个jar包,就可以启动一个端口,接受thrift请求。不依赖于服务器,例如tomcat。

(2)php 作为thrift的server端,没有办法自己启动端口,需要依赖于服务器,需要部署在服务器下面。例如apache.

(下面的内容来源于网上,总结的挺好)

8.thfit服务器端:

    1. 创建Handler,用于处理业务逻辑,数据处理接口.

    2. 基于Handler创建Processor,数据处理对象

    3. 创建Transport(通信方式),数据传输方式

    4. 创建Protocol方式(设定传输格式),数据传输协议

    5. 基于Processor, Transport和Protocol创建Server

    6. 运行Server

9.thrift客户端:

    客户端编写的一般步骤:

    1. 创建Transport

    2. 创建Protocol方式

    3. 基于Transport和Protocol创建Client

    4. 运行Client的方法

10.数据传输方式,即Protoco

    TBinaryProtocol – 二进制格式.

    TCompactProtocol – 压缩格式

    TJSONProtocol – JSON格式

11。支持的通信方式即,Transport

    THttpTransport:采用Http传输协议进行数据传输

    TSocket:采用TCP Socket进行数据传输

    下面几个类主要是对上面几个类地装饰(采用了装饰模式),以提高传输效率。

    TBufferedTransport:对某个Transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或者将数据直接写入buffer

    TFramedTransport:以frame(帧:按照固定大小来传输)为单位进行传输,非阻塞式服务中使用。同TBufferedTransport类似,也会对相关数据进行buffer,同时,它支持定长数据发送和接收。

    TMemoryBuffer:从一个缓冲区中读写数据

12.服务器端支持的模型。

    TSimpleServer – 简单的单线程服务模型,常用于测试

    TThreadedServer - 多线程服务模型,使用阻塞式IO,每个请求创建一个线程。

    TThreadPoolServer – 线程池服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求。

    TNonblockingServer – 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)

    处理大量更新的话,主要是在TThreadedServer和TNonblockingServer中进行选择。TNonblockingServer能够使用少量线程处理大量并发连接,但是延迟较高;TThreadedServer的延迟较低。实际中,TThreadedServer的吞吐量可能会比TNonblockingServer高,但是TThreadedServer的CPU占用要比TNonblockingServer高很多。

    13.阻塞IO:socket的阻塞意味着必须要做完Io包括错误才会返回。

    非阻塞io:无论操作是否完成都会立刻返回。


 
罗辑实验室 更多文章 聊聊VueJs 组件化编程
猜您喜欢 DT时代,互联网企业如何辨别"敲门"人 SpaceX成功海上回收火箭(附视频):从星辰到大海! “压倒服务器的最后一个用户”-- 如何寻找极限点? 小马哥:O2O公司咋招聘技术人 建立微型数据中心 – 在笔记本电脑上运行Rancher