使用 Apache Thrift 的服务多路复用

Posted

技术标签:

【中文标题】使用 Apache Thrift 的服务多路复用【英文标题】:Service Multiplexing using Apache Thrift 【发布时间】:2013-11-06 00:51:53 【问题描述】:

服务器代码:

            TMultiplexedProcessor processor = new TMultiplexedProcessor();

            processor.registerProcessor(
                "AddService",
                new AddService.Processor(new AddHandler()));

            processor.registerProcessor(
                "MultiplyService",
                new MultiplyService.Processor(new MultiplyHandler()));

            TServerTransport serverTransport = new TServerSocket(7911);



            TSimpleServer server = new TSimpleServer(new TSimpleServer.Args(serverTransport).
                   processor(processor));

            System.out.println("Starting server on port 7911 ...");
            server.serve();

客户代码:

    TFramedTransport transport;

   transport = new TFramedTransport(new TSocket("localhost", 7911));  
   transport.open();  


   TProtocol protocol = new TBinaryProtocol(transport);

   System.out.println("1");
   TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol, "AddService");
   AddService.Client service = new AddService.Client(mp);

   System.out.println("2");
   TMultiplexedProtocol mp2 = new TMultiplexedProtocol(protocol, "MultiplyService");
   MultiplyService.Client service2 = new MultiplyService.Client(mp2);

   System.out.println("3");

   System.out.println(service.add(2,2));
   System.out.println(service2.multiply(2000,200));

但是当我运行服务器(监听端口 7911)和客户端时,客户端不处理最后两次调用 add/multiply 函数。

我可以调试参数已发送到服务器,但服务器无法处理它们。

关于我缺少什么的任何指针?

【问题讨论】:

了解该语言可能会有所帮助,尤其是 Thrift 作为多语言 RPC 框架。 C#? C++?爪哇? System.out.println() 看起来像后者... 这仅在java中..客户端和服务器都 好的,“服务器无法处理它们”究竟是什么意思?您是否收到错误消息,或其他什么? 服务器运行,但不产生结果。如您所见,我已经放置了调试语句...所以调试输出是:1 2 3 但不打印任何其他内容...我在处理程序代码中也有调试语句,但它们没有出现 【参考方案1】:

未经测试,但看起来非常像您在服务器和客户端上运行两个不同的协议栈。试试这个:

TMultiplexedProcessor processor = new TMultiplexedProcessor();

processor.registerProcessor(
    "AddService",
    new AddService.Processor(new AddHandler()));

processor.registerProcessor(
    "MultiplyService",
    new MultiplyService.Processor(new MultiplyHandler()));

TServerTransport serverTransport = new TServerSocket(7911);

TTransportFactory factory = new TFramedTransport.Factory();

TServer.Args args = new TServer.Args(serverTransport);
args.processor(processor);
args.transportFactory(factory);
TSimpleServer server = new TSimpleServer(args);

System.out.println("Starting server on port 7911 ...");
server.serve();

【讨论】:

非常感谢!!它有效,但请您指向一个讨论兼容协议堆栈的链接 这并不复杂。整个堆栈包括 (1) 协议 (2) 端点传输和 (3) 可选的附加分层传输。在您的示例中,这是(1)二进制协议(2)套接字传输,(3)多路复用+帧传输。您只需要确保双方都使用这些成分的完全相同的混合物。就这样。 Randy Abernethy 即将出版的书为初学者提供了一个很好的深入解释,该书已经部分通过 MEAP 获得:manning.com/abernethy

以上是关于使用 Apache Thrift 的服务多路复用的主要内容,如果未能解决你的问题,请参考以下文章

编写案例分别使用多进程多路复用(selectepoll)实现tcp服务

多路复用之selectepollpoll

IO多路复用多并发服务器模板

select多路复用实现多客户端连接服务器

Nginx详解二:Nginx的优势

IO多路复用及ThreadingTCPServer源码阅读