Thrift多路复用:增强Thrift以满足企业期望(下)

简介: Thrift多路复用:增强Thrift以满足企业期望(下)
Server

我们提出了一个新的抽象server,TMultiplexingServer,它可以使用TLookupMultiplexer绑定任何server信息到任何transport和任何protocol。该类抽象了对象创建的底层复杂性,并公开两个抽象方法,getServer和configureMultiplexer,用来被任何继承该类的类实现。该类使得用户可以在创建server对象时识别出server transport、protocol,因此提供了额外的灵活性,当涉及到将不同的transport和protocol的多个service绑定到同一server,而无需额外的编码工作。

Source Code

我们扩展了Thrift Java库【version 0.9.0】,并增加了一个以ext命名的源文件夹,包含multiplexing组件的底层实现。此外,build.xml已被修改以先后和扩展的源代码。该方案的兼容性已经过测试与目前稳定版本0.8.0 Thrift无缝继承。为了使用Thrift的multiplexing功能,你需要从git-hub download/pull扩展的Thrift库源代码,然后在下载的Thrift Java库上运行ant命令。这将在build文件夹中生成libthrift-xxx.jar,可以被开发人员用于创建自己的企业解决方案。

怎样使用Thrift Multiplexing?

multiplexing server可以通过扩展org.apache.thrift.server.TMultiplexingServer类,并通过实现抽象方法configureMultiplexer()和getServer(TServerTransportserverTransport,TProtocolFactoryprotFactory,TProcessor processor)来创建。示例代码提供如下:

第一步:继承TMultiplexingServer类创建server类。

public class Server1<T extends TServerTransport, F extends TProtocolFactory>
extends TMultiplexingServer<T, F>

第二步:有选择的重载默认的构造函数以接收server transport和protocol。

public Server1(T serverTransport, F protFactory) {
super(serverTransport, protFactory);
}

第三步:实现configureMultiplexer()方法以配置lookup multiplexer。作为配置的一部分,你需要创建包含绑定到server上所有service以及相应的service information详细信息列表的MultiplexerArgs。示例如下,我们已经绑定HR和Finance service到Server1

@Override
protected List<MultiplexerArgs<URIContext, TProcessor>> configureMultiplexer() {
// list of multiplexer arguments
List<MultiplexerArgs<URIContext, TProcessor>> args = new ArrayList<MultiplexerArgs<URIContext, TProcessor>>();
// configuring HR service context
TProcessor processor = new HRService.Processor<HRServiceImpl>(
new HRServiceImpl());
URIContext context = new URIContext(Constants.HR_CONTEXT,
"HumanResource_Service");
MultiplexerArgs<URIContext, TProcessor> arg = new MultiplexerArgs<URIContext, TProcessor>(
processor, context);
args.add(arg);
// configuring FIN service context
processor = new FinanceService.Processor<FinanceServiceImpl>(
new FinanceServiceImpl());
context = new URIContext(Constants.FIN_CONTEXT, "Finance_Service");
arg = new MultiplexerArgs<URIContext, TProcessor>(processor, context);
args.add(arg);
return args;
}

第四步:实现getServer(…)方法以创建目的Server的实例。在下面的示例中,我们使用参数创建了一个ThreadProolServer的实例。

@Override
protected TServer getServer (TServerTransport serverTransport, TProtocolFactory protFactory, TProcessor processor) {
//creating server args
Args serverArgs= new Args(serverTransport);
serverArgs.protocolFactory(protFactory);
serverArgs.transportFactory(new TTransportFactory());
serverArgs.processor(processor);
serverArgs.minWorkerThreads=1; 
serverArgs.maxWorkerThreads=5;
//creating server instance
return new TThreadPoolServer(serverArgs);
}

第五步:使用何时的transport和protocol创建server类的实例,并启动server

public static void main(String[] args) {
//identifying server transport
TServerSocket SERVER1_TRANSPORT = new TServerSocket(Constants.SERVICE1_PORT);
//identifying server protocol
Factory SERVER1_FACTORY = new TBinaryProtocol.Factory();
//creating server instances for specific transport and protocol
Server1<TServerSocket, TBinaryProtocol.Factory> server1 = new Server1<TServerSocket, TBinaryProtocol.Factory>(SERVER1_TRANSPORT, SERVER1_FACTORY);
//starting server
server1.start();
}

创建一个客户端查询registry并使用service context

一个来查询multiplexing server registry的客户端可以从org.apache.thrift.registry.TRegistryClientFactory类获得。class.TRegistryClientFactory是便利类,它提供multiplexing客户端的实例。在客户端侧,你可以使用工厂的静态方法getClient(..)以获取registry客户端。它可以进一步用来查询registry和确定合适的server处理该请求。下面提供的示例代码是关于客户端使用的finance service检索雇员的税务细节的客户端:

public double getTaxDetails(intempId){
TTransport transport = null;
TProtocol protocol = null;
try {
//transport
transport = new TSocket(Constants.SERVICE_IP, 
Constants.SERVICE1_PORT, 60);
//Multiplexing protocol
protocol = Factory.getProtocol(new TBinaryProtocol(transport), 
TConstants.LOOKUP_CONTEXT);
//Procuring Registry client
TRegistry client = TRegistryFactory.getClient(protocol);
//opening transport
transport.open();
//querying registry to get context
Set<URIContext> contexts = client.lookupByName("Finance_Service");
//executing the request on appropriate service using the context
if(contexts.size()==1){
URIContext uricontext = contexts.iterator().next();
protocol = 
newTMultiplexProtocol(newTBinaryProtocol(transport),uricontext.getContext())
;
com.service.FinanceService.Client finService = new
com.service.FinanceService.Client(protocol);
return finService.getTaxDeductedTillDate(empId);
}
}finally {
if(transport!=null)
//closing transport
transport.close();
}
}

明智的投资利润丰厚

Thrift在当今的企业环境中有巨大优势,因为它通过有效的方式解决了所有大数据解决方案带来的挑战,并提供了一个公开为整个网络提供服务的解决方案。大多数企业,特别是在生产环境中,具有有限的端口,打开新的端口将引入相关的成本。使用Thrift作为解决方案的RPC机制是考虑到端口的有限。此外,像Hadoop、Hive、HBase、Cassandra、NoSQL数据存储等等,以及其他企业软件,如Web服务器、应用服务器和ESBs已经使用了多个端口。在成本和资源方面,如果企业将服务公开到网络上,然后为每个服务打开额外的端口是低效的。这一企业问题,可以通过Thrift multiplexing的帮助,减少端口数为一个,用很小的开发和管理开支绑定所有的服务。

一个组织投资于这项技术肯定会收获快速的周转时间和开发成本低的好处。此外,从长远来看,对复用做扩展,减少了企业的维护和管理费用,使得这项投资的利润丰厚。随着复用,多个services可以绑定在一个Thrift服务器上,从而降低维护成本。服务的模块化设计可以使用复用减少服务未来发展的成本,引入新的服务/功能或修改现有服务。因此,复用以其简单的实现,不仅使投资划算,而且使业务增值。

总结

因为可靠和高效的方式跨编程语言通信,近来Thrift已经成为一项强大的技术。企业应对大数据等先进技术,可以使用Thrift解决方案通过有效地利用企业资源以低维护成本,来绑定多个服务到网络。

参考:

[1] http://thrift.apache.org/

[2] http://avro.apache.org/

[3] http://msgpack.org/

[4] http://code.google.com/p/protobuf/

[5] http://bsonspec.org/

[6] http://hbase.apache.org/

[7] http://hive.apache.org/

[8] http://cassandra.apache.org/

[9] git://github.com/impetus-opensource/thrift.git

英文原文:

(完)

本文作者 : cyningsun

本文地址https://www.cyningsun.com/04-17-2014/multiplexing-in-thrift-enhancing-thrift-to-meet-enterprise-expectations.html

版权声明 :本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0 CN 许可协议。转载请注明出处!


目录
相关文章
|
JSON 网络协议 Dubbo
RPC框架(技术总结)
RPC框架(技术总结)
RPC框架(技术总结)
|
21天前
|
Dubbo 安全 应用服务中间件
Apache Dubbo 正式发布 HTTP/3 版本 RPC 协议,弱网效率提升 6 倍
在 Apache Dubbo 3.3.0 版本之后,官方推出了全新升级的 Triple X 协议,全面支持 HTTP/1、HTTP/2 和 HTTP/3 协议。本文将围绕 Triple 协议对 HTTP/3 的支持进行详细阐述,包括其设计目标、实际应用案例、性能测试结果以及源码架构分析等内容。
|
Dubbo Java 测试技术
分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较
Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。不过,略有遗憾的是,据说在淘宝内部,dubbo由于跟淘宝另一个类似的框架HSF(非开源)有竞争关系,导致dubbo团队已经解散(参见http://www.oschina.net/news/55059/druid-1-0-9 中的评论),反到是当当网的扩展版本仍在持续发展,墙内开花墙外香。
7301 0
|
1月前
|
自然语言处理 负载均衡 API
gRPC 一种现代、开源、高性能的远程过程调用 (RPC) 可以在任何地方运行的框架
gRPC 是一种现代开源高性能远程过程调用(RPC)框架,支持多种编程语言,可在任何环境中运行。它通过高效的连接方式,支持负载平衡、跟踪、健康检查和身份验证,适用于微服务架构、移动设备和浏览器客户端连接后端服务等场景。gRPC 使用 Protocol Buffers 作为接口定义语言,支持四种服务方法:一元 RPC、服务器流式处理、客户端流式处理和双向流式处理。
|
2月前
|
网络协议 算法
RPC为何比较高效?
RPC为何比较高效?
63 0
|
7月前
|
Dubbo 网络协议 Java
性能基础之常见RPC框架浅析
【4月更文挑战第23天】性能基础之常见RPC框架浅析
265 1
性能基础之常见RPC框架浅析
|
SQL JSON NoSQL
Thrift多路复用:增强Thrift以满足企业期望(上)
Thrift多路复用:增强Thrift以满足企业期望
231 0
|
存储 网络协议 Dubbo
如何设计可向后兼容的RPC协议
HTTP协议(本文HTTP默认1.X)跟RPC协议又有什么关系呢?都属于应用层协议。
129 0
|
Dubbo Java 测试技术
Dubbo3实践:Triple Streaming 流式通信编程示例
具体用例可以参考:[dubbo-samples-triple/pojo](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/pojo); ## 开启 Triple 新特性 —— Stream (流) Stream 是
885 0
|
XML JSON 运维
【RPC基础系列2】一文搞懂gRPC和Thrift的基本原理和区别
之前对于gRPC和Thrift只停留在会用的阶段,虽然也初步了解过两者的执行流程,但时间一长又忘了,如果让我评估两者如何选型,我更是蒙圈。所以就想把之前学习的知识整理一下,来填补自己的知识盲区。
1101 0
【RPC基础系列2】一文搞懂gRPC和Thrift的基本原理和区别