在全部服务跑在 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 鉴权变化
|