最近准备在给同事们做一个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是怎么做的
这篇文章先写到这里
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏