Spring Cloud多环境切换

在Spring Cloud项目中,一般存在三个不同的环境,分别为开发环境、测试环境、生产环境。其中开发环境是开发者通过Idea来启动各个模块,测试环境位于阿里云的测试主机中,生产环境就是正式服务客户的环境。那么我们需要做到的是,在开发环境中,通过Idea启动程序时自动使用开发环境的配置,包括比如服务地址、端口等信息,测试和生产环境也类似,这样在不同环境中运行程序都切换自如,不需要任何手动修改配置文件。

为了简化,这里我们只讨论两种环境切换的做法,即开发环境和生产环境的切换,三种环境也是一样的原理,只是增加一套配置文件而已。我们以admin-service模块的配置为例来说明。

admin-service模块的配置文件如下图,可以看到resources目录下包含三个配置文件,分别为bootstrap.yml,bootstrap-dev.yml和bootstrap-pro.yml。

当程序启动时,首先会去获取bootstrap.yml文件的配置内容,该文件的内容如下:

spring:
  application:
    name: admin-service
profiles:
    active: dev

其中profiles.active的值为:dev,这就导致程序获取配置文件bootstrap.yml的配置内容后,再去找bootstrap-dev.yml文件并读取配置,后者配置内容如下:

spring:
  application:
    name: admin-service
  cloud:
    config:
      uri: http://localhost:8881
      fail-fast: true
  profiles:
    active: dev

这个配置文件里面,cloud.config.uri的值为:http://localhost:8881,就又会导致程序试图从这个URI获取配置文件,这个配置文件存放在配置服务中,即一个使用了Spring Cloud Config的服务,这个服务进行配置文件的集中管理,暴露uri供其他服务获取各自的配置文件。同样,你看到这里profiles.active的值为:dev,而且spring.application.name为:admin-service,,admin-service在集中配置管理服务中的配置文件名就为:admin-service-dev.yml,如下图所示:

内容诸如:

server:
  port: 8883
management:
  security:
    enabled: false

小结一下,开发环境中通过Idea启动程序时,配置文件获取的流程是:

bootstrap.yml —> bootstrap-dev.yml —> admin-service-dev.yml,

最后一个配置文件位于配置服务模块中,前两个文件位于本模块的resources目录下。

而当要打包成生产环境镜像时,配置文件的获取流程应该如下:

bootstrap.yml —> bootstrap-pro.yml —> admin-service-pro.yml,

要打包成Docker镜像,执行以下命令:

mvn clean package dockerfile:build -Dspring.profiles.active=pro

spring.profiles.active=pro传递给mvn命令,则在打包成生产环境的Docker镜像时,使用的就是pro后缀的配置文件了。

我们还要注意一点,mvn命令是maven的编译命令,指定pro只是告诉maven去相应的配置文件获取某些值,而运行时,我们还需要在Dockerfile写如下的EntryPoint,服务运行起来时才会去使用pro配置。如下:

 ENTRYPOINT [“/usr/bin/java”, “-Dspring.profiles.active=pro”, “-jar”, “admin-service.jar”]

欢迎微信扫码,进入【技术人成长】社群逛逛。

发表评论

电子邮件地址不会被公开。