我正在研究Avro RPC,并且试图创建一个简单的示例以更好地理解它。
但是我面临一个困难:我不能在一个服务器上运行多个Responder
,因为NettyServer构造函数只允许我使用一个服务器:
public NettyServer(Responder responder, InetSocketAddress addr)
因此,如果我有多个IDL,例如:
@namespace("foo.bar")
protocol FooProtocol {
void foo();
}
@namespace("foo.bar")
protocol BarProtocol {
void bar();
}
我无法将两者都添加到我的NettyServer中(就像侦听同一端口一样):
object FooProtocolImpl : FooProtocol {
override fun foo(): Void? {return null}
}
object BarProtocolImpl : BarProtocol {
override fun bar(): Void? {return null}
}
val server = NettyServer(SpecificResponder(FooProtocol.PROTOCOL, FooProtocolImpl), InnetSocketAddress(9090))
如何将BarProtocol添加到我的服务器?如何使该NettyServer对两种协议都有用?
答案 0 :(得分:1)
道格·切特(Doug Cutting)在GrokBase中发表的帖子:
每个协议当前需要一个单独的响应器。如果是HTTP 使用时,可以配置不同的ResponderServlet,以便 不同的协议在不同的URL上运行。对于NettyServer和 SaslSocketServer必须在不同的端口上运行不同的协议。
但是请注意,可以创建一种协议,该协议是 其他几个协议,并为此提供服务。例如,使用Java 反射,如果您具有的是一个协议和Java的Java接口A 接口B,那么您可以实施“接口C扩展 A,B”并使用该协议。说A,B或C的客户 然后可以连接。用Java可以达到类似的效果 通过将各种客户端协议导入到特定的编译器 服务器的协议。
因此,另一种方法是创建一个protocol
来“实现”您的所有协议,例如:
@namespace("foo.bar")
protocol AllProtocols {
import idl "foo.avdl"
import idl "bar.avdl"
}
并创建实现该协议的类:
object AllProtocolsImpl : AllProtocols {
override fun foo(): Void? {return null}
override fun bar(): Void? {return null}
}
然后创建支持该协议的服务器:
val server = NettyServer(SpecificResponder(AllProtocols.PROTOCOL, AllProtocolsImpl), InetSocketAddress(9090))
任何需要Foo或Bar的客户端都可以连接到该服务器并使用其协议。