асинхронный вызов grpc-java в ServerInterceptor - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть сервер grpc-java, и мне нужно выполнить асинхронный вызов службы аутентификации перед обработкой запроса.Я думаю, что это должно быть сделано в перехватчике, но для этого требуется синхронно вернуть Listener из interceptCall ()

class AuthInterceptor implements ServerInterceptor {

    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
        ServerCall<ReqT, RespT> call,
        Metadata headers,
        ServerCallHandler<ReqT, RespT> next
    ) {
        String token = ""; //get token from headers
        authService.authorize(token).subscribe(
            ok -> // process the request
            error -> call.close(Status.UNAUTHENTICATED, headers)
        );
        // Here we need to return a Listener, but we haven't started a call yet
    }
}

Так что вопросы: как сделать асинхронный вызов из ServerInterceptor, и если это возможночто делать, как правильно асинхронно проверять подлинность запросов в grpc?Я знаю, что это может быть сделано непосредственно в сервисах grpc с StreamObservers, но авторизация запросов является сквозной проблемой, и перехватчики, кажется, идеальное место для этого.

1 Ответ

0 голосов
/ 06 декабря 2018

Вам нужно вернуть ServerCall.Listener.Но так как вы не знаете Listener для делегирования, вы можете переопределить каждый метод в Listener, чтобы добавить обратный вызов в очередь.По завершении аутентификации опустошите очередь.

class DelayedListener<ReqT> extends Listener<ReqT> {
  private Listener<ReqT> delegate;
  private List<Runnable> events = new ArrayList<Runnable>();

  @Override public synchronized void onMessage(ReqT message) {
    if (delegate == null) {
      events.add(() -> delegate.onMessage(message));
    } else {
      delegate.onMessage(message);
    }
  }
  ...
  public synchronized void setDelegate(Listener<ReqT> delegate) {
    this.delegate = delegate;
    for (Runnable runnable : events) {
      runnable.run();
    }
    events = null;
  }
}
...