Skip to content

服务配置介绍

应用程序一般通过配置文件、环境变量等管理配置信息。微服务架构对统一配置提出了更高的要求,很多配置信息需要在不启停服务的情况下实现动态修改。 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 机制, 更加简洁和容易理解。