Thrift协议的服务模型
- Thrift 支持的数据类型
- 协议
- 传输层
- 阻塞服务
- TSimpleServer:简单的单线程服务模型,主要用于测试
- TThreadPoolServer:多线程服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求
- 非阻塞服务模型
- TNonblockingServer:多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式),只有一个线程来处理消
- THsHaServer:半同步半异步的服务模型,一个单独的线程用来处理网络I/O,一个worker线程池用来进行消息的处理
- TThreadedSelectorServer:允许你用多个线程来处理网络I/O。它维护了两个线程池,一个用来处理网络I/O,另一个用来进行请求的处理
/** * 注册服务端 * 单线程服务模型,使用标准的阻塞式IO,只有一个线程处理请求 */
public static void startSimpleServer(AdditionService.Processor<AdditionServiceHandler> processor) {try {TServerTransport serverTransport = new TServerSocket(9090);// 设置服务端口// 单线程服务模型TSimpleServer.Args tArgs = new TSimpleServer.Args(serverTransport);tArgs.processor(processor);// 客户端协议要一致tArgs.protocolFactory(new TBinaryProtocol.Factory());TServer server = new TSimpleServer(tArgs);System.out.println("Starting the simple server...");server.serve();} catch (Exception e) {e.printStackTrace();}
}
2、TThreadPoolServer
/*** 注册服务端* 线程池服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求*/
public static void startMultipleServer(AdditionService.Processor<AdditionServiceHandler> processor) {try {TServerTransport serverTransport = new TServerSocket(9090);// 设置服务端口//线程池服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求。TThreadPoolServer.Args tArgs = new TThreadPoolServer.Args(serverTransport);tArgs.processor(processor);// 客户端协议要一致tArgs.protocolFactory(new TBinaryProtocol.Factory());TServer server = new TThreadPoolServer(tArgs);System.out.println("Hello TThreadPoolServer....");server.serve(); // 启动服务} catch (Exception e) {e.printStackTrace();}
}
这两个服务端可以处理同样的客户端:
/*** 客户端调用* 阻塞* Created by Administrator on 2017/1/12.*/
public class AdditionClient {public static void main(String[] args) {try {TTransport transport;// 设置传输通道transport = new TSocket("localhost", 9090);//使用堵塞式I/O进行传输transport.open();// 协议要和服务端一致// 使用二进制协议TProtocol protocol = new TBinaryProtocol(transport);AdditionService.Client client = new AdditionService.Client(protocol);System.out.println(client.add(100, 200));transport.close();} catch (TTransportException e) {e.printStackTrace();} catch (TException x) {x.printStackTrace();}}}
/*** TNonblockingServer采用单线程非阻塞(NIO)的模式* @param processor*/
public static void nonBlockingServer(AdditionService.Processor<AdditionServiceHandler> processor) {try {// 传输通道 - 非阻塞方式TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(9090);// 设置服务端口// 异步IO,需要使用TFramedTransport,它将分块缓存读取。TNonblockingServer.Args tArgs = new TNonblockingServer.Args(serverTransport);tArgs.processor(processor);tArgs.transportFactory(new TFramedTransport.Factory());// 使用高密度二进制协议tArgs.protocolFactory(new TCompactProtocol.Factory());// 使用非阻塞式IO,服务端和客户端需要指定TFramedTransport数据传输的方式TServer server = new TNonblockingServer(tArgs);System.out.println("Starting the simple server...");server.serve();// 启动服务} catch (Exception e) {e.printStackTrace();}
}
查看TNonblockingServer的源码,我们可以看到select()方法:
private void select() {try {this.selector.select();Iterator e = this.selector.selectedKeys().iterator();while(!TNonblockingServer.this.stopped_ && e.hasNext()) {SelectionKey key = (SelectionKey)e.next();e.remove();if(!key.isValid()) {this.cleanupSelectionKey(key);} else if(key.isAcceptable()) {this.handleAccept();} else if(key.isReadable()) {this.handleRead(key);} else if(key.isWritable()) {this.handleWrite(key);} else {TNonblockingServer.this.LOGGER.warn("Unexpected state in select! " + key.interestOps());}}} catch (IOException var3) {TNonblockingServer.this.LOGGER.warn("Got an IOException while selecting!", var3);}}
/*** THsHaServer* THsHaServer类是TNonblockingServer类的子类* @param processor*/
public static void startTHsHaServer(AdditionService.Processor<AdditionServiceHandler> processor) {try {// 传输通道 - 非阻塞方式TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(9090);// 设置服务端口// 异步IO,需要使用TFramedTransport,它将分块缓存读取。THsHaServer.Args tArgs = new THsHaServer.Args(serverTransport);tArgs.processor(processor);tArgs.transportFactory(new TFramedTransport.Factory());// 使用高密度二进制协议tArgs.protocolFactory(new TCompactProtocol.Factory());// 使用非阻塞式IO,服务端和客户端需要指定TFramedTransport数据传输的方式TServer server = new THsHaServer(tArgs);System.out.println("Starting the simple server...");server.serve();// 启动服务} catch (Exception e) {e.printStackTrace();}
}
/*** TThreadedSelectorServer* 是多线程服务器端使用非堵塞式I/O模型* @param processor*/public static void startTThreadedSelectorServer(AdditionService.Processor<AdditionServiceHandler> processor) {try {// 传输通道 - 非阻塞方式TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(9090);// 设置服务端口// 异步IO,需要使用TFramedTransport,它将分块缓存读取。TThreadedSelectorServer.Args tArgs = new TThreadedSelectorServer.Args(serverTransport);tArgs.processor(processor);tArgs.transportFactory(new TFramedTransport.Factory());// 使用高密度二进制协议tArgs.protocolFactory(new TCompactProtocol.Factory());// 使用非阻塞式IO,服务端和客户端需要指定TFramedTransport数据传输的方式TServer server = new TThreadedSelectorServer(tArgs);System.out.println("Starting the simple server...");server.serve();// 启动服务} catch (Exception e) {e.printStackTrace();}}
上面三种非阻塞服务模型可以处理这样的客户端:
public static void main(String[] args) {try {// 设置传输通道,对于非阻塞服务,需要使用TFramedTransport,它将数据分块发送TSocket socket = new TSocket("localhost", 9090);//使用堵塞式I/O进行传输//使用非阻塞方式,按块的大小,进行传输,类似于Java中的NIOTTransport transport = new TFramedTransport(socket);// 协议要和服务端一致// 使用高密度二进制协议TProtocol protocol = new TCompactProtocol(transport);AdditionService.Client client = new AdditionService.Client(protocol);transport.open();System.out.println(client.add(100, 100));transport.close();} catch (TTransportException e) {e.printStackTrace();} catch (TException x) {x.printStackTrace();}
}
源代码
参考:
Thrift协议的服务模型相关推荐
- go通过thrift连接hbase_关于thrift协议改进畅想
Thrift简介 thrift协议你主要提供3种编解码格式协议,Binary.Compact.SimpleJson(还有debug.virtual):其中最常用的是Binary协议,其传输层一般以Bu ...
- Thrift协议与传输选择
1 协议 Thrift 可以让用户选择客户端与服务端之间传输通信的消息协议类别,如我们前面所讲总体划分为文本 (text) 和二进制 (binary) ,为节约带宽,提高传输效率,一般情况下使用二进制 ...
- go语言使用thrift协议实现客户端和服务端报not enough arguments in call to oprot.WriteMessageBegin错误解决方案
正常步骤: 安装golang的Thrift包: go get git.apache.org/thrift.git/lib/go/thrift 安装 Thrift 的 IDL 编译工具: http:// ...
- Thrift介绍以及Java中使用Thrift实现RPC示例
场景 Thrift Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python,PHP, Ruby, Erlang,Perl ...
- 10-20-000-简介-Thrift
1. Thrift传输格式 TBinaryProtocol一二进 制格式 TCompactProtocol -压缩 格式 TJSONProtocol - JSON格式 TSimpleJSONProto ...
- SpringBoot整合RPC框架---Thrift
文章目录 什么是Thrift 架构 支持的通讯协议 支持的传输协议 支持的服务模型 Thrift的优点 SpringBoot整合Thrift 为什么会出现RPC框架 常见的RPC框架集成套路 开撸 官 ...
- springboot整合Thrift
什么是Thrift Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务.它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为"大规模跨语言服务开发 ...
- RPC协议之争和选型要点
<Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析RPC协议之争和选型问题.李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同学可 ...
- java服务端开发 php_PHP使用thrift做服务端开发
php中文网最新课程 每日17点准时技术干货分享 php使用thrift做服务端开发 thrift采用接口描述语言定义和创建服务,用二进制格式传输数据,体积更小.效率更高,对于高并发.数据量大和多语言 ...
最新文章
- 【连载】优秀程序员的 45 个习惯之习惯27
- 将一个PPT文档按页分割成多个PPT文档的代码
- 《LeetCode力扣练习》第64题 最小路径和 Java
- linux 怎么改授权用户权限,linux – systemd:授予非特权用户权限以更改某个特定服务...
- 利用RSM和RSFC配置VLAN间路由
- 剑指offer面试题26. 树的子结构(链表)
- 把标清视频转高清Video Enhance AI for mac
- 层间距离对ct图像的影响_CT图像影响因素
- qq企业邮箱登录服务器,腾讯邮箱登录入口(腾讯企业邮箱免费用户申请)
- 看看阿里双十一970P数据处理得,那叫一个牛啤!
- 关于 “总机服务” 新增功能来电弹屏的功能说明
- 一个读者大佬精心总结的阿里、腾讯、宇宙条大厂 Offer 面经和硬核面试攻略
- model.train()与model.eval()的用法、Dropout原理、relu,sigmiod,tanh激活函数、nn.Linear浅析
- SocialBoo出海指南 || 海外网红营销深度报告
- 模压硅胶产品成型后加工工艺
- 【网络】解释Http协议,URL,Http的格式。
- 网络游戏外挂制作(3)-1
- kibana启动报错 Elasticsearch cluster did not respond with license information
- iOS - 需求 - 微信扫描二维码支付(草稿)
- 基于差分进化算法(DE)改进的jDE2 处理约束优化问题
热门文章
- mac. mysql 设置root_Mac平台重新设置MySQL的root密码
- 怎么用python爬豆瓣_python爬虫16 | 你,快去试试用多进程的方式重新去爬取豆瓣上的电影...
- 在python中、如果异常并未被处理或捕捉_Python异常处理总结
- python商品会员打折_Python微项目分享之双十一优惠计算器
- java默认virtual_mac jdk配置(系统默认or自己配置)
- oracle有条件插入数据,Oracle有条件地插入数据
- vue3中v-model的重大更新
- mysql求利润_SQL分析超市数据
- python找出只出现一次的数字_【LeetCode 136】只出现一次的数字(Python)
- android alertdialog view,Android AlertDialog 方法setView(view,0,0,0,0)开发自定义对话框