编程语言
首页 > 编程语言> > java – 使用Netflix Feign传递数据流

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