cloudwego / volo

Rust RPC framework with high-performance and strong-extensibility for building micro-services.
https://crates.io/crates/volo
Apache License 2.0
2.13k stars 166 forks source link

不知道是否支持grpc web #459

Open thegenius opened 1 week ago

thegenius commented 1 week ago

Feature Request

询问或者请求支持GRPC-web

Crates

Motivation

Proposal

Alternatives

PureWhiteWu commented 1 week ago

你好,Volo-gRPC 实现了标准的 gRPC 功能,gRPC-web 只是需要你在 Volo-gRPC 前部署一层 envoy 即可。

thegenius commented 1 week ago

你好,Volo-gRPC 实现了标准的 gRPC 功能,gRPC-web 只是需要你在 Volo-gRPC 前部署一层 envoy 即可。

你好,恰恰正是这层envoy会导致很多架构上的复杂性,tonic支持的gRPC-web就非常好用。当然这个envoy在字节可能是没有问题的,部署成本也基本可以忽略。但是对于很多小公司而言,就变成了拦路虎。 开源项目其实笼络小公司的人心反而是最高效的手段,因为你让阿里放弃dubbo-3用volo,他们基本不会做的。但是你让小公司用volo,其实就非常有诱惑力。 支持gRPC-web的工作量其实应该还好,尤其是已经支持了gRPC的情况下。

PureWhiteWu commented 1 week ago

收到,gRPC-web 和 gRPC-gateway 都在我们的规划之中,不过可能会稍晚一些。 你这边是计划在公司内生产环境使用 Volo 嘛?

thegenius commented 1 week ago

收到,gRPC-web 和 gRPC-gateway 都在我们的规划之中,不过可能会稍晚一些。 你这边是计划在公司内生产环境使用 Volo 嘛?

我们周围有几个创业团队,我们开始密集地使用gRPC-web,其核心因素是IDL生成代码可以节省掉原来很费时间的接口调试和前后端字段对齐,对开发效率是很好的提升,但是现在gRPC-web的支持还非常少,真正可行的大概有如下几个

  1. envoy代理,后面用标准gRPC,这个代理其实很别扭,C++的网关让改造几乎不可行,wasm支持的配置又别扭。
  2. tonic,比较好的一个解决方案,本来一直打算用,但是最近他们在经历hyper-1.0的升级,把很多东西搞得不可用,这就导致了我们开始寻找tonic的替代方案,而且深感tonic背后的团队其实还是缓慢而弱小的。
  3. armeria,这个是JVM中唯一支持gRPC-web的框架,可以和Spring一起用,但其实也很别扭。

总体,我们认为gRRC-web代表的新型开发流程,可以从本质上解决很多前后端联合调试的疑难杂症,但是google向来喜欢造概念但不喜欢精细化运营打造的风格,导致一个非常好的东西,长期得不到高水准的实现,实在遗憾。我们知道volo是字节的团队在全力维护,所以真心希望字节能带个头,把这个生态建立起来。

其实同时也别排斥一些其他公司做的不错的东西,比如阿里的nacos,整个dubbo3生态里面最有价值的就是这个东西。volo是我翻代码看到的rust最优秀的实现,但是在分布式上,建议兼容nacos。

我们能够设想的最理想的开发状态为:

  1. 一个支持gRPC-web的框架,让前后端能够火速连接,无痛调试
  2. 一个支持nacos的分布式框架,让后端之间无痛,尤其建议看看他们的r-nacos,那里有一个很优秀的rust实现,内置了分布式存储。 tonic的gRPC-web支持其实不错,但整个框架的质量一般,AFIT和RPITIT发布都很久了,那边还不知道如何融入到项目中去,甚至连个基本的提案和思路都没有,阿里的dubbo-rust不用看,做得很一般,但他们的那个r-nacos确实还不错,建议考虑兼容。
PureWhiteWu commented 6 days ago

你好,非常感谢你的建议,能感觉到你对于相关生态都非常熟悉也做了深度的调研。这个建议对我们来说非常有价值。

我们目前有一个方案,可以直接让我们的 volo 框架使用基于 tower 的 layer/service,至于具体的 gRPC-web 的 Layer 的适配方案, @Millione 正在看这个事情,如果有进展会在这里及时同步。这个方案应该能解决你们的需求。

nacos 是一个服务注册和发现的中心?看起来这个和 volo 应该不存在兼容性问题?还是我的理解有哪些不正确的地方,欢迎指正。

另外,欢迎你们加入我们的用户群直接交流,如果企业用户需要支持的话也可以填写一下 https://wenjuan.feishu.cn/m?t=sH0dv11ZVGDi-5kda 这个问卷~

thegenius commented 3 days ago

gRPC-web的实现方案可能不需要特别复杂,核心就2个点

  1. header正确处理掉,这个写一个middleware就可以拦截gRPC-web相关请求并修改header
  2. 转换request body和response body,因为hyper的Body现在是一个trait了,所以设计一个GrpcWebRequest和GrpcWebRequest并实现Body的trait就可以了。具体实现可以参考tonic,代码并不复杂