Thrift多路Service复用
Posted 技术和生活小站
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thrift多路Service复用相关的知识,希望对你有一定的参考价值。
Thrift是很优秀的跨语言的RPC框架。在实际应用中,service类定义的方法越来越多,thrift -r gen java自动生成的stub类的代码量也会急剧膨胀。根据经验,平均每个方法都会生成1000行的代码量。实际项目中,一个service提供了40个方法,自动生成的stub类代码量达到4万4000行,单个类文件超过4M,无论是IDE里打开还是提交到git仓库,都非常慢,难以维护。
于是想到,将service按业务或功能进行拆分。Thrift从0.9.1开始提供了多路接口复用一个服务端口的功能,服务器通过TMultiplexedProcessor将单个接口的Processor进行包装,而客户端则通过TMultiplexedProtocol和对应的服务名获取特定的接口stub。
Server端:
TMultiplexedProcessor processor = new TMultiplexedProcessor();
processor.registerProcessor("AirlineService", new IAirlineService.Processor<IAirlineService.Iface>(new AirlineServiceImpl()));
processor.registerProcessor("AirportService", new IAirportService.Processor<IAirportService.Iface>(new AirportServiceImpl()));
Client端:
TBinaryProtocol protocol = new TBinaryProtocol(transport);
TMultiplexedProtocol mp1 = new TMultiplexedProtocol(protocol, "AirlineService");
IAirlineService.Client service1 = new IAirlineService.Client(mp1);
TMultiplexedProtocol mp2 = new TMultiplexedProtocol(protocol, "AirportService");
IAirportService.Client service2 = new IAirportService.Client(mp2);
Twitter的commons包提供的Thrift连接池默认只支持TBinaryProtocol,并不支持TMultiplexedProtocol。分析源代码,发现ThriftFactory提供了withClientFactory()方法,如果不提供ClientFactory,则用createClientFactory()方法创建一个TBinaryProtocol协议的transport。
因此,我们按照createClientFactory()重写一个方法,用TMultiplexedProtocol来包装。关键代码为:
private static <T> Function<TTransport, T> createClientFactory(Class<T> serviceInterface, final String serviceName) {
//省略代码
return implementationConstructor.newInstance(new TMultiplexedProtocol(new TBinaryProtocol(transport), serviceName));
//省略代码
}
最后在创建ThriftFactory时传递进去:
ThriftFactory.create(serviceInterface)
.withClientFactory(createClientFactory(serviceInterface, serviceInterface.getName()))
.withServiceName(serviceInterface.getName())
.withMaxConnectionsPerEndpoint(20)
.withSocketTimeout(Amount.of(30L, Time.SECONDS))
.useFramedTransport(true)
.build(ImmutableSet.copyOf(addrs));
通过以上步骤,就可以完成复杂的service的拆分,业务逻辑和代码都更清晰了。
以上是关于Thrift多路Service复用的主要内容,如果未能解决你的问题,请参考以下文章
k8sService代理模式之IPVS模式无头服务发布service五种类型Fannel原理及Flannel vxlan类型
Kotlin 协程协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )