dubbo-go icon indicating copy to clipboard operation
dubbo-go copied to clipboard

Support direct connecting to endpoint with xds protocol

Open wesleywu opened this issue 1 year ago • 3 comments

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

wesleywu avatar Jun 21 '23 14:06 wesleywu

@ZLBer Could you take a look at this?

justxuewei avatar Jun 24 '23 08:06 justxuewei

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

ZLBer avatar Jun 25 '23 11:06 ZLBer

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的官方方案进行过测试,遇到的问题是:

  1. GKE 不再官方支持 istio ,取而代之是使用 anthos ,与 istio 兼容。生产部署时,无法在 anthos 中将 istio 的实例设置为只有1个,不满足这里指出的条件。我在其他的 k8s 发行版,例如 minikube里,可以测试工作正常。
  2. 如果使用非go/java的其他语言(例如python)客户端,无法通过 istio 的 xds 端点获取 dubbo 服务的负载均衡设置。即,不管后端部署了多少个 Provider 节点 Pod,Consumer 始终只会调用第一个。可能是 python 语言的 xds client支持不完善,且 triple 协议支持缺失,只能通过标准的 gRPC 协议,设定 xds 的 bootstrap 文件来指定后端。

我现在的 路径 是:

  1. 不使用 istio 方式做服务网格,使用 GKE 提供的 Traffic Director
  2. 部署 Provider 时,不指定注册中心,通过 gcloud 命令注册服务端点到 Traffic Director,配置 url mapping 规则,暴露后端 gRPC 服务,例如 dubbogo-helloworld:20000
  3. 使用纯 gRPC 的方式编写 client,设定 xds bootstrap 文件访问后端服务端点 xds:///dubbogo-helloworld:20000,可以通过这个端点发现服务端的负载均衡,并实现调用。在 go-client 和 python-client 上都可以成功。

只是这么做的话,客户端就利用不上dubbo-go的生态了,包括客户端 filter 以及 triple协议(识别为标准 gRPC协议),我理解并不是一个很好的方案。

总结下问题就是:

  1. 如果要利用 dubbo-go 对 istio 的支持(不完善)做proxyless服务网格,对于非Go/Java语言的支持不好,因为缺少对 xds 的调用栈支持。
  2. 如果不利用 dubbo-go 对 istio 的支持,而使用GKE提供的Traffic Director机制做proxyless服务网格,则在客户端只能通过 gRPC 标准协议进行访问,完全无法利用上 dubbo-go 的生态。

wesleywu avatar Jul 03 '23 03:07 wesleywu