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

这篇具有很好参考价值的文章主要介绍了解决Dubbo 本地启动多个应用的缓存冲突问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

解决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} 为例文章来源地址https://www.toymoban.com/news/detail-804731.html

        // 创建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);

到了这里,关于解决Dubbo 本地启动多个应用的缓存冲突问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2.2 Dubbo的基本应用-本地存根 、本地伪装 、参数回调

    官网地址:  http://dubbo.apache.org/zh/docs/v2.7/user/examples/local-stub/ 本地存根,   名字很抽象,   但实际上不难理解,   本地存根就是一   段逻辑,   这段逻辑是在服务消费端执行的   ,   这段逻辑一   般都是由服务提供者提供,   服务提供者可以利用这种机制在 服务消费者

    2024年02月11日
    浏览(30)
  • 探讨Redis缓存问题及解决方案:缓存穿透、缓存击穿、缓存雪崩与缓存预热(如何解决Redis缓存中的常见问题并提高应用性能)

    Redis是一种非常流行的开源缓存系统,用于缓存数据以提高应用程序性能。但是,如果我们不注意一些缓存问题,Redis也可能会导致一些性能问题。在本文中,我们将探讨Redis中的一些常见缓存问题,并提供解决方案。 缓存穿透指的是当一个请求尝试访问一个不存在于缓存中的

    2024年02月03日
    浏览(94)
  • android studio打包报错,多个版本kotlin冲突问题

    1.在buildscript中加入ext.kotlin_version,引号内为指定kotlin版本,建议使用最新版本,具体版本可以根据项目实际情况填写。 kotlin更新note官网:Kotlin releases | Kotlin   3.如果项目中添加过运行时kotlin,需要去掉  4.gradle版本gradle插件版本参考:    

    2024年02月16日
    浏览(42)
  • Flink本地集群部署启动&常见问题的解决方法

    [zhangflink@9wmwtivvjuibcd2e software]$ vim flink/conf/flink-conf.yaml [zhangflink@9wmwtivvjuibcd2e software]$ vim flink/conf/workers [zhangflink@9wmwtivvjuibcd2e software]$ xsync flink/conf/ 启动集群在jobmanager那台机器启动 [zhangflink@9wmwtivvjuibcd2e-0001 flink]$ bin/start-cluster.sh 启动成功jobmanager会出现如下进程 启动成功taskm

    2024年02月02日
    浏览(53)
  • Redisson实现简单消息队列:优雅解决缓存清理冲突

    在项目中,缓存是提高应用性能和响应速度的关键手段之一。然而,当多个模块在短时间内发布工单并且需要清理同一个接口的缓存时,容易引发缓存清理冲突,导致缓存失效的问题。为了解决这一难题,我们采用Redisson的消息队列功能,实现了一个简单而高效的消息队列,

    2024年02月16日
    浏览(38)
  • IDEA 在本地启动多个 SpringBoot 后端服务模拟集群

    目录 方式一:使用 IDEA 界面在多个后端端口运行同一个项目 方式二:通过控制台在运行项目 jar 包时传入端口配置 1. 点击 Run / Debug 在默认端口启动项目 2. 点击 Services,点击 + 号→ Run Configuration Type → SpringBoot 3. 单击已经启动的服务,按 Ctrl + D,弹出配置窗口 Edit Configur

    2024年01月18日
    浏览(47)
  • 重置 Winsock 目录解决电脑应用无法启动问题

    前两天,因为部署测试环境,搞了一些无意操作,导致在内网域中我电脑的ip在该内网域内其它ip都能访问到,就只有这台服务器的ip访问不了;开始以为是服务器关机或者它出了什么问题,但是其它同事都能ping通,而且it设备组的告诉我,服务器正常;于是只能试试重启大法

    2024年02月08日
    浏览(49)
  • Linux系统中判断多个设备使用了同一个IP地址,判断IP地址冲突的问题

    在Linux系统中,如果多个设备使用了同一个IP地址,就会发生IP地址冲突的问题。IP地址冲突会导致网络连接不稳定,甚至会导致网络中断。因此,在使用Linux系统时,需要及时发现和解决IP地址冲突问题。 下面介绍几种在Linux系统中判断IP地址冲突的方法。 1.使用ping命令 ping命

    2024年02月16日
    浏览(76)
  • git代码冲突解决,覆盖本地,本地和远程保持一致方法

    Git是我们开发中用到的一种代码保存和合并开发的工具,但是因为开发是团队,因此会出现合并代码冲突的问题,所以我们需要解决冲突的代码。   因为在合并分支的时候,master分支和dev分支恰好有人都修改了同一个文件,GIT不知道应该以哪一个人的文件为准,所以就产生

    2024年02月05日
    浏览(47)
  • 解决因缺少COMDLG32.OCX无法启动应用程序问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或者损坏了,这时你只需下载这个comdlg32.ocx文件进行安装(前提是找到适合的版本),当我们执行

    2024年01月15日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包