dubbo icon indicating copy to clipboard operation
dubbo copied to clipboard

dubbo 使用 k8s 为注册中心, 消费者@DubboReference providedby 不配置 提示没有服务提供者

Open zhaoqf-cq opened this issue 3 years ago • 7 comments

我用的 dubbo3.0.7,参考 https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-kubernetes 这个 demo 创建的spring boot 应用,运行一切正常

由于服务可能比较多, 我不太想 像 demo 里面一个个订阅服务 subscribed-services=dubbo-samples-apiserver-provider, 所以我取消了这个配置, 项目依旧可以运行, 但是我不太明白这个地址的配置能有那些, 取消了这个订阅有什么影响?

dubbo.registry.address=kubernetes://DEFAULT_MASTER_HOST?registry-type=service&duplicate=false&namespace=dubbo-demo&trustCerts=true&subscribed-services=dubbo-samples-apiserver-provider

然后在消费接口这里使用的是 @DubboReference(version = "1.0.0", providedBy = "dubbo-samples-apiserver-provider") 这样来引用接口,这里为什么需要声明应用呢? 而且我尝试过不声明应用启动就会提示 没有服务提供者 导致启动失败,如果一个个加providedby, 就显得有点傻

求大佬解惑!!!

zhaoqf-cq avatar Jul 27 '22 03:07 zhaoqf-cq

这里需要一个服务映射的功能。 因为dubbo本身是没法在消费端侧知道interface对应的appName是什么,在 Kubernetes 体系下,Service 对应的是 appName,没有 appName 就没法做订阅,所以才有了 providedBy 这个参数。 对于一些其他注册中心下的,比如 nacos 默认会开启元数据中心,元数据中心中会存有一份 interface to appName 的映射,所以不需要配 providedBy 参数。但是 Kubernetes 原生体系下没有这个元数据中心。

AlbumenJ avatar Jul 27 '22 09:07 AlbumenJ

这里需要一个服务映射的功能。 因为dubbo本身是没法在消费端侧知道interface对应的appName是什么,在 Kubernetes 体系下,Service 对应的是 appName,没有 appName 就没法做订阅,所以才有了 providedBy 这个参数。 对于一些其他注册中心下的,比如 nacos 默认会开启元数据中心,元数据中心中会存有一份 interface to appName 的映射,所以不需要配 providedBy 参数。但是 Kubernetes 原生体系下没有这个元数据中心。

感谢大佬解惑,看到回复还第一时间试过 单独配置一个 元数据中心,居然真的可以... 惊喜, 非常感激

zhaoqf-cq avatar Jul 27 '22 14:07 zhaoqf-cq

目前试了一下 zk 和 redis 作为元数据中心, 官网连接: https://dubbo.apache.org/zh/docs/v3.0/references/metadata/ 很遗憾的是 image

zhaoqf-cq avatar Jul 28 '22 02:07 zhaoqf-cq

这里需要一个服务映射的功能。 因为dubbo本身是没法在消费端侧知道interface对应的appName是什么,在 Kubernetes 体系下,Service 对应的是 appName,没有 appName 就没法做订阅,所以才有了 providedBy 这个参数。 对于一些其他注册中心下的,比如 nacos 默认会开启元数据中心,元数据中心中会存有一份 interface to appName 的映射,所以不需要配 providedBy 参数。但是 Kubernetes 原生体系下没有这个元数据中心。

作为一个使用思维感觉上提个自己的建议,在消费者端指定providedBy没有在服务提供者端指定好,毕竟服务提供者是最知道自己的应用名的,所以可以在暴露出来的interface上带上这个应用名信息,小建议

zzps avatar Nov 15 '22 03:11 zzps

作为一个使用思维感觉上提个自己的建议,在消费者端指定providedBy没有在服务提供者端指定好,毕竟服务提供者是最知道自己的应用名的,所以可以在暴露出来的interface上带上这个应用名信息,小建议

一个不错的提议,或许我们可以调研下怎么支持

AlbumenJ avatar Nov 16 '22 08:11 AlbumenJ

现在的搞法是:

public interface GreetingService {
    String sayHello(String name);
}

@Component("annotatedConsumer")
public class GreetingServiceConsumer {
    @DubboReference(version = "1.0.0", providedBy = "dubbo-samples-xds-provider")
    private GreetingService greetingService;
}

"在消费者端指定providedBy没有在服务提供者端指定好,毕竟服务提供者是最知道自己的应用名的,所以可以在暴露出来的interface上带上这个应用名信息",我觉得这样是比较ok的。 代码上可以改成这样:

@DubboProvidedbBy("dubbo-samples-xds-provider")
public interface GreetingService {
    String sayHello(String name);
}

@Component("annotatedConsumer")
public class GreetingServiceConsumer {
    @DubboReference(version = "1.0.0")
    private GreetingService greetingService;
}

robberphex avatar Dec 14 '22 10:12 robberphex

look at this https://github.com/apache/dubbo/pull/11390

aamingaa avatar Jan 29 '23 11:01 aamingaa