Как создать службу GRPC через локальный сокет, а не через inet в scala / java

Моя GRPC служба доступна только приложениям на локальном компьютере.

Я предполагаю, что он будет работать быстрее, если клиенты будут подключаться через сокет домена Unix, а не localhost: port

Я пытаюсь понять, как создать сервис grpc в этом случае, он должен работать как на CentOS, так и на Mac

В настоящее время создается такой сервер:

val server: Server = ServerBuilder.forPort(port).addService(GreeterGrpc.bindService(new GrpcServer, ec)).build().start()

Я также пробовал такую ​​конфигурацию:

val server: Server = io.grpc.netty.NettyServerBuilder.forPort(port).addService(ProtoReflectionService.newInstance()).addService(GreeterGrpc.bindService(new GrpcServer, ec)).build().start()

но не мог понять, как привязать к локальному сокету, а не к localhost


person Avner Barr    schedule 14.01.2019    source источник


Ответы (1)


localhost:port должен быть таким же быстрым, как сокет домена Unix (UDS). Основной вариант использования UDS - лучший контроль над разрешениями и безопасностью, поскольку применяются разрешения файлов Unix.

Java не поддерживает UDS. Итак, чтобы получить grpc-java с помощью UDS, вы должны использовать компонент JNI, например netty-transport-epoll или netty-transport-kqueue.

grpc-java не предоставляет готовую поддержку UDS, но вы можете сами объединить части вместе:

// You are responsible for shutting down 'elg' and 'boss'. You
// may want to provide a ThreadFactory to use daemon threads.
EventLoopGroup elg = new EpollEventLoopGroup();

ManagedChannel chan = NettyChannelBuilder
    .forAddress(new DomainSocketAddress("filename"))
    .eventLoopGroup(elg)
    .channelType(EpollDomainSocketChannel.class)
    .build();

EventLoopGroup boss = new EpollEventLoopGroup(1);
Server serv = NettyServerBuilder
    .forAddress(new DomainSocketAddress("filename"))
    .bossEventLoopGroup(boss)
    .workerEventLoopGroup(elg)
    .channelType(EpollServerDomainSocketChannel.class)
    .build();

Единственная задача группы цикла событий "босс" - accept() новые соединения. Если количество новых подключений невелико, вы можете использовать elg вместо bossEventLoopGroup().

Вы должны делиться elg как можно больше между Channel и Server.

Epoll недоступен в OS X, поэтому вам придется использовать kqueue. Для kqueue используйте KQueueEventLoop, KQueueDomainSocketChannel и KQueueServerDomainSocketChannel вместо их эквивалентов epoll.

person Eric Anderson    schedule 14.01.2019
comment
Мне не удалось установить netty native, я получаю это исключение времени выполнения failed to load the required native library at io.netty.channel.kqueue.KQueue.ensureAvailability ...at io.netty.channel.kqueue.KQueue.ensureAvailability Я добавляю вот так в свой файл sbt "io.netty" % "netty-transport-native-kqueue" % "4.1.13.Final", какие-нибудь подсказки, как это сделать? - person Avner Barr; 15.01.2019
comment
Вам нужно использовать classifier "osx-x86_64". Основной .jar включает только Java. - person Eric Anderson; 16.01.2019