背景
在全部服务跑在 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
各位,有没有更好的办法呢?