我学习的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有用吗?
一个帖子由Doug在切割GrokBase状态:
一个单独的应答者当前需要为每个协议。 如果使用HTTP,不同ResponderServlet的可被配置成使得不同的协议在不同的网址上运行。 对于NettyServer和SaslSocketServer一个必须运行在不同的端口不同的协议。
但是请注意,我们可以创建一个协议,这是其他几个协议的组合和投放。 例如,使用Java反射,如果你有Java接口,一个这是一个协议和Java界面B2是另一则可以实现“C接口扩展A,B”,并担任该协议。 然后该说话是A,B或C客户端可以连接。 类似的效果可与Java的编译器特定通过导入各种客户端协议到服务器的协议来完成。
http://avro.apache.org/docs/current/idl.html#imports
因此,另一种方法是创建一个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))
任何需要富或酒吧客户端可以连接到该服务器,并使用其协议。