Как создать службу GRPC через локальный сокет, а не через inet в scala / java - PullRequest
0 голосов
/ 14 января 2019

Мой 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()

но не мог понять, как связываться с локальным сокетом, а не с локальным

1 Ответ

0 голосов
/ 15 января 2019

localhost:port должен быть в основном таким же быстрым, как Unix Domain Socket (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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...