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

发布时间:2024年01月19日

解决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.

问题分析

原因就是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);
文章来源:https://blog.csdn.net/weixin_48990070/article/details/135691643
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。