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

253 天前
 ducuducu

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

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

2811 次点击
所在节点    程序员
28 条回复
dhb233
252 天前
GRPC 记得有一个功能是 Server Reflection ,是把自己支持的接口暴露出来,具体参考 https://github.com/fullstorydev/grpcurl 的文档
dhb233
252 天前
但是感觉这个 Server Reflection 直接对外的话,有点不安全。。。如果 GRPC 只对 gateway 开放应该还好
sophos
252 天前
协议转换这块是 cpu 密集型场景,apisix 等 nginx+lua 的方案,目前的实现方案性能最差(基于 lua 做的协议转换)

根据这边的落地经验,出于性能考虑,推荐以下两种:
- 基于 grpc-gateway 另起一个 http server 用于转发 grpc 请求,每次调整需要重新发布代码,性能可用,无需引入新的中间件
- 基于 envoy 配置 protoset 和 filter ,每次调整只需要更改配置,性能相对较高,需要引入新的中间件
SmiteChow
252 天前
搞复杂了,网关直接根据 http 请求组装一个 general 的 grpc 消息,grpc 有一个统一入口二次分发,并不是说网关直接就 touch 到业务层级去根据 proto 组装业务 grpc 数据
MelodYi
252 天前
先报下网关选型吧,不然也不好说你能有哪些方案。
常见的方式有
grpc2grpc ,直接过网关透传,网关正常解 ssl 之类的。envoy 之类的技术选型天然支持。
http2grpc ,网关做协议转换,kong 之类的网关有插件做。这类一般比较耗 cpu ,机器开大点。如果 protobuf 和 json 的银蛇关系非常基础、标准,可以用。这类插件遇到复杂一些的报文拼装逻辑基本歇菜。
服务自己开个 http 口子。咋说呢,用 grpc 的服务不多的话,这个方案其实最省事,啥也不用折腾,毕竟网关改个配置搞错了还影响别的业务。
nevermoreluo
252 天前
c#的话 我记得用过微软自己有一套 引入库直接在 grpc 文件里面定义 api 就好了
两个端口 一个 grpc 一个 http 调用
```
import "google/api/annotations.proto";

service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {
option (google.api.http) = {
get: "/v1/greeter/{name}"
};
}
}
```
详细的看看微软的文档吧
https://learn.microsoft.com/en-us/aspnet/core/grpc/browser?view=aspnetcore-8.0

还有 go 的 grpc gateway
https://github.com/grpc-ecosystem/grpc-gateway
gvison
252 天前
在 grpc 服务中增加一个 http 服务对现有系统影响是最小的,也就是一个微服务中同时提供了 http 和 grpc 两种调用(不是 grpc-gateway 方式),共用一套业务逻辑,B 站开源的微服务框架 kratos 是支持 http 和 grpc 的,我猜 B 站应该是这样的方案。
lemon1997
251 天前
可以参考下这个 https://github.com/lemon-1997/dynamic-grpc
会监听 grpc 服务,服务更新会利用反射读取最新的协议,无需手动去生成代码或者上传 proto ,采用跟 grpc-gateway 同样的 proto http 注解

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

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

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

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

© 2021 V2EX