TMultiplexedProtocol 和 TMultiplexedProcessor
TMultiplexedProtocol 和 TMultiplexedProcessor 实际上都用于实现 Thrift 的多路复用,但它们的使用场景和方法有些不同。
1. TMultiplexedProtocol 的多路复用
TMultiplexedProtocol 主要用于 客户端 和 传输层 之间的多路复用。它允许客户端在同一个连接上,通过指定不同的服务名来区分和调用不同的服务。
代码示例:
// 创建一个基础的传输对象
TTransport transport = new TSocket("localhost", 9090);
TProtocol baseProtocol = new TBinaryProtocol(transport);// 创建多路复用协议,分别为不同的服务设置服务名
TMultiplexedProtocol protocol1 = new TMultiplexedProtocol(baseProtocol, "ExampleService1");
TMultiplexedProtocol protocol2 = new TMultiplexedProtocol(baseProtocol, "ExampleService2");// 创建服务端和客户端,分别使用不同的协议
ExampleService1.Client client1 = new ExampleService1.Client(protocol1);
ExampleService2.Client client2 = new ExampleService2.Client(protocol2);// 使用 client1 和 client2 调用不同的服务方法
client1.someMethod();
client2.someOtherMethod();
说明:
- TMultiplexedProtocol 通过在 客户端 使用不同的 服务名 来区分不同的服务。
- 这个协议包装了一个基础协议(比如 TBinaryProtocol),并根据服务名来路由请求。
- 客户端通过使用不同的 TMultiplexedProtocol 实例,调用不同的服务方法。服务端接收到请求时,通过协议中的服务名来决定调用哪个服务。
适用场景:
- 客户端多路复用: 客户端可能需要调用多个服务,可以使用不同的 TMultiplexedProtocol 来处理多个服务的请求。
2. TMultiplexedProcessor 的多路复用
TMultiplexedProcessor 用于 服务端,它允许在同一个服务器端口上注册多个不同的服务。服务端根据请求中的服务名,路由到对应的服务处理器。
代码示例:
// 创建多路复用的处理器
TMultiplexedProcessor multiplexedProcessor = new TMultiplexedProcessor();// 注册多个服务
multiplexedProcessor.registerProcessor("ExampleService1", // 服务名new ExampleService1.Processor<>(new ExampleService1Impl())
);
multiplexedProcessor.registerProcessor("ExampleService2", // 服务名new ExampleService2.Processor<>(new ExampleService2Impl())
);// 创建服务器
TServerTransport serverTransport = new TServerSocket(9090);
TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverTransport).processor(multiplexedProcessor).minWorkerThreads(2).maxWorkerThreads(10);// 启动服务器
TServer server = new TThreadPoolServer(args);
server.serve(); // 阻塞调用,直到服务停止
说明:
- TMultiplexedProcessor 是服务端使用的多路复用处理器。你将多个服务(例如 ExampleService1 和 ExampleService2)注册到这个处理器中。
- 当服务端接收到请求时,它会根据请求中的服务名来决定调用哪个服务。这样,多个服务可以共享同一个端口,而不需要为每个服务分配独立的端口。
适用场景:
- 服务端多路复用: 在同一个端口上提供多个服务,通过服务名来区分不同的服务。
总结:两个多路复用的区别
- TMultiplexedProtocol(客户端使用):
- 用于 客户端,通过传输协议区分不同服务。
- 每个服务使用不同的协议包装(TMultiplexedProtocol)。
- 适合一个客户端调用多个服务的场景。
- TMultiplexedProcessor(服务端使用):
- 用于 服务端,通过服务名区分不同的服务处理器。
- 每个服务在服务端注册为一个独立的处理器,服务名用于路由请求。
- 适合多个服务共享同一个端口的场景。
- TMultiplexedProtocol(客户端) 用于客户端调用多个服务时,通过不同的协议来区分不同的服务。
- TMultiplexedProcessor(服务端) 用于在服务端共享同一个端口时,通过服务名来区分不同的服务。
这两者通常是配合使用的:客户端通过 TMultiplexedProtocol 发起请求,服务端通过 TMultiplexedProcessor 来处理不同的服务。