Dubbo : 3.0.9
Nacos : 2.2.3
当在本地启动多个Dubbo应用时,因为默认的缓存路径为{user.hom} + File.separator + ".dubbo"
, 因此第二个应用启动时会抛出以下异常:
Failed to create file store cache. Local file cache will be disabled. Cache file name: C:\Users\admin\.dubbo\.mapping.dubbo.cache
org.apache.dubbo.common.cache.FileCacheStoreFactory$PathNotExclusiveException: C:\Users\admin\.dubbo\.mapping.dubbo.cache is not exclusive.
Failed to create file store cache. Local file cache will be disabled. Cache file name: C:\Users\admin\.dubbo\.metadata.nacos10.188.188.11%003a8848
org.apache.dubbo.common.cache.FileCacheStoreFactory$PathNotExclusiveException: C:\Users\admin\.dubbo\.metadata.10.188.188.11%003a8848.dubbo.cache is not exclusive.
原因就是dubbo 默认使用{user.hom} + File.separator + ".dubbo"
这个作为缓存的目录,当这个目录中因为第一个启动项目,已经创建了registry.cache
,.mapping.dubbo.cache
, .metadata.nacos10.188.188.11%003a8848.dubbo.cache
等缓存文件时。第二个项目再想创建就会出现这个文件访问冲突的问题。
这个问题不影响使用,创建不了但还是可以读的,但每次启动都报这个错就很恶心。因此找方案解决。
1、用Docker 容器部署应用,一个应用一个容器就没这个问题;
2、每个应用指定独立的缓存目录;
3、如果一个应用有多个实例则每个实例指定一个缓存目录;
dubbo.registry.file = ${user.home}/.dubbo/${spring.application.name}/registry.cache
dubbo.metadata-report.file = ${user.home}\\.dubbo\\${spring.application.name}\\.mapping.dubbo.cache
# 当前指定了dubbo.metadata-report.file 配置时,必须同时指定dubbo.metadata-report.address ,否则在启动时会提示元数据注册地址不能为空
dubbo.metadata-report.address = nacos://10.188.188.1:8848
这个只能修改registry.cache
的存放位置,.mapping.dubbo.cache
不会变。
修改启动Main方法,在应用启动前修改dubbo.meta.cache.filePath
,dubbo.mapping.cache.filePath
这个两个系统环境变量。
以修改路径为{user.hom} + File.separator + ".dubbo"+ {spring.application.name}
为例
// 创建SpringApplication实例
SpringApplication application = new SpringApplication(Application.class);
// 添加自定义的ApplicationContextInitializer
application.addInitializers(context -> {
// 获取Environment对象
Environment env = context.getEnvironment();
// 从Environment中读取"spring.application.name"属性值
String appName = env.getProperty("spring.application.name");
String filePath = System.getProperty("user.home") + File.separator + ".dubbo" +File.separator + appName;
// 修改dubbo的本地缓存路径,避免缓存冲突
System.setProperty("dubbo.meta.cache.filePath", filePath);
System.setProperty("dubbo.mapping.cache.filePath",filePath);
});
//启动应用
application.run(args);