Avro RPC множественные ответчики для одного NettyServer - PullRequest
0 голосов
/ 04 июля 2018

Я изучаю 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 голосов
/ 04 июля 2018

Пост Дуга Режущего в 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, может подключиться к этому серверу и использовать его протокол.

...