本文介绍在不污染项目配置文件,不影响服务器服务的前提下,如何优雅地在本地调测Dubbo服务
1 问题场景
分布式应用的调试总是比常规项目开发调试起来要麻烦很多,主要如下:
- Dubbo服务开发完服务提供者后需要进行本地测试测试,本来希望请求的服务是本地服务,结果经常调用到服务器的服务
- Dubbo支持修改本地配置文件,使服务消费者调用本地服务,但是该本地配置不小心提交上Git/SVN,会导致服务器上版本服务不正常
2 解决步骤
- 1 创建properties文件
创建一个properties文件,名字可以随便命名,例如命名为:dubbo-local.properties,这个文件可以放在任何地方。该文件不提交到Git/SVN,建议不要放在工程目录里以避免自己提交了都不知道,建议放在用户目录下${user.home}
获取用户目录的方法之一:
System.out.println(System.getProperty("user.home"));
- 2 修改properties文件
# 以下是你们DubboServer.xml中配置的需要Export Service,
# 建议你有几个要Export Service都配置在这里,后面是请求本地的地址
# 地址格式:dubbo://ip:port,这里需要注意的是,需要修改为自己dubbo服务的端口
com.ibeiliao.course.stub.provider.AdCourseProvider=dubbo://localhost:20880
为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。
可以加入如下配置来禁用注册:
# 禁止服务提供者注册到注册中心
dubbo.registry.register=false
- 3 配置运行的环境变量
参数:-Ddubbo.properties.file
值:dubbo-local.properties文件的本地绝对路径
这里我基于IDEA运行Junit测试,配置环境变量方法如下
- 4 运行并测试
我这里基于Junit测试,在测试类头加上2个注解,applicationContext.xml是Spring配置文件
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:applicationContext.xml" })
可以看到,在Dubbo服务提供者代码打断点,程序可以正常再断点处停下
3 总结
参考Dubbo官方文档,Dubbo获取配置文件时,优先级如下:
- JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口
- XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效
- Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名
参考
Dubbo本地调试最优方式,本地Server端调用本地Client端
Dubbo官方文档
dubbo 知识总结 dubbo配置参考