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

2022-02-10 09:35:34 +08:00
 tanxnative

背景

在全部服务跑在 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

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

4411 次点击
所在节点    云计算
15 条回复
waising
2022-02-10 09:49:39 +08:00
grpc-gateway 应该可以吧 不过我们现在是 restful -> ingress -> 服务(grpc 和 http2 个端口)
tanxnative
2022-02-10 09:55:30 +08:00
@waising 目前已经有 ingress gateway 了, 如果再增加 grpc-gateway 是不是不太好呢...
FakNoCNName
2022-02-10 10:52:43 +08:00
你是需要通过 `gprc_web` 配置复杂的 `gprc` 策略吗?如果不需要的话把 `service` 里面端口号的 `name` 改成 `http-xxx`试试。
xuzhzzz
2022-02-10 17:12:15 +08:00
服务 A 的 service 能不能同时声明 grpc-web-xxx 和 grpc-xxx 代理相同的端口? 内部服务走 grpc-xxx
xuzhzzz
2022-02-10 17:20:09 +08:00
类似这样
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
2022-02-10 17:24:21 +08:00
你这个协议还是被识别了 http 而非 grpc-web 吧,看文档:

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

我看来最大的问题是前端愿不愿意开发 grpc-web
一般是前端还是走的 http ,在 bff 层 进行 grpc 协议转换?
tanxnative
2022-02-10 19:06:51 +08:00
@xuzhzzz 已验证,可行,只需要在 service 中申明两个 port,指向同一个 targetport 即可
waising
2022-02-10 21:08:06 +08:00
@tanxnative #11 指定一个端口 后台服务起的 http 服务还是 grpc 服务
tanxnative
2022-02-11 09:29:14 +08:00
@waising 后端启动 grpc 服务.
整体的链路如下:
前端--(grpc web)-->istio gateway --(grpc web) --> grpc web 端口 - 服务 A - grpc 端口 <--(grpc) -- 服务 B
waising
2022-02-11 09:35:22 +08:00
@tanxnative #13 前端全部走 grpc-web 了 有没有什么坑? 我们现在还有 rest 的接口
tanxnative
2022-02-11 09:41:07 +08:00
@waising 鉴权变化

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

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

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

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

© 2021 V2EX