dubbo原生api注册服务只能注册第一个服务问题排查

avatar 2021年08月29日16:42:51 0 99 views

最近准备在给同事们做一个dubbo的基本使用和源码讲解。

在用原生api写demo时,注册多个服务,只有一个能成功

问题描述

demo代码片段如下,我想注册RoleService和UserService

// 定义服务
ServiceConfig<UserServiceImpl> userService = new ServiceConfig<UserServiceImpl>();
userService.setInterface(UserService.class);
userService.setRef(new UserServiceImpl());
userService.setGroup("provider");

ServiceConfig<RoleServiceImpl> roleService = new ServiceConfig<RoleServiceImpl>();
roleService.setInterface(RoleService.class);
roleService.setRef(new RoleServiceImpl());
roleService.setGroup("provider");


List<ServiceConfig> services = new ArrayList<ServiceConfig>();
services.add(roleService);
services.add(userService);

DubboBootstrap bootstrap = DubboBootstrap.getInstance();
// 设置应用名
bootstrap.application(new ApplicationConfig("provider-demo"))
        // 设置注册中心
        .registry(new RegistryConfig("nacos://127.0.0.1:8848"))
        // 设置需要注册的服务
        .services(services).start();

System.out.println("========> provider finish register services");

但是在 nacos 上只能看到一个服务

 

问题排查

1、开启日志功能,找到日志位置

通过看代码,我们发现了dubbo里有很多打日志的地方,于是我们配置了一下log4j,方便获取一些信息

果不其然,看到了一条日志信息

[WARN ] 2021-08-29 16:03:06,899 method:org.apache.dubbo.config.context.ConfigManager.addIfAbsent(ConfigManager.java:500)

 [DUBBO] Duplicate ServiceConfig found, there already has one default ServiceConfig or more than two ServiceConfigs have the same id, you can try to give each ServiceConfig a different id : <dubbo:service exported="false" unexported="false" />, dubbo version: 2.7.8, current host: 192.168.0.102

当然,如果没有开启日志,也可以根据 .start() 方法进去看源码,慢慢找,也能找到此处

 

2、找到代码,打断点

我们找到 ConfigManager 这个类,因为idea自带有反编译工具,可以直接按2下shift搜索jar包里的class文件

通过搜索 there already has one default ServiceConfig  这句话,找到了下面这段代码,在 if 里打个断点

发现我们第2个服务 UserService 进入了 if 里,所以最终打了提醒日志

日志意思就是说我们的第2个ServiceConfig重复了,不能添加到configsMap里

然后我们看看上面的 key 是怎么获取的,为什么值是 ServiceConfig@default

 

3、查看 getId(config) 源码

可以看到id是空的,然后会去判断是否为默认配置,因为没有isDefault()这个方法,返回null所以设置的serviceConfig为

serviceConfig#default

因为2个ServiceConfig的id都是这个,所以导致第2个没有最终放到configsMap里,从而没有完成服务暴露

 

解决办法

给serviceConfig设置id即可

然后看注册中心也能看到2个服务

后面我们去看spring整合dubbo源码时,去看看spring是怎么做的

这篇文章先写到这里

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
可以匿名评论或者登录后台评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0