四川公司网站建设,模板工,购买一个网站需要多少钱,模板网站建设咨询文章目录 1、Thrift RPC介绍1.1、Protocol 支持的数据传输协议1.2、Transport 支持的数据传输方式1.3、Server 支持的服务模型1.4、IDL语法数据类型1.5、开发步骤 2、接口定义文件2.1、创建接口定义文件2.2、生成对应平台语言代码2.2.1、下载生成工具2.2.2、生成各平台语言代码… 文章目录 1、Thrift RPC介绍1.1、Protocol 支持的数据传输协议1.2、Transport 支持的数据传输方式1.3、Server 支持的服务模型1.4、IDL语法数据类型1.5、开发步骤 2、接口定义文件2.1、创建接口定义文件2.2、生成对应平台语言代码2.2.1、下载生成工具2.2.2、生成各平台语言代码 3、使用Java实现服务器端4、客户端实现4.1、Java调用客户端实现4.2、Go调用客户端实现4.3、PHP调用客户端实现 1、Thrift RPC介绍
Thrift 是一个软件框架远程过程调用框架用来进行可扩展且跨语言的服务的开发封装了数据传输格式二进制、json和网络通信的服务框架提供多语言C, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml的网络服务器端和客户端程序组件 适用于搭建大型数据交换及存储的通用工具对于大型系统中的内部数据传输相对于 JSON 和 xml 无论在性能、传输大小上有明显的优势。
Thrift 开发的几个概念 Server 服务模型 Handler 数据处理接口 Processor 数据处理对象 Protocol 数据传输协议 Transport 数据传输方式
1.1、Protocol 支持的数据传输协议
TBinaryProtocol – 二进制格式.TCompactProtocol – 压缩格式TJSONProtocol – JSON 格式TSimpleJSONProtocol –提供 JSON 只写协议生成的文件很容易通过脚本语言解析。TDebugProtocol – 使用易懂的可读的文本格式以便于 debug
1.2、Transport 支持的数据传输方式
TFileTransport文件日志传输类允许 client 将文件传给 server允许 server 将收到的数据写到文件中。THttpTransport采用 Http 传输协议进行数据传输TSocket采用 TCP Socket 进行数据传输TZlibTransport压缩后对数据进行传输或者将收到的数据解压
下面几个类主要是对上面几个类地装饰采用了装饰模式以提高传输效率。
TBufferedTransport对某个 Transport 对象操作的数据进行 buffer即从 buffer 中读取数据进行传输或者将数据直接写入 buffer
TFramedTransport以 frame 为单位进行传输非阻塞式服务中使用。同 TBufferedTransport 类似也会对相关数据进行 buffer同时它支持定长数据发送和接收。
TMemoryBuffer从一个缓冲区中读写数据
1.3、Server 支持的服务模型
TSimpleServer – 简单的单线程服务模型常用于测试 TThreadedServer - 多线程服务模型使用阻塞式 IO每个请求创建一个线程。 TThreadPoolServer – 线程池服务模型使用标准的阻塞式 IO预先创建一组线程处理请求。 TNonblockingServer – 多线程服务模型使用非阻塞式 IO需使用 TFramedTransport 数据传输方式
处理大量更新的话主要是在 TThreadedServer 和 TNonblockingServer 中进行选择。TNonblockingServer 能够使用少量线程处理大量并发连接但是延迟较高TThreadedServer 的延迟较低。实际中TThreadedServer 的吞吐量可能会比 TNonblockingServer 高但是 TThreadedServer 的 CPU 占用要比 TNonblockingServer 高很多。
1.4、IDL语法数据类型
基本类型
bool布尔值true或false
byte8位有符号整数
i1616位有符号整数
i3232位有符号整数
i6464位有符号整数
double64位浮点数
string使用UTF-8编码编码的文本字符串容器类型
listt1一系列t1类型的元素组成的有序列表元素可以重复
sett1一些t1类型的元素组成的无序集合元素唯一不重复
mapt1,t2key/value对key唯一1.5、开发步骤
服务器端开发
1. 创建 Handler
2. 基于 Handler 创建 Processor
3. 创建 Transport通信方式
4. 创建 Protocol 方式设定传输格式
5. 基于 Processor, Transport 和 Protocol 创建 Server
6. 运行 Server客户端开发
1. 创建 Transport
2. 创建 Protocol 方式
3. 基于 Transport 和 Protocol 创建 Client
4. 运行 Client 的方法2、接口定义文件
2.1、创建接口定义文件
test.thrift
/*** The first thing to know about are types. The available types in Thrift are:** bool Boolean, one byte* byte Signed byte* i16 Signed 16-bit integer* i32 Signed 32-bit integer* i64 Signed 64-bit integer* double 64-bit floating point value* string String* binary Blob (byte array)* mapt1,t2 Map from one type to another* listt1 Ordered list of one type* sett1 Set of unique elements of one type** Did you also notice that Thrift supports C style comments?*/// 命名空间,Java中的package
namespace java com.penngo.thrift
namespace php com.penngo
namespace go com.penngo// 结构体
struct User {1: i64 id,2: string name,3: string password
}// 服务,Java中创建Interface一样
service LoginService{// service中定义的函数相当于Java interface中定义的函数User login(1:string name, 2:string psw);
}service RegisterService{User createUser(1:string name, 2:string psw);
}2.2、生成对应平台语言代码
2.2.1、下载生成工具
下载地址https://thrift.apache.org/download 当前最新版本为thrift-0.19.0.exe thrift-0.19.0.exe重命名为thrift.exe与test.thrift在同一目录。
2.2.2、生成各平台语言代码
执行以下命令分别生成Java、Go、PHP平台的代码
thrift -gen java test.thrift
thrift -gen go test.thrift
thrift -gen php:classmap test.thrift # 支持PSR-4 loader
# thrift -gen php test.thrift生成后的目录文件结构
3、使用Java实现服务器端
pom.xml
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.penngo/groupIdartifactIdthrift-java/artifactIdversion1.0/versionpropertiesmaven.compiler.source11/maven.compiler.sourcemaven.compiler.target11/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependenciesdependencygroupIdorg.apache.thrift/groupIdartifactIdlibthrift/artifactIdversion0.19.0/version/dependencydependencygroupIdjavax.annotation/groupIdartifactIdjavax.annotation-api/artifactIdversion1.3.2/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-api/artifactIdversion2.17.2/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.17.2/version/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-simple/artifactIdversion1.7.36/version/dependency/dependenciesrepositoriesrepositoryidalimaven/idnameMaven Aliyun Mirror/nameurlhttps://maven.aliyun.com/repository/central/url/repository/repositoriespluginRepositoriespluginRepositoryidpublic/idnamealiyun nexus/nameurlhttps://maven.aliyun.com/nexus/content/groups/public//urlreleasesenabledtrue/enabled/releasessnapshotsenabledfalse/enabled/snapshots/pluginRepository/pluginRepositories
/project实现LoginService服务LoginServiceImpl.java
package com.penngo.service;import com.penngo.thrift.LoginService;
import com.penngo.thrift.User;public class LoginServiceImpl implements LoginService.Iface{public LoginServiceImpl(){}public User login(String name, String psw){User user null;if(name.equals(penngo) psw.equals(123)){user new User();user.setId(1);user.setName(penngo);}return user;}
}实现RegisterService服务RegisterServiceImpl.java
package com.penngo.service;
import com.penngo.thrift.RegisterService;
import com.penngo.thrift.User;public class RegisterServiceImpl implements RegisterService.Iface{public RegisterServiceImpl(){}public User createUser(String name, String psw){User user new User();user.setId(2);user.setName(name);user.setPassword(psw);return user;}
}实现LoginService和RegisterService注册完成服务启动。
package com.penngo;import com.penngo.service.LoginServiceImpl;
import com.penngo.service.RegisterServiceImpl;
import com.penngo.thrift.LoginService;
import com.penngo.thrift.RegisterService;
import org.apache.thrift.TMultiplexedProcessor;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;public class HelloServer {private void start() {try {TServerSocket serverTransport new TServerSocket(7911);// 用户登录LoginService.Processor loginProcessor new LoginService.Processor(new LoginServiceImpl());// 用户注册RegisterService.Processor registerProcessor new RegisterService.Processor(new RegisterServiceImpl());TMultiplexedProcessor processor new TMultiplexedProcessor();processor.registerProcessor(LoginService, loginProcessor);processor.registerProcessor(RegisterService, registerProcessor);TServer server new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));System.out.println(Starting server on port 7911 ...);server.serve();} catch (TTransportException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}public static void main(String args[]) {HelloServer srv new HelloServer();srv.start();}
}项目文件结构
4、客户端实现
4.1、Java调用客户端实现
package com.penngo;import com.penngo.thrift.LoginService;
import com.penngo.thrift.RegisterService;
import com.penngo.thrift.User;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TMultiplexedProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;public class HelloClient {public static void main(String[] args) {try {TTransport transport new TSocket(localhost, 7911);TProtocol protocol new TBinaryProtocol(transport);TMultiplexedProtocol mp1 new TMultiplexedProtocol(protocol,LoginService);LoginService.Client loginClient new LoginService.Client(mp1);TMultiplexedProtocol mp2 new TMultiplexedProtocol(protocol,RegisterService);RegisterService.Client registerClient new RegisterService.Client(mp2);transport.open();User user loginClient.login(penngo, 123);if (user ! null) {System.out.println(登录成功 user.getId() user.getName());} else {System.out.println(登录失败);}User user2 registerClient.createUser(test, 123456);if (user2 ! null) {System.out.println(创建用户成功 user2.getId() user2.getName());} else {System.out.println(创建用户失败);}transport.close();} catch (TException x) {x.printStackTrace();}}
}4.2、Go调用客户端实现
安装Thrift依赖
go get github.com/apache/thriftgo客户端实现
package mainimport (contextcrypto/tlsfmtgithub.com/apache/thrift/lib/go/thriftnetosthrifttest/com/penngo
)const (HOST 127.0.0.1PORT 7911
)var ctx context.Background()func main() {cfg : thrift.TConfiguration{TLSConfig: tls.Config{InsecureSkipVerify: true,}}// 网络接口var transport thrift.TTransportvar err errortransport thrift.NewTSocketConf(net.JoinHostPort(HOST, PORT), cfg)protocol : thrift.NewTBinaryProtocolConf(transport, cfg)// 客户端iprot : thrift.NewTMultiplexedProtocol(protocol, LoginService)oprot : thrift.NewTMultiplexedProtocol(protocol, LoginService)c : thrift.NewTStandardClient(iprot, oprot)loginClient : penngo.NewLoginServiceClient(c)// 客户端iprot2 : thrift.NewTMultiplexedProtocol(protocol, RegisterService)oprot2 : thrift.NewTMultiplexedProtocol(protocol, RegisterService)c2 : thrift.NewTStandardClient(iprot2, oprot2)registerClient : penngo.NewRegisterServiceClient(c2)if err : transport.Open(); err ! nil {fmt.Fprintln(os.Stderr, open transport error: , err)os.Exit(1)}defer transport.Close()res, err : loginClient.Login(ctx, penngo, 123)if err ! nil {fmt.Fprintln(os.Stderr, error: , err)os.Exit(1)}fmt.Fprintln(os.Stderr, Login: , res)res2, err2 : registerClient.CreateUser(ctx, test, 123456)if err2 ! nil {fmt.Fprintln(os.Stderr, error: , err2)os.Exit(1)}fmt.Fprintln(os.Stderr, CreateUser: , res2)
}
项目文件结构
官方例子https://thrift.apache.org/tutorial/go.html
4.3、PHP调用客户端实现
创建composer.json
{require: {apache/thrift: ^0.19.0},autoload: {files: [com/penngo/LoginService.php,com/penngo/RegisterService.php,com/penngo/Types.php]}
}使用composer安装依赖
composer installphp客户端实现代码
?php
require_once vendor/autoload.php;use Thrift\Transport\TSocket;
use Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\TBufferedTransport;
use Thrift\Protocol\TMultiplexedProtocol;
use com\penngo\LoginServiceClient;
use com\penngo\RegisterServiceClient;// 传输方式需与服务端一致
$socket new TSocket(localhost, 7911);
// 传输协议需与服务端一致
$transport new TBufferedTransport($socket, 1024, 1024);
$protocol new TBinaryProtocol($transport);
$loginProtocol new TMultiplexedProtocol($protocol, LoginService);
$registerProtocol new TMultiplexedProtocol($protocol, RegisterService);
$loginClient new LoginServiceClient($loginProtocol);
$registerClient new RegisterServiceClient($registerProtocol);
$transport-open();
$user $loginClient-login(penngo, 123);
print login.json_encode($user);$user $registerClient-createUser(test, 123456);
print \ncreateUser.json_encode($user);
$transport-close();项目文件结构
php官方例子https://thrift.apache.org/lib/php.html
附件源码