springcloud-config服务器,同样的配置在linux环境下不生效

news2024/12/23 0:53:04

原本在windows下能争取的获取远程配置但是部署到linux上死活都没有内容,然后开始了远程调试,这里顺带讲解下获取配置文件如果使用的是Git源,config service是如何响应接口并返回配置信息的。先说问题,我的服务名原本是abc-abc-abc这种,因为configService 在获取配置的时候允许使用 -来指定profiles,导致这种服务名会被认为 abc 是appname abc-abc是profiles。而正确的应该是abc-abc 是appname,abc是profiles。所有后面我把服务名改成了驼峰命名即 abcAbc 这样在获取的时候就可以识别。并且在git仓库中把配置文件的名字写成了abcAbc.properties,而远程仓库名在新建的时候仓库地址会默认给全部转换为小写
在这里插入图片描述
一开始我还没太在意这个事情,我是用的策略是一个微服务一个仓库的方式进行管理

spring.cloud.config.server.git.uri=http://your_git_space/your_org_name/{application}-config.git

但是由于git Url是小写,使用 http://your_git_space/your_org_name/abcAbc-config.git 无法访问到仓库,所以我在config client中配置了name

spring:
  cloud:
    config:
      enabled: true
      discovery:
        enabled: true #是否启动config server服务发现
        service-id: CONFIG-SERVICE #配置服务名称
      profile: ${spring.profiles.active}
      name: abcabc#获取配置是使用的application name,默认是spring.application.name
      label: master

config client 在拉取config的时候会以如下的方式进行访问
http://CONFIG-SERVICE/abcabc/dev/master

tip 对应的格式为 http://CONFIG-SERVICE/{appname}/{profile}/{branch|commit id}

在configService中,对应的JGitEnvironmentRepository会按照 spring.cloud.config.server.git.uri的配置将{xxx}提醒替换即,最终生成的git url为 http://your_git_space/your_org_name/abcabc-config.git 这样可以确保git url是一个正确的git仓库地址。然后神奇的事情来了 同样的配置,和git仓库地址。在linux上不行,在windows上可以。

这里有个需要注意的东西,spring.cloud.config.server.git.basedir=file:///E:/config-repo 在windows下需要是 file:/// 在linux下是file:/

其次在linux环境中如果没有使用file:开头,则spring会把本地配置文件的地址修改为 runpath+spring.cloud.config.server.git.basedir 配置的值,比如linux环境下配置
spring.cloud.config.server.git.basedir=~/config-service/config-repo,那么给到spring 配置文件加载的File地址就会变成 /home/user/config-server/~/config-service/config-repo

具体的官方文档描述在这里 file_system_backend

排除上面的注意点之后依然不可以,先来看看具体是怎么获取到配置文件的,访问http://CONFIG-SERVICE/fxdanmugw/dev/master,暴露该端点的是org.springframework.cloud.config.server.environment.EnvironmentController#labelled

	@RequestMapping(path = "/{name}/{profiles}/{label:.*}",
			produces = MediaType.APPLICATION_JSON_VALUE)
	public Environment labelled(@PathVariable String name, @PathVariable String profiles,
			@PathVariable String label) {
		return getEnvironment(name, profiles, label, false);
	}

然后通过EnvironmentEncryptorEnvironmentRepository#findOne(java.lang.String, java.lang.String, java.lang.String, boolean)
···>CompositeEnvironmentRepository#findOne(java.lang.String, java.lang.String, java.lang.String, boolean)
···>CompositeEnvironmentRepository#findOne(java.lang.String, java.lang.String, java.lang.String, boolean)
···>MultipleJGitEnvironmentRepository#findOne
···>AbstractScmEnvironmentRepository#findOne(java.lang.String, java.lang.String, java.lang.String, boolean)

该超类的方法是通过 JGitEnvironmentRepository的实例调用的

好的核心逻辑到了我们看下源码

	public synchronized Environment findOne(String application, String profile,
			String label, boolean includeOrigin) {
		NativeEnvironmentRepository delegate = new NativeEnvironmentRepository(
				getEnvironment(), new NativeEnvironmentProperties());
		Locations locations = getLocations(application, profile, label);
		delegate.setSearchLocations(locations.getLocations());
		Environment result = delegate.findOne(application, profile, "", includeOrigin);
		result.setVersion(locations.getVersion());
		result.setLabel(label);
		return this.cleaner.clean(result, getWorkingDirectory().toURI().toString(),
				getUri());
	}

大致流程新建了一个NativeEnvironmentRepository 去读取本地文件,getLocations里面会根据application,profile,label 刷新对应的git仓库,保证仓库的version版本和远程git仓库一致,然后启动一个SpringApplication容器 使用配置–spring.config.path=file:/xxxx 的形式让这个容器去加载配置文件,在从上下文中取出所有和当前 application,profile,label 符合的配置返回出去,application=abcabc,profile=dev,label=master。有点不可思议完全没想到会使用SpringApplicationBuilder 构建一个容器进行配置读取,这个懒投的可以,当然可能是有其他必要原因导致不得不这么做,下面来看详细部分代码
git 仓库刷新部分之前博客有讲过,简单过一下
JGitEnvironmentRepository#getLocations ···> JGitEnvironmentRepository#refresh

delegate.setSearchLocations(locations.getLocations());locations就是过滤出来的本地仓库地址它的实际值可能是这样的
在这里插入图片描述
application被我马赛克了,理解成abcabc吧,然后依靠NativeEnvironmentRepository#findOne(java.lang.String, java.lang.String, java.lang.String, boolean)来获取Environment,具体代码如下

@Override
	public Environment findOne(String config, String profile, String label,
			boolean includeOrigin) {
		SpringApplicationBuilder builder = new SpringApplicationBuilder(
				PropertyPlaceholderAutoConfiguration.class);
		ConfigurableEnvironment environment = getEnvironment(profile);
		builder.environment(environment);
		builder.web(WebApplicationType.NONE).bannerMode(Mode.OFF);
		if (!logger.isDebugEnabled()) {
			// Make the mini-application startup less verbose
			builder.logStartupInfo(false);
		}
		String[] args = getArgs(config, profile, label);
		// Explicitly set the listeners (to exclude logging listener which would change
		// log levels in the caller)
		builder.application()
				.setListeners(Arrays.asList(new ConfigFileApplicationListener()));

		try (ConfigurableApplicationContext context = builder.run(args)) {
			environment.getPropertySources().remove("profiles");
			return clean(new PassthruEnvironmentRepository(environment).findOne(config,
					profile, label, includeOrigin));
		}
		catch (Exception e) {
			String msg = String.format(
					"Could not construct context for config=%s profile=%s label=%s includeOrigin=%b",
					config, profile, label, includeOrigin);
			String completeMessage = NestedExceptionUtils.buildMessage(msg,
					NestedExceptionUtils.getMostSpecificCause(e));
			throw new FailedToConstructEnvironmentException(completeMessage, e);
		}
	}

主要看args的值,如下

args[]数值
0 = "--spring.config.name=application,abcabc"
1 = "--spring.cloud.bootstrap.enabled=false"
2 = "--encrypt.failOnError=false"
3 = "--spring.config.location=file:/E:/config-repo/config-repo-6098804444752826688/"

注意看这里的–spring.config.name用的是 接口请求传进来的appname。在windows和linux中文件系统对文件名的大小写敏感程度不同,举个例子
在这里插入图片描述
在linux是允许大小写不同的文件存在的
在这里插入图片描述
罪魁祸首出现了,问题就是出现在这里,windows的文件系统与linux的差异导致了,他们表现上的差异,我的处理方式是,将git url的地址改成和服务一样的驼峰大小写,再删除掉config client中配置的name,或者直接不适用 特定的名称来编写配置文件,全部写道application.yml 里面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1874470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React 中 useEffect

React 中 useEffect 是副作用函数,副作用函数通常是处理外围系统交互的逻辑。那么 useEffect 是怎处理的呢?React 组件都是纯函数,需要将副作用的逻辑通过副作用函数抽离出去,也就是副作用函数是不影响函数组件的返回值的。例如&a…

stthjpv:一款针对JWT Payload的安全保护工具

关于stthjpv stthjpv是一款针对JWT Payload的安全保护工具,这款工具集多种技术和思想于一身,可以通过不断改变相关参数值来防止Payload被解码,以帮助广大研究人员更好地保护JWT Payload的安全性。 除此之外,该工具还能够确保JWT …

外贸业务员如何克服打电话恐惧?

更多外贸干货及开发客户的方法,尽在微信【千千外贸干货】 每个人都曾经历过从零开始的阶段。在我们决定要做外贸销售的那一刻起,便意识到沟通的重要性。许多朋友提到,通常通过邮件开发客户,或者在B2B平台上回复客户的询盘。但真的…

技术干货丨如何加速工业数字孪生应用落地?

什么是数字孪生? “孪生”概念最早可追溯至NASA的阿波罗项目,随着数字化技术的进步,“孪生”概念应用从物理孪生向数字孪生发展。即“数字孪生”是对资产、进程或系统的一种数字化表示,并通过信息交互、数据同步等方式实现物理实体…

云计算【第一阶段(23)】Linux系统安全及应用

一、账号安全控制 1.1、账号安全基本措施 1.1.1、系统账号清理 将非登录用户的shell设为/sbin/nologin锁定长期不使用的账号删除无用的账号 1.1.1.1、实验1 用于匹配以/sbin/nologin结尾的字符串,$ 表示行的末尾。 (一般是程序用户改为nologin&…

【Matlab 六自由度机器人】机器人动力学之推导拉格朗日方程(附MATLAB机器人动力学拉格朗日方程推导代码)

【Matlab 六自由度机器人】机器人动力学概述 近期更新前言正文一、拉格朗日方程的推导1. 单自由度系统2. 单连杆机械臂系统3. 双连杆机械臂系统 二、MATLAB实例推导1. 机器人模型的建立2. 动力学代码 总结参考文献 近期更新 【汇总】 【Matlab 六自由度机器人】系列文章汇总 …

原码、反码、补码、移码的计算转换

文章目录 正数负数原码 & 反码反码 -> 补码原码 <-> 补码移码 <- Other 方法总结练习 正数 原码 和 反码 和 补码 都是一样的不会发生变化 因此&#xff0c;计算的时候先看第一位 符号位 &#xff0c;只要能发现是正数&#xff0c;三者都不变 移码 在补码基础…

DataV大屏组件库

DataV官方文档 DataV组件库基于Vue &#xff08;React版 (opens new window)&#xff09; &#xff0c;主要用于构建大屏&#xff08;全屏&#xff09;数据展示页面即数据可视化&#xff0c;具有多种类型组件可供使用&#xff1a; 源码下载

Web渗透-逻辑漏洞

一、概述 逻辑漏洞是指由于程序逻辑不严或逻辑太复杂&#xff0c;导致一些逻辑分支不能够正常处理或处理错误&#xff0c;一般出现任意密码修改&#xff08;没有旧密码验证&#xff09;,越权访问&#xff0c;密码找回&#xff0c;交易支付金额等。对常见的漏洞进行过统计&…

蒙特卡洛法求定积分方

对于连续函数密度函数&#xff0c;求某一个区间的概率时&#xff0c;理论上通过积分获取&#xff0c; 以求曲线围成的面积为例 当我们在[a,b]之间随机取一点x时&#xff0c;它对应的函数值就是f(x)。接下来我们就可以用f(x)*(b-a)来粗略估计曲线下方的面积&#xff0c;也就是我…

探索区块链:颠覆性技术的崛起

目录 一、引言 二、区块链技术概述 三、区块链应用场景 四、区块链面临的挑战 五、区块链的未来展望 六、结语 一、引言 在数字化浪潮的推动下&#xff0c;区块链技术以其独特的去中心化、透明性和不可篡改性等特性&#xff0c;正在逐步改变我们的生活。从金融领域到供应…

最新Node.js安装及配置详细教程

文章目录 下载Node.js安装Node.js配置Node.js1、修改npm包的全局安装路径和缓存路径2、环境变量设置3、镜像源配置4、安装其他包管理工具 下载Node.js 下载&#xff1a;https://nodejs.org/en/download/prebuilt-installer&#xff0c;下载LTS版本的&#xff0c;LTS(Long Time…

最小生成树拓展应用

文章目录 最小生成树拓展应用理论基础 题单1. [新的开始](https://www.acwing.com/problem/content/1148/)2. [北极通讯网络](https://www.acwing.com/problem/content/1147/)3. [走廊泼水节](https://www.acwing.com/problem/content/348/)4. [秘密的牛奶运输](https://www.ac…

001 SpringMVC介绍

文章目录 基础概念介绍BS和CS开发架构应用系统三层架构MVC设计模式 SpringMVC介绍SpringMVC是什么SpringMVC与Spring的联系为什么要学习SpringMVC 六大组件介绍六大组件(MVC组件其他三大组件)说明 基础概念介绍 BS和CS开发架构 一种是C/S架构&#xff0c;也就是客户端/服务器…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【15】异步_线程池

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【15】异步_线程池 初始化线程的 4 种方式开发中为什么使用线程池线程池七大参数线程池工作原理常见的 4 种线程池生产中如何使用线程池&#xff1f;CompletableFuture 异步编排—简介业务…

dataX同步SQLserver到MySQL数据

引用datax官方描述&#xff1a; DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS…

如何利用“AI交互数字人+展厅”拓展文娱消费空间?

打造新生代潮玩聚集地&#xff0c;打造演艺新空间&#xff0c;促进虚拟现实体验等文娱业态场景创新&#xff0c;成为了当下发展文旅消费新场景的一大重要手段。数字人汇集了虚拟现实、增强现实、全息投影、人工智能、实时传输语音合成等数字技术&#xff0c;可以利用数字人重构…

在等保2.0的合规性审查中,常见的难点和误区有哪些?

在等保2.0&#xff08;即《信息安全技术 网络安全等级保护基本要求》GB/T 22239-2019&#xff09;的合规性审查中&#xff0c;企业和机构经常会遇到一些难点和误区&#xff0c;主要包括以下几个方面&#xff1a; 常见误区 1. “三同步”不同步&#xff1a;等保2.0强调“同步规…

golang生成RSA公钥和密钥

目录 场景 场景一&#xff1a;加密、解密 场景二&#xff1a;微信退款 场景三&#xff1a;SSL证书 为什么是.key和.pem格式的文件 生成密钥、公钥 密钥、公钥保存到文件中 第一个&#xff1a;保存密钥到文件里 第二个&#xff1a;保存公钥到文件里 场景 场景一&#…

AI产品活跃用户排名出炉!文心一言APP国内第一,Kimi疯狂掉队

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 6月28日&#xff0c;极光大数据旗下月狐数据发布2024年5月中国生成式AI行业市场热点月度分析报告&#xff0c;披露了国内移动端主流生成式AI应用…