当前位置: 首页 > news >正文

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

原本在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: truediscovery:enabled: true #是否启动config server服务发现service-id: CONFIG-SERVICE #配置服务名称profile: ${spring.profiles.active}name: abcabc#获取配置是使用的application name,默认是spring.application.namelabel: 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,具体代码如下

@Overridepublic 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 verbosebuilder.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 里面

相关文章:

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

原本在windows下能争取的获取远程配置但是部署到linux上死活都没有内容,然后开始了远程调试,这里顺带讲解下获取配置文件如果使用的是Git源,config service是如何响应接口并返回配置信息的。先说问题,我的服务名原本是abc-abc-abc…...

写代码,为什么还需要作图?

引言 古人云 :一图胜千言,闲人说:无图无真相。 在日常的聊天工具当中,无论是使用微信,还是钉钉。使用图片或表情包的频次越来越高,那是为什么呢?其实在互联网没有那么发达的时候,我…...

一句话介绍什么是AI智能体?

什么是AI智能体? 一句话说就是利用各种AI的功能的api组合,完成你想要的结果。 例如你希望完成一个关于主题为啤酒主题的小红书文案图片,那么它就可以完成 前面几个步骤类似automa的组件,最后生成一个结果。...

32.哀家要长脑子了!

1.299. 猜数字游戏 - 力扣(LeetCode) 公牛还是挺好数的,奶牛。。。妈呀,一朝打回解放前 抓本质抓本质,有多少位非公牛数可以通过重新排列转换公牛数字,意思就是,当这个数不是公牛数字时&#x…...

Vue2 - 项目上线后生产环境中去除console.log的输出以及断点的解决方案

前言 当你准备将Vue.js应用程序部署到生产环境时,一个关键的优化步骤是移除代码中的所有 console.log 语句以及断点。在开发阶段,console.log 是一个非常有用的调试工具,但在生产环境中保留它们可能会影响性能和安全性。在本文中,我将向你展示如何通过使用Vue CLI 2来自动…...

phpword生成PDF

接上一篇phpword生成word文档,如有不明白的问题可以先查看上一篇文章 首先,生成PDF需要先生成word文档,而后通过word文档生成HTML文档,最后才可以通过HTML文档生成PDF文件,详细代码如下。 执行命令安装phpword&#…...

Linux进程优先级

1. 基本概念 cpu 资源分配的先后顺序,就是指进程的优先权( priority )。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用,可以改善系统性能。还可以把进程运行到指定的CPU 上,这样一来&a…...

每日一题——Python实现PAT乙级1096 大美数(举一反三+思想解读+逐步优化)3千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度分析 空间复杂度分析 总结 哲学和编程思想 1. 抽象与具体化 …...

无锁编程——从CPU缓存一致性讲到内存模型(1)

一.前言 1.什么是有锁编程,什么是无锁编程? 在编程中,特别是在并发编程的上下文中,“无锁”和“有锁”是描述线程同步和资源访问控制的两种不同策略。有锁(Locked): 有锁编程是指使用锁(例如互…...

C++编程(七)继承

文章目录 一、继承(一)概念(二)语法格式(三)通过子类访问父类中的成员1. 类内2. 类外 (四)继承中的特殊成员函数1. 构造函数2. 析构函数3. 拷贝构造函数4. 拷贝赋值函数 二、多重继承…...

【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering

【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering 一、前言Abstract1 INTRODUCTION2 RELATED WORK2.1 Traditional Scene Reconstruction and Rendering2.2 Neural Rendering and Radiance Fields2.3 Point-Based Rendering and Radiance Fields 3 O…...

【TB作品】atmega16 计算器,ATMEGA16单片机,Proteus仿真

实验报告:基于ATmega16单片机的简易计算器设计 1. 实验背景 计算器是日常生活和工作中不可或缺的工具,通过按键输入即可实现基本的四则运算。通过本实验,我们将利用ATmega16单片机、矩阵键盘和LCD1602显示屏,设计并实现一个简易…...

C++的IO流操作

文章目录 C语言的输入与输出流是什么CIO流C标准IO流C文件IO流二进制读写文本读写 stringstream的简单介绍 C语言的输入与输出 C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放…...

MacOS升级指定Python版本的pip

场景: 系统默认是Python2.7,已经通过brew install python3.11 python3.12安装了多个版本的Python 执行:pip --version pip 24.1 from /Users/mac10.12/Library/Python/3.11/lib/python/site-packages/pip (python 3.11) 用的是Python3.11…...

音频Balance源码总结

音频Balance源码总结 何为音频Balance? 顾名思义,Balance及平衡,平衡也就是涉及多方,音频左右甚至四通道,调节所有通道的音量比,使用户在空间内听到各个通道的音频大小不一,好似置身于真实环境…...

CesiumJS【Basic】- #043 绘制脉冲线(Entity方式)- 需要自定义着色器

文章目录 绘制脉冲线(Entity方式)- 需要自定义着色器1 目标2 代码2.1 main.ts3 资源文件绘制脉冲线(Entity方式)- 需要自定义着色器 1 目标 使用Entity方式绘制脉冲线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer(cesiumCont…...

Linux命令 wc(word count)-l(lines)用于统计文件中的行数。

文章目录 1、wc -l2、实战3、wc --help 1、wc -l 在命令 wc -l 中,-l 的英文全称是 lines。这个选项用于指定 wc(word count,单词计数)命令来统计文件的行数。 例如,当你运行 wc -l load_user_100w_sort.sql 时&…...

数据结构 - C/C++ - 链表

目录 结构特性 内存布局 结构样式 结构拓展 单链表 结构定义 节点关联 插入节点 删除节点 常见操作 双链表 环链表 结构容器 结构设计 结构特性 线性结构的存储方式 顺序存储 - 数组 链式存储 - 链表 线性结构的链式存储是通过任意的存储单元来存储线性…...

sheng的学习笔记-AI-高斯混合模型(GMM)

AI目录:sheng的学习笔记-AI目录-CSDN博客 需要学习前置知识: 聚类,可参考 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 EM算法,可参考 sheng的学习笔记-AI-EM算法-CSDN博客 贝叶斯,可参考 sheng的学习笔记-AI-…...

OFDM的缺点与关键技术

子载波间干扰英文简写ICI,ICI可能由各种原因引起 在多径信道中,CP小于最大附加时延时收发系统载波频率偏差和采样偏差收发系统相对移动,存在多普勒频移 ICI是制约OFDM系统性能的主要重要因素之一 对频率偏差敏感----->同步技术&#xff0…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

基础测试工具使用经验

背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

如何在网页里填写 PDF 表格?

有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据&#xff…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...