当前位置:   article > 正文

解决Dubbo 本地启动多个应用的缓存冲突问题_.dubbo.cache is not exclusive. maybe multiple dubb

.dubbo.cache is not exclusive. maybe multiple dubbo instances are using the

解决Dubbo 本地启动多个应用的缓存冲突问题

背景

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.

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

问题分析

原因就是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
  • 1
  • 2
  • 3
  • 4

这个只能修改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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/165920
推荐阅读
相关标签
  

闽ICP备14008679号