一:java项目如何覆盖jar包内的配置文件
操作:
之前 >> java -noverify -Xbootclasspath/p: JDK8
之后>> java -noverify -Xbootclasspath/a: JDK11
C:\Users\xx.jdks\corretto-11.0.22\bin\java -Xbootclasspath/a:/config/application.yml -jar xxx-runtime-0.0.1-SNAPSHOT.jar
原理:JVM启动参数
-Xbootclasspath/a:path
将指定路径的所有文件追加到默认bootstrap路径中;
类加载原理:
public class Launcher {
static class AppClassLoader extends URLClassLoader {}
static class ExtClassLoader extends URLClassLoader {}
private static class BootClassPathHolder {}
}
二:springboot加载配置文件的顺序
顺序:
主要有以下几个地方,优先级由高到低:
1.当前jar包同级文件夹config中;2.jar包同级的配置文件;3.jar包内部的配置文件;
源码分析:
三:nacos配置解析
issue:第二个server-addr配置不生效。
nacos:
config:
server-addr: localhost:31492
data-id: xx.local.properties
bootstrap.enable: false
auto-refresh: false
discovery:
server-addr: localhost:31492
auto-register: true
四:k8s configMap 通过文件创建和挂载到容器
configMap介绍
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时, Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap 将你的环境配置信息和 容器镜像 解耦,便于应用配置的修改。
利用yaml文件来创建
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
data.1: hello #以键值对的方式进行存储
data.2: world #以键值对的方式进行存储
redis.properties6666: | #以文件的形式进行存储,可以在下方直接写配置文件的内容
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
通过文件挂载使用configMap
redis.properties6666 是映射到 容器的文件名字 /etc/config/redis.properties6666
/etc/config/下还有两个文件,data.1和data.2
| 竖线文本保留格式
apiVersion: v1
kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/redis.properties;sleep 1d" ]
volumeMounts: #卷挂载
- name: config-volume #挂载卷的名称
mountPath: /etc/config #挂载到容器中的位置
volumes: #创建卷
- name: config-volume #创建的卷名称
configMap: #从configMap中挂载
name: redis-config #挂载configMap中redis-config
restartPolicy: Never
优化项:如何实现配置热更新?
五:configmap热更新
实现ConfigMap热更新的三种常用方法:使用sidecar、CI脚本和自定义Controller
https://blog.csdn.net/kingu_crimson/article/details/129933905