我正在研究Avro RPC,我正在尝试创建一个简单的例子来更好地理解它。
但是我遇到了一个困难:我无法运行具有多个Responder的服务器,因为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
每个协议目前都需要单独的响应程序。如果是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 “实现”所有协议,例如:
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的客户端都可以连接到此服务器并使用其协议。