2014-12-10 5 views
3

На работе мы используем Netflix Feign Client, чтобы помочь с запросами между службами. Однако я смущен своей очевидной неспособностью передавать данные, особенно учитывая известную бизнес-модель Netflix для потокового видео. Я явно что-то пропустил.Передача потока данных с использованием Netflix Feign

Чтобы пояснить, скажем Service A, запрашивает у клиента Feign Service B поток данных, а Service B отправляет поток в ответ. На данный момент, метод execute() в Притвориться Клиент получает называется:

@Override public Response execute(Request request, Options options) throws IOException { 
    HttpURLConnection connection = convertAndSend(request, options); 
    return convertResponse(connection); 
} 

HttpURLConnection convertAndSend(Request request, Options options) throws IOException { 
    final HttpURLConnection connection = (HttpURLConnection) new URL(request.url()).openConnection(); 

    /** SNIP **/ 

    if (request.body() != null) { 
    if (contentLength != null) { 
     connection.setFixedLengthStreamingMode(contentLength); 
    } else { 
     connection.setChunkedStreamingMode(8196); 
    } 
    connection.setDoOutput(true); 
    OutputStream out = connection.getOutputStream(); 
    if (gzipEncodedRequest) { 
     out = new GZIPOutputStream(out); 
    } 
    try { 
     out.write(request.body()); // PROBLEM 
    } finally { 
     try { 
     out.close(); 
     } catch (IOException suppressed) { 
     } 
    } 
    } 
    return connection; 
} 

В строке PROBLEM это то, что меня смущает.

  1. Объект request даже не имеет каких-либо потока для чтения, только byte[] body.
  2. На исходящем конце все тело записывается в OutputStream сразу. Разве он не должен класть данные вместо этого?

Например

// pseudocode 
try { 
    location = 0 
    bufferSize = 2048 
    buffer = request.body().read(location, bufferSize) 
    while(out.readyToRead() && buffer.length > 0) { 
    out.write(buffer) 
    location += bufferSize 
    buffer = request.body().read(location, bufferSize) 
    } 
} 

Если запрос был поток, а не просто byte[] body, вы могли бы улучшить, что еще больше для передачи данных, как она станет доступной.

Я очень новичок в этой области сервисной архитектуры. Что мне не хватает?

ответ

5

Feign был разработан для плоскости управления apis, что часто не выгодно, если вы поторопитесь вверх. Тем не менее, поддерживается поток вниз.

Я не забочусь о том, чтобы быть более эффективным в отношении того, как работает буферизация (например, альтернатива байтовому массиву). Просто имейте в виду, что дизайн большинства симуляторов вращается вокруг шаблонов форм (json или xml) и повторного использования их как можно больше (например, при повторной передаче, буферизации + фиксированной длине легко и предсказуемо).

Я думаю, что я был бы очень доволен «потоковым» дизайном, если бы он был связан с клиентом http. IOTW, подтип, который обращается к потоку таким образом, который имеет смысл в транспорте. Например, InputStream для регулярного Java, Окио буфера для OkHttp, Нетти буфера для Нетти и т.д.

Спенсер открыл это для исследования https://github.com/Netflix/feign/issues/220

+5

К сожалению, что делает стенд IOTW для? (Я владею миром? Изображение недели?) – checketts

+0

«Это на вики» – btidwell

Смежные вопросы