istio 下,服务全链路 grpc(前端使用 grpc web),envoy filter grpc_web 可以与 grpc 使用同一个端口吗? - V2EX
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 4992 次点击
    这是一个创建于 1342 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    在全部服务跑在 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     Solana     5632 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 06:31 PVG 14:31 LAX 23:31 JFK 02:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86