在全部服务跑在 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
各位,有没有更好的办法呢?
![]() | 1 waising 2022-02-10 09:49:39 +08:00 grpc-gateway 应该可以吧 不过我们现在是 restful -> ingress -> 服务(grpc 和 http2 个端口) |
2 tanxnative OP @waising 目前已经有 ingress gateway 了, 如果再增加 grpc-gateway 是不是不太好呢... |
3 FakNoCNName 2022-02-10 10:52:43 +08:00 你是需要通过 `gprc_web` 配置复杂的 `gprc` 策略吗?如果不需要的话把 `service` 里面端口号的 `name` 改成 `http-xxx`试试。 |
![]() | 4 xuzhzzz 2022-02-10 17:12:15 +08:00 服务 A 的 service 能不能同时声明 grpc-web-xxx 和 grpc-xxx 代理相同的端口? 内部服务走 grpc-xxx |
![]() | 5 xuzhzzz 2022-02-10 17:20:09 +08:00 类似这样 |
![]() | 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 |
7 mingyuewandao 2022-02-10 17:24:21 +08:00 你这个协议还是被识别了 http 而非 grpc-web 吧,看文档: * 在默认情况下,这些协议是禁用的,目的是避免无意启用 Experimental Feature 。 如需启用它们,需配置相应的 Pilot 环境变量。 |
8 FakNoCNName 2022-02-10 17:32:03 +08:00 @mingyuewandao 识别错了应该所有的流量都不通,这里应该是 grpc 没办法识别 gprc web |
9 tanxnative OP @xuzhzzz 应该可以这样操作, 不知道 istio 方面能识别不 |
![]() | 10 xuzhzzz 2022-02-10 18:27:44 +08:00 @tanxnative 识别应该没问题吧。我没 grpc-web 应用,你试试呗 我看来最大的问题是前端愿不愿意开发 grpc-web 一般是前端还是走的 http ,在 bff 层 进行 grpc 协议转换? |
11 tanxnative OP @xuzhzzz 已验证,可行,只需要在 service 中申明两个 port,指向同一个 targetport 即可 |
![]() | 12 waising 2022-02-10 21:08:06 +08:00 @tanxnative #11 指定一个端口 后台服务起的 http 服务还是 grpc 服务 |
13 tanxnative OP @waising 后端启动 grpc 服务. 整体的链路如下: 前端--(grpc web)-->istio gateway --(grpc web) --> grpc web 端口 - 服务 A - grpc 端口 <--(grpc) -- 服务 B |
![]() | 14 waising 2022-02-11 09:35:22 +08:00 @tanxnative #13 前端全部走 grpc-web 了 有没有什么坑? 我们现在还有 rest 的接口 |
15 tanxnative OP @waising 鉴权变化 |