Choerodon猪齿鱼平台使用微服务架构进行开发,部署在Kubernetes 扩展中,并且服务新功能开发完成后会被依次部署到暂存环境测试,UAT 环境验收和生产环境使用。在这多个多个环境的部署过程中,猪齿鱼平台只需要一次CI生成的包,便能实现服务部署的“因地制宜”。
需求
猪齿鱼平台集成的GitLab用于进行CI的过程,在微服务程序中经过Gitlab CI的docker_build和chart_build步骤之后,对应一次成功的CI过程,会有一个可以进行部署的Helm的发行包。
一般情况下,不同环境下基础设施如数据库的地址是不同。而部署服务的需求是一次打包生成的安装包可以在不同的环境进行部署而不需要对源代码重新打包。
spring:
datasource:
url: "jdbc:mysql://localhost/demo_service?useUnicode=true&characterEncoding=utf-8&useSSL=false" # 本地数据库
username: demo
password: demo
方案基础
猪齿鱼微服务后端环境变量方案的本质上是Springboot的环境变量机制和头盔环境变量机制的结合。
所以在此之前,先聊一聊SpringBoot 和头盔所提供的支持。
SpringBoot环境变量支持
SpringBoot支持外部化配置,允许使用者通过属性文件,YAML文件,环境变量及命令行参数对服务进行外部化配置。同时允许 @Value和@ConfigurationProperties注解的方式对上述变量进行访问。
@Value方式:
@Value("${JAVA_HOME}")
private String javaHome;
@Value("${spring.application.name}")
private String appName;
@ConfigurationProperties 方式:
@Component
@ConfigurationProperties(prefix = "services.gitlab")
public class GitlabConfigurationProperties {
private String password;
private Integer projectLimit;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getProjectLimit() {
return projectLimit;
}
public void setProjectLimit(Integer projectLimit) {
this.projectLimit = projectLimit;
}
}
在SpringBoot官方文档中,SpringBoot提供了多于十种配置环境变量的方式,并列出他们所配置的环境变量的优先级。从文档中可以看到,对于应用程序而言,系统环境变量的优先级高于应用内的配置文件所配置的值。
Helm环境变量支持
在猪齿鱼微服务中,项目根目录下会有一个 chart 目录用于定义此服务如何打包成 Helm Chart 包,这个