服务配置介绍
应用程序一般通过配置文件、环境变量等管理配置信息。微服务架构对统一配置提出了更高的要求,很多配置信息需要在不启停服务的情况下实现动态修改。 Java Chassis 支持丰富的配置源,对不同的配置源进行了抽象, 开发者可以不关心配置项具体的配置源,采用统一的接口读取配置。
配置源层级
Java 提供了分层次的配置机制。按照优先级从高到低,分为:
- 配置中心(动态配置)
- Java System Property(-D参数)
- 环境变量
- 配置文件
配置文件
- microservice.yaml
microservice.yaml 文件是优先级最低的配置文件。Java Chassis 启动时会从 classpath 的各个 jar 包、磁盘目录中加载 microservice.yaml 文件,并将这些文件合并为一份 microservice.yaml 配置。位于磁盘上的 microservice.yaml 文件优先级高于jar包中的microservice.yaml 文件。用户还可以通过在配置文件中指定 servicecomb-config-order
来指定优先级, 如果不同路径下的 microservice.yaml 包含一样的配置项,文件中 servicecomb-config-order
值大的配置项会覆盖值小的配置项。
Tips:由于磁盘上的microservice.yaml文件优先级较高,我们可以在打包时在服务可执行jar包的classpath里加上
.
目录,这样就可以在服务jar包所在的目录里放置一份microservice.yaml来覆盖jar包内的配置文件。
- Spring Boot 默认配置文件 application.yaml 等
Java Chassis 继承了 Spring Boot 的配置机制,可以使用Spring Boot 默认配置文件。 microservice.yaml 的优先级比 application.yaml 低。
环境变量
Linux的环境变量名不允许带.
符号,因此某些配置项无法直接配置在环境变量里。可以将配置项key的.
符号改为下划线_
,将转换后的配置项配在环境变量里,Java Chassis 可以自动将环境变量匹配到原配置项上。
例如:对于 microservice.yaml 中配置的
servicecomb:
rest:
address: 0.0.0.0:8080
可以在环境变量中设置 servicecomb_rest_address=0.0.0.0:9090
来将服务监听的端口覆写为9090。这种下划线转点号的机制也适用于其他的配置层级。
由于上述限制,最好的方式是在启动参数里面使用 Java System Property。 比如 -Dservicecomb.rest.address=${LISTEN_ADDRESS}
, 设置的环境变量 LISTEN_ADDRESS 符合操作系统的命名规范。
配置中心(动态配置)
配置中心是微服务架构下一个非常重要的中间件,通过配置中心用户可以增加和删除配置信息,配置信息会通过不同的通知机制, 将配置的变化推送到微服务实例。 Java Chassis 允许用户使用不同的配置中心, 并支持多个配置中心共存。
配置中心的优先级高于文件配置。
进行配置项映射
配置项映射可以用于给配置项取一个别名,在使用环境变量覆盖业务配置、兼容性场景广泛使用。 进行配置项映射通过 classpath 下的 mapping.yaml 定义:
PAAS_CSE_SC_ENDPOINT:
- servicecomb.registry.sc.address
假设 PAAS_CSE_SC_ENDPOINT
是环境变量,应用程序读取 servicecomb.service.registry.address
的地方, 会取到环境变量PAAS_CSE_SC_ENDPOINT
的值。
使用配置项映射也可以使用 Spring Boot 的 place holder 机制, 上述的解决方案可以替换为在 application.yaml 文件中使用:
servicecomb:
registry:
sc:
address: ${PAAS_CSE_SC_ENDPOINT:http://localhost:30100}
推荐使用 Spring Boot 的 place holder 机制, 更加简洁和容易理解。