一台NettyServer的Avro RPC多个响应器

里奥·科尔曼

我正在研究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 Cutting在GrokBase中发表的一篇文章指出:

目前,每种协议都需要一个单独的响应器。如果使用HTTP,则可以配置不同的ResponderServlet,以便在不同的URL上运行不同的协议。对于NettyServer和SaslSocketServer,必须在不同的端口上运行不同的协议。

但是请注意,可以创建一种协议,该协议是其他几种协议的组合,并可以为之服务。例如,使用Java反射,如果您具有一个协议的Java接口A和另一个接口的Java接口B,则可以实现“接口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))

任何需要Foo或Bar的客户端都可以连接到该服务器并使用其协议。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章