V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
tanxnative
V2EX  ›  云计算

istio 下,服务全链路 grpc(前端使用 grpc web),envoy filter grpc_web 可以与 grpc 使用同一个端口吗?

  •  
  •   tanxnative · 2022-02-10 09:35:34 +08:00 · 4555 次点击
    这是一个创建于 1018 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    在全部服务跑在 istio 上,准备所有服务都使用 grpc 来通信,对于前端,则使用 grpc web 在 istio 中可以直接识别到 grpc_web 协议,但是 grpc_web filter 无法支持 grpc 协议

    整体的调用过程如下:

    前端--(grpc_web)-->ingress gateway(envoy)-->服务 A(grpc_web 端口)<---(grpc)--服务 B

    详情

    1.istio 中服务的 service 声明中可以使用 grpc-web-xxx 来标记端口为 grpc_web 协议 https://istio.io/latest/zh/docs/ops/configuration/traffic-management/protocol-selection/

    2.在标记 grpc_web 协议后,istio 会生成 envoy_filter,将 envoy(sidecar) 应用 filter grpc_web,sidecar 收到请求后,将 grpc web 请求转换为 grpc 请求与实际服务进行交互 https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/grpc_web_filter

    3.但是此端口标记为 grpc_web 协议后,前端和服务交互可以完成,但是内部的其他服务使用 grpc 与该服务交互则变得不可用了

    目前想到的办法

    1.前端交互使用 rest/json --> ingress gateway(grpc_json_transcoder_filter)--(grpc)-->服务 A

    2.前端--(grpc_web)-->ingress gateway-->服务 A(grpc_web 端口) , 其他服务调用服务 A 则为: 服务 A(grpc 端口)<--(grpc)--其他服务 ,但是这样服务 A 就需要开两个端口,干扰了服务自身的逻辑

    目前在 github 上的 issue: https://github.com/envoyproxy/envoy/issues/18194

    各位,有没有更好的办法呢?

    15 条回复    2022-02-11 09:41:07 +08:00
    waising
        1
    waising  
       2022-02-10 09:49:39 +08:00
    grpc-gateway 应该可以吧 不过我们现在是 restful -> ingress -> 服务(grpc 和 http2 个端口)
    tanxnative
        2
    tanxnative  
    OP
       2022-02-10 09:55:30 +08:00
    @waising 目前已经有 ingress gateway 了, 如果再增加 grpc-gateway 是不是不太好呢...
    FakNoCNName
        3
    FakNoCNName  
       2022-02-10 10:52:43 +08:00
    你是需要通过 `gprc_web` 配置复杂的 `gprc` 策略吗?如果不需要的话把 `service` 里面端口号的 `name` 改成 `http-xxx`试试。
    xuzhzzz
        4
    xuzhzzz  
       2022-02-10 17:12:15 +08:00
    服务 A 的 service 能不能同时声明 grpc-web-xxx 和 grpc-xxx 代理相同的端口? 内部服务走 grpc-xxx
    xuzhzzz
        5
    xuzhzzz  
       2022-02-10 17:20:09 +08:00
    类似这样
    xuzhzzz
        6
    xuzhzzz  
       2022-02-10 17:20:16 +08:00
    spec:
    ports:
    - name: http
    protocol: TCP
    port: 8000
    targetPort: http
    - name: grpc
    protocol: TCP
    port: 9000
    targetPort: grpc
    - name: grpc-web-xxx
    protocol: TCP
    port: 9001
    targetPort: grpc
    mingyuewandao
        7
    mingyuewandao  
       2022-02-10 17:24:21 +08:00
    你这个协议还是被识别了 http 而非 grpc-web 吧,看文档:

    * 在默认情况下,这些协议是禁用的,目的是避免无意启用 Experimental Feature 。 如需启用它们,需配置相应的 Pilot 环境变量。
    FakNoCNName
        8
    FakNoCNName  
       2022-02-10 17:32:03 +08:00
    @mingyuewandao 识别错了应该所有的流量都不通,这里应该是 grpc 没办法识别 gprc web
    tanxnative
        9
    tanxnative  
    OP
       2022-02-10 18:06:06 +08:00
    @xuzhzzz 应该可以这样操作, 不知道 istio 方面能识别不
    xuzhzzz
        10
    xuzhzzz  
       2022-02-10 18:27:44 +08:00
    @tanxnative 识别应该没问题吧。我没 grpc-web 应用,你试试呗

    我看来最大的问题是前端愿不愿意开发 grpc-web
    一般是前端还是走的 http ,在 bff 层 进行 grpc 协议转换?
    tanxnative
        11
    tanxnative  
    OP
       2022-02-10 19:06:51 +08:00
    @xuzhzzz 已验证,可行,只需要在 service 中申明两个 port,指向同一个 targetport 即可
    waising
        12
    waising  
       2022-02-10 21:08:06 +08:00
    @tanxnative #11 指定一个端口 后台服务起的 http 服务还是 grpc 服务
    tanxnative
        13
    tanxnative  
    OP
       2022-02-11 09:29:14 +08:00
    @waising 后端启动 grpc 服务.
    整体的链路如下:
    前端--(grpc web)-->istio gateway --(grpc web) --> grpc web 端口 - 服务 A - grpc 端口 <--(grpc) -- 服务 B
    waising
        14
    waising  
       2022-02-11 09:35:22 +08:00
    @tanxnative #13 前端全部走 grpc-web 了 有没有什么坑? 我们现在还有 rest 的接口
    tanxnative
        15
    tanxnative  
    OP
       2022-02-11 09:41:07 +08:00
    @waising 鉴权变化
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2858 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:25 · PVG 20:25 · LAX 04:25 · JFK 07:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.