[apolloconfig/apollo]提供对Spring Boot 2.4新特性spring.config.import的官方支持

2024-07-05 430 views
9

Spring Boot 2.4启用了全新的配置加载特性:spring.config.import

spring.config.import: apollo:/fat/appidxxxxxxx

此属性上的值可以被外部扩展(ConfigDataLocationResolver/ConfigDataLoader)解释,并在早期(EnvironmentPrepared前)完成执行,返回的PropertySources会并入Environment中。

Spring Boot 2.4 也发布了近一年时间,希望官方可以提供官方的适配器。

回答

2

@JasonMing 能简单描述下使用该特性带来的好处或者比较适合的场景?

3

主要是springboot对外部配置数据源的提供了官方支持。

  • 这个场景下,可以通过一个类似connection-string的方式在application.yml里面配置,而非独立的app.properties,这个对用户接入更友好
  • 其次,原来apollo的数据源是在spring-boot之外的,要做联动的话需要二次封装,但是如果使用新的机制,那么这个数据源就是在spring-boot之内的,在不需要运行时更新的场景下,会让接入更简单更友好。
4

这个我理解为 apollo 适配了之后,对于简单的场景可以简化接入的配置和步骤吧?

这里的要做联动的话需要二次封装具体是指?

6

是的,而且在配置选择上(比如cluster、env)还可以基于spring的profile或其它机制。 这一点和logback配置类似,如果单纯是logback.xml,无法在spring上下文中获取任何消息,这个是独立的;但是如果使用logback-spring.xml(spring的logging system)则可使用spring的上下文变量。

这一点就是我上面说的例子。

比如一个场景,现在我要通过当前环境中的某些变量来识别出env的值,要实现这种动态功能,我就必须在程序启动前设置好properties

public static void main(String[] args)
{
    System.setProperty("env", dyanmicDetectEnv());
    SpringApplication.run();
}

如果是接入新的 spring.config.import 可能我就在 application-xxx.yml 里面import一下就好了:

spring.config.import: apollo://${appid}@fat/ns1,ns2
2

你设想的这个格式是没有办法解析的,spring.config.import 处理的时候会使用逗号进行分割 apollo://${appid}@fat/ns1,ns2 会被分割成 apollo://${appid}@fat/ns1ns2 这样两截。 ns2这一截是无法被处理的 另外关于env,目前 apollo 提供的方式我想应该已经能够覆盖大部分使用场景了,打成 jar 包的情况下可以使用系统参数 java -Denv=fat -jar xxx.jar 这样指定,docker 镜像则可以使用 --env ENV=fat 这样来指定,我感觉这两个方式应该要比写死在 yml 配置里面更好吧。

2

逗号分隔的问题可以用其它方式解决,这种问题不会太大,只是提供一个这样的形式。 至于通过命令行参数的形式,还是通过代码识别,这一块我觉得是按照使用者的场景的。 docker/k8s环境和机房多起来的时候命令行或者环境变量指定在配置上也是很麻烦的,有些情况还需要通过代码的形式进行映射(比如运维系统提供的env可能叫 develop,这一块需要映射到 dev)会来得更加方便,如果可以接入spring-boot的import上就相当于给动态映射代码一个执行的可能。 当然,当前也是能做到,就是麻烦点,要自己创建Apollo的client,远不如我这样配置下来得轻松。

7

虽然不建议,不过 apollo meta server 的地址也是可以通过 application.properties 配置的,详见1.2.2 Apollo Meta Server

9

是的,最近在 #3754 中刚支持的