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

2023-12-25 292 views
6

我用的 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, 就显得有点傻

求大佬解惑!!!

回答

7

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

9

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

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

6

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

9

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

2

现在的搞法是:

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;
}