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复用的主要内容,如果未能解决你的问题,请参考以下文章

thrift中c#同一个服务怎么运行多个service

k8sService代理模式之IPVS模式无头服务发布service五种类型Fannel原理及Flannel vxlan类型

Thrift使用实例

Swift:Thrift Java注解支持

企业开发spring框架业务逻辑复用的两个技巧

Kotlin 协程协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )