一台NettyServer的Avro RPC多个响应器

时间:2018-07-04 03:40:16

标签: kotlin netty rpc avro idl

我正在研究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对两种协议都有用?

1 个答案:

答案 0 :(得分:1)

道格·切特(Doug Cutting)在GrokBase中发表的帖子:

  

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

     

但是请注意,可以创建一种协议,该协议是   其他几个协议,并为此提供服务。例如,使用Java   反射,如果您具有的是一个协议和Java的Java接口A   接口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的客户端都可以连接到该服务器并使用其协议。