php和java之thrift
2016-07-28 本文已影响0人
worksunny
java和php使用thrift
-
RPC:远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务的方式.RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。
-
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通信协议
得到打点值.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.pngclient端: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:无论操作是否完成都会立刻返回。