我正在研究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的特定编译器实现类似的效果。
因此,另一种方法是创建一个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] 删除。
我来说两句