На работе мы используем 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
это то, что меня смущает.
- Объект
request
даже не имеет каких-либо потока для чтения, толькоbyte[] body
. - На исходящем конце все тело записывается в
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
, вы могли бы улучшить, что еще больше для передачи данных, как она станет доступной.
Я очень новичок в этой области сервисной архитектуры. Что мне не хватает?
К сожалению, что делает стенд IOTW для? (Я владею миром? Изображение недели?) – checketts
«Это на вики» – btidwell