Avro的RPC一个NettyServer多个响应(Avro RPC multiple Respon

2019-09-26 08:37发布

我学习的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有用吗?

Answer 1:

一个帖子由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))

任何需要富或酒吧客户端可以连接到该服务器,并使用其协议。



文章来源: Avro RPC multiple Responders for one NettyServer