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

查看 101|回复 10
作者:ducuducu   
目前公司对外的 api 都要经过统一 http 网关,但一些内部的 rpc 服务想要对外服务的话,我们得专门写个 http 接口暴暴露给网关,但这样要维护两套代码有点麻烦,我想在网关这层做一道转换,把外部的 http 的 json 报文转换成内部的 rpc 调用。现在有两种方案:
  • 第一种方法:在 grpc 服务的容器内起个 http 服务,这个 http 服务跟容器内的 grpc 服务通信,然后把容器内的这个 http 服务暴露给网关。相似方案的实现者有 grpc-gateway
  • 第二种方式:grpc 服务在编译 proto 文件时生成 descriptorSet 描述文件,并上传的网关,网关解析这个文件能知道怎么组装 protobuf 消息,用 DynamicMessage 方式泛型调用内部 grpc 服务。相似方案的实现有 apisix 和 consul 的 grpc-transcoder

    想知道下大厂是不是也有在网关层 json 转 rpc 的需求,你们是怎么做的呢?这两种方案你哪个好一些,有啥坑吗
  • DefoliationM   
    strings.Contains(r.Header.Get("Content-Type"), "application/grpc")
    用 content-type 判断一下
    DefoliationM   
    @DefoliationM 外面直接发 grpc 请求
    ducuducu
    OP
      
    @DefoliationM 也是个法子🥹
    GenericT   
    @DefoliationM grpc 是 http2 的,他这网关看起来就不支持的样子
    lambdaq   
    grpc 本来就是 h2 直接透传。谁不接住解析谁就是孙子就完事了。。。
    luozic   
    看你们的网关支持啥啊。已有网关是个不支持 h2 的,你这传了有啥用。 看别的网关有啥,是准备切换别的网关了?
    coderxy   
    还可以用 json 作为 grpc 的传输协议,http 网关不需要了解 pb 的内容。 最好要在网关做一个映射配置列表,不然全自动映射把内部重要接口泄漏了就 G 了
    ducuducu
    OP
      
    @GenericT 想让外部调用者直接能用 http json 报文调用。或者我可以把 proto 文件他们,让外部调用方用 grpc 方式调网关,这样,,也行
    luozic   
    @coderxy 实际这种不是应该 两个么,一个外部的网关 流量出口,一个内部的网关 or 路由 作为 soa 的编排。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部