java - grpc-java 的 TCP 传输
问题描述
grpc-java 是否有原始 TCP 传输的实现?我需要 grpc 用于内部网络服务并且没有防火墙问题,所以我想在构建基于 grpc 的服务时避免 HTTP/2 开销。
解决方案
“原始” TCP 实际上并不是一个东西。你需要在上面构建一个协议。碰巧 HTTP/2 非常接近 gRPC 可能制定的任何专有协议。我还要注意 gRPC 与 HTTP/2 紧密集成,因此 HTTP/2 在许多实现中被视为 gRPC 的一部分,并且可以作为一个单元进行优化。
gRPC 需要多路复用、流控制、基于字节的帧(不是基于消息)和元数据。这基本上就是 HTTP/2 的核心所在。您可以制定更简单的协议,但随后您开始遇到大型消息问题,这些问题会导致队列阻塞、内存使用或频繁的 TLS 连接建立成本。
制作具有这些特性的协议是一个很好理解的问题。HTTP/2 实际上在许多方面看起来比 HTTP/1 更类似于 TCP。它以与 SSH-2 大致相同的方式解决了这些问题。
选择 HTTP/2 的“损失”很小。grpc 中使用的所需标头之类的东西,例如方法名称和状态代码,不能作为结构而不是通用元数据直接优化到协议中。但是 HPACK 可以帮助一些人。原生二进制标头非常好,可以避免使用 base64 编码元数据,尽管通过 SETTINGS 协商扩展 HTTP/2 以支持它相对容易。
推荐阅读
- mysql - MySQL SELECT * 在 Unicode 上失败
- node.js - node.js 和 express 的区别
- python - 通过单击页面中的每个超链接来抓取网站
- r - 在 R 中满足另一个条件时(即当另一个变量是特定值时)需要帮助用 NA 替换值
- javascript - props.images.map 不是函数(函数组件)
- entity-framework - 在 EF Core 中的每条记录上自动设置创建和修改日期的问题
- java - Spring将实例化委托给另一个线程
- python - 如何将单行数据框连接到更大的数据框?当前获取“TypeError:预期的元组,得到str”
- c# - 如何通过使用按钮将学生对象添加到数组中?
- c# - 从 WPF MediaPlayer/DrawingVisual 绘制到 Windows 设备上下文 (hWnd/hDC) 或转换为 System.Drawing.Graphics