php和java之thrift

作者: worksunny | 来源:发表于2016-07-28 00:40 被阅读0次

    java和php使用thrift

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

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

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

    demo:

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

    目录.png
    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通信协议      
    
    得到打点值.png
    server启动端口:
    72fa725d-33e9-4c57-9bdd-d501d170f621-image.png
    java作为clent:
    9133f3f2-7a32-42e6-b57e-1892c635f54d-image.png
    php作为client:
        (1)首先要生成php的客户端的通信文件:  
    
              thrift —gen php test.thrift 
    
        (2)导入依赖的lib文件。
    
        (3)实现client
    
    7067487d-f49a-4c21-8b1d-fb716d2ef02e-image.png

    5.php使用thrift.

            用php作为server端时,依赖于服务器。实现方式有两种。
    
         (1)使用python 启动一个端口监控
    
    7402ba1c-617b-4610-87f8-15b1e6bcc254-image.png

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

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

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

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

    7e707fa9-4068-4382-a1f8-fdeac1d2b703-image.png

    client端:thrift —gen php test.thrift

    ddb25985-81e9-4fe3-90a1-a34b1b651d94-image.png

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

    结果:


    95ced2b1-62a7-4300-8080-b32e8be9491f-image.png

    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:无论操作是否完成都会立刻返回。

    相关文章

      网友评论

        本文标题:php和java之thrift

        本文链接:https://www.haomeiwen.com/subject/xcqajttx.html