sofastack / sofa-ark

SOFAArk is a light-weight,java based classloader isolation framework.
https://www.sofastack.tech/projects/sofa-boot/sofa-ark-readme/
Apache License 2.0
1.57k stars 500 forks source link

请问Ark Biz里面的配置文件如何处理? #838

Closed TeddyLav closed 9 months ago

TeddyLav commented 9 months ago

打包后的Ark Biz配置文件在jar包中,如果生产环境需要修改参数,只能在开发环境修改再打包,是否有把配置文件放到jar包外生效的方法? master和biz包都有application.properties配置文件,也没法放到conf/ark这个目录下吧?

lvjing2 commented 9 months ago

你是想不需要发布就可以更改配置文件并且生效吗? 一般如果多环境,是可以使用 springboot application.properties 的 profile 能力的

TeddyLav commented 9 months ago

比如打包发布了一个版本包,然后给多个项目用,但不同项目的参数不一样,希望用同一个包,只是不同项目jar包外面的配置文件不一样即可。

lvjing2 commented 9 months ago

你们现在是怎么配置的呢?

TeddyLav commented 9 months ago

目前的最终运行目录格式如下:

. ├── master-ark-biz.jar (配置文件直接打到jar里面) ├── provider-ark-biz.jar (配置文件直接打到jar里面)
└── conf --- └── ark ------ └── bootstrap.properties

我的目的是想master和provider的jar包中的配置文件可以放到外面,方便修改。

启动方式: 1、java -jar -Dsofa.ark.embed.enable=true master-ark-biz.jar 2、通过Telnet命令,部署provider包

lvjing2 commented 9 months ago

你们普通应用这些 application.properties 是怎么维护的呢?一般是建议都放在代码仓库里的。

普通应用

对于普通应用,放在 config/${app}/application.properties 这里,然后通过 maven 打包插件 maven-resources-plugin 把对应 app 的 application.properties 拷贝到运行时的 config 目录下,如:

        <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <encoding>UTF-8</encoding>
                            <outputDirectory>../../target</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>../../conf</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                    <execution>
                        <id>copy-configs</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <encoding>UTF-8</encoding>
                            <outputDirectory>../../target/config</outputDirectory>
                            <resources>
                                <resource>
            ---------> 这里        <directory>./src/main/resources/config/${app}</directory>
                                    <includes>
                                        <include>*.properties</include>
                                        <include>*.yaml</include>
                                        <include>*.yml</include>
                                    </includes>
                                </resource>
                                <resource>
                                    <directory>./src/main/resources/config</directory>
                                    <includes>
                                        <include>*.properties</include>
                                        <include>*.yaml</include>
                                        <include>*.yml</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

模块应用

当前模块还不具备,同一个代码仓库里像基座一样配置多应用的能力,这个我们可以支持下这个能力。 https://github.com/koupleless/koupleless/issues/38

TeddyLav commented 9 months ago

前模块还不具备,同一个代码仓库里像基座一样配置多应用的能力,这个我们可以支持下这个能力 ---你们普通应用这些 application.properties 是怎么维护的呢?一般是建议都放在代码仓库里的。 同一套程序可能给10个不同的项目使用,每个项目的参数key是一样的,但是value可能不一样,所以只想发一个版本(jar包),各个项目把jar包拿到现场后,根据实际情况修改外面文件夹里面的配置value即可。

lvjing2 commented 9 months ago

你看下我上面推荐的基座多应用配置方式,适合你们吗?在蚂蚁内部是这么玩的,比较方便管理

lvjing2 commented 9 months ago

基座的配置方式不管怎样,模块的application.properties 是不考虑放在 jar 包之外。模块支持同代码多应用配置能力后,也是放在 resources/config/${app}/application-dev.properties

TeddyLav commented 9 months ago

https://www.sofastack.tech/projects/sofa-boot/sofa-ark-readme/architecture.png 先看下语言是否一致,如上图所示: 基座=Master App Biz 模块=Dynamic Biz

然后我在conf文件夹加了基座的配置,运行程序没生效,好像根本不会读取 application.properties这个文件。 . ├── master-ark-biz.jar (配置文件直接打到jar里面) ├── provider-ark-biz.jar (配置文件直接打到jar里面) └── conf --- └── ark ------ └── bootstrap.properties --- └── master ------ └── application.properties

gaosaroma commented 9 months ago

conf/ark/bootstrap.properties 是 SOFAArk 容器的默认启动配置文件,不是单个模块的启动配置文件。 conf/master/*** 也不是基座的启动配置文件。

单个模块的启动配置文件需要放在模块自己的 resources/config/${app}/application*.properties 内。

我的目的是想master和provider的jar包中的配置文件可以放到外面,方便修改。

一般来说,配置文件是放在 jar 包中的。对于普通应用,为了让不同生产环境使用不同的 application.properties配置文件,应用的jar包中会有不同的 application.properties配置文件。在启动时会根据当前的环境,通过 jvm 参数指定当前使用的配置文件(该配置文件也在 jar 包内),所以 “jar包中的配置文件一般不会放在外面”。

同一套程序可能给10个不同的项目使用,每个项目的参数key是一样的,但是value可能不一样。

实现方式可以有很多中,但一个应用的 application.properties 不应该在 jar 包外。你可以考虑把10个项目的配置都放在同一个 jar 中,通过 jvm 参数指定当前使用的配置文件。或者你在项目中动态读取特定位置的文件,自行解析文件中的 key-value,配置在项目里

TeddyLav commented 9 months ago

OK。多谢!

lvjing2 commented 9 months ago

方便的化加下开发者协作群细聊吗?或者我个人微信 zzl_ing “Serverless 社区交流与协作群”群的钉钉群号: 24970018417