java – 使用Netflix Feign传递数据流
作者:互联网
在工作中,我们使用Netflix的Feign Client来帮助处理服务之间的请求.然而,我对它显然缺乏流式传输数据的能力感到困惑,特别是考虑到Netflix众所周知的流媒体视频商业模式.我显然在这里遗漏了一些东西.
为了解释,服务A要求服务B的Feign客户端提供数据流,而服务B在响应中发送流.此时,调用Feign Client中的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的行让我感到困惑.
>请求对象甚至没有任何类型的流来读取,只是一个byte []体.
>在传出端,整个主体立即写入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,那么你可以进一步提高数据的可用性.
我对这个服务架构领域很陌生.我错过了什么?
解决方法:
Feign是为控制平面apis设计的,通常不会通过向上流式传输而受益.但是,支持向下流式传输.
关于如何缓冲工作(例如替代字节数组),我不关心更高效.请记住,feign的大多数设计都围绕着模板形式(json或xml)并尽可能地重复使用(例如,重新传输,缓冲的固定长度很容易且可预测).
如果它与http客户端相连,我想我会对“流媒体”设计感到高兴. IOTW,一种以传输中有意义的方式处理流式传输的子类型.例如,常规java的InputStream,OkHttp的OkIo缓冲区,Netty的Netty缓冲区等.
斯宾塞为调查https://github.com/Netflix/feign/issues/220打开了这个
标签:java,netflix-feign,netflix 来源: https://codeday.me/bug/20190609/1206583.html