dubbo-go
dubbo-go copied to clipboard
Support direct connecting to endpoint with xds protocol
What would you like to be added: 支持像 grpc 官方示例中的直连 xds 协议的 endpoint https://github.com/grpc/grpc-go/blob/master/examples/features/xds/client/main.go
例如使用这样的配置文件:
dubbo:
consumer:
references:
GreeterClientImpl:
url: xds:///dubbogo-helloworld:20000
protocol: tri
Why is this needed:
我在GKE中部署了 dubbo-go 的 provider 服务端,并且使用了GCP Traffic Director来提供 proxyless 的 service mesh。
实测,通过 python 的 grpc 客户端,以及 grpc-go官方示例 ,都可以正常通过
xds:///dubbogo-helloworld:20000
这样的 endpoint 调用 provider 的 rpc 方法。
但不知道怎么配置dubbo-go 的客户端这么做。
注意:使用了GCP Traffic Director做proxyless服务网格,就不再需要上报服务到注册中心,客户端也不需要通过注册中心来获取具体的服务端点,而是通过支持xds协议的 xds:///dubbogo-helloworld:20000
来获取服务端点(可实现自动负载均衡)。
dubbogo-helloworld:20000 是配置在 Traffic Director 里边的一个 UrlMap 规则,具体使用GCP Traffic Director做proxyless服务网格的文档参考: https://cloud.google.com/traffic-director/docs/set-up-proxyless-gke?hl=zh-cn
provider 服务端的配置文件(没有配注册中心):
dubbo:
protocols:
triple:
name: tri
port: 20000
provider:
services:
GreeterServerImpl:
interface: "" # read from stub
@ZLBer Could you take a look at this?
you can refer to these documents about proxyless: https://dubbogo.github.io/zh-cn/docs/user/tasks/mesh/traffic_management.html https://dubbogo.github.io/zh-cn/docs/user/concept/mesh/proxyless_service_mesh.html
you can refer to these documents about proxyless: https://dubbogo.github.io/zh-cn/docs/user/tasks/mesh/traffic_management.html https://dubbogo.github.io/zh-cn/docs/user/concept/mesh/proxyless_service_mesh.html
谢谢指出。我事先对dubbo-go的官方方案进行过测试,遇到的问题是:
- GKE 不再官方支持 istio ,取而代之是使用 anthos ,与 istio 兼容。生产部署时,无法在 anthos 中将 istio 的实例设置为只有1个,不满足这里指出的条件。我在其他的 k8s 发行版,例如 minikube里,可以测试工作正常。
- 如果使用非go/java的其他语言(例如python)客户端,无法通过 istio 的 xds 端点获取 dubbo 服务的负载均衡设置。即,不管后端部署了多少个 Provider 节点 Pod,Consumer 始终只会调用第一个。可能是 python 语言的 xds client支持不完善,且 triple 协议支持缺失,只能通过标准的 gRPC 协议,设定 xds 的 bootstrap 文件来指定后端。
我现在的 路径 是:
- 不使用 istio 方式做服务网格,使用 GKE 提供的 Traffic Director
- 部署 Provider 时,不指定注册中心,通过 gcloud 命令注册服务端点到 Traffic Director,配置 url mapping 规则,暴露后端 gRPC 服务,例如 dubbogo-helloworld:20000
- 使用纯 gRPC 的方式编写 client,设定 xds bootstrap 文件访问后端服务端点 xds:///dubbogo-helloworld:20000,可以通过这个端点发现服务端的负载均衡,并实现调用。在 go-client 和 python-client 上都可以成功。
只是这么做的话,客户端就利用不上dubbo-go的生态了,包括客户端 filter 以及 triple协议(识别为标准 gRPC协议),我理解并不是一个很好的方案。
总结下问题就是:
- 如果要利用 dubbo-go 对 istio 的支持(不完善)做proxyless服务网格,对于非Go/Java语言的支持不好,因为缺少对 xds 的调用栈支持。
- 如果不利用 dubbo-go 对 istio 的支持,而使用GKE提供的Traffic Director机制做proxyless服务网格,则在客户端只能通过 gRPC 标准协议进行访问,完全无法利用上 dubbo-go 的生态。