http 网关如何优雅的暴露内部 grpc 服务

252 天前
 ducuducu

目前公司对外的 api 都要经过统一 http 网关,但一些内部的 rpc 服务想要对外服务的话,我们得专门写个 http 接口暴暴露给网关,但这样要维护两套代码有点麻烦,我想在网关这层做一道转换,把外部的 http 的 json 报文转换成内部的 rpc 调用。现在有两种方案:

想知道下大厂是不是也有在网关层 json 转 rpc 的需求,你们是怎么做的呢?这两种方案你哪个好一些,有啥坑吗

2809 次点击
所在节点    程序员
28 条回复
DefoliationM
252 天前
strings.Contains(r.Header.Get("Content-Type"), "application/grpc")

用 content-type 判断一下
DefoliationM
252 天前
@DefoliationM 外面直接发 grpc 请求
ducuducu
252 天前
@DefoliationM 也是个法子🥹
GenericT
252 天前
@DefoliationM grpc 是 http2 的,他这网关看起来就不支持的样子
lambdaq
252 天前
grpc 本来就是 h2 直接透传。谁不接住解析谁就是孙子就完事了。。。
luozic
252 天前
看你们的网关支持啥啊。已有网关是个不支持 h2 的,你这传了有啥用。 看别的网关有啥,是准备切换别的网关了?
coderxy
252 天前
还可以用 json 作为 grpc 的传输协议,http 网关不需要了解 pb 的内容。 最好要在网关做一个映射配置列表,不然全自动映射把内部重要接口泄漏了就 G 了
ducuducu
252 天前
@GenericT 想让外部调用者直接能用 http json 报文调用。或者我可以把 proto 文件他们,让外部调用方用 grpc 方式调网关,这样,,也行
luozic
252 天前
@coderxy 实际这种不是应该 两个么,一个外部的网关 流量出口,一个内部的网关 or 路由 作为 soa 的编排。
Daath
252 天前
像 k8s 的 ingress-nginx 代理 http 和 grpc 服务?如果是的话,用路径匹配,分别指向不同的服务
rrfeng
252 天前
grpc 用 http2 传输的,让我看看哪家网关还不支持 http2 ……
coderxy
252 天前
@luozic 分开也可以,放在一起也可以。
pinne
252 天前
实现过第二种,不过只在内部做定时调用使用过。做法是将 proto 文件内容上传到一个地方,然后网关处解析。不过这样的问题是每次 proto 更新,都要重新上传。想法是可以直接暴露接口给网关,网关自动获取 pb 内容。
seth19960929
252 天前
第一个就错了吧, 不需要在 rpc 容器内启动 HTTP 服务,
你就另起服务作为 gateway, 然后穿透给 rpc 就好了. 就是你说的 grpc-gateway 不就挺好?
poltao
252 天前
结合注册中心,搞个统一网关管理平台,由网关负责转发 http 请求就可以了
macscsbf
252 天前
ducuducu
252 天前
@macscsbf 对的
mind3x
252 天前
敝司是写了个简单的 HTTP bridge 给一些作 gRPC 调用比较麻烦的 client 用,大概就是 header 里传 service 和 method 名,payload 和 response 都转 JSON 。
layxy
252 天前
感觉你们网关还是不健全,网关一个很重要的基础能力就是协议转换,对外统一都是 http(s),但是内部服务有 springcloud,dubbo,grpc 等,不可能让内部服务再封装 http 再在网关注册,这样所有接入方的工作量会大上不少,而且也浪费资源
layxy
252 天前
@layxy 大点的公司会分流量网关和业务网关,但是一般公司不会拆分这么细

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1032707

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX