天天看点

搞不懂大型网站架构技术细节:后端架构规整化集中配置就不睡觉了

作者:程序员高级码农II

集中配置

一个后端应用程序,一般只需要一个配置文件就足够了。但是,在一个大型网站的项目里,一般有生产环境、测试环境和开发环境,而在这些环境当中,具体配置(如数据库连接、文件目录等)都不尽相同,因此使用配置文件无疑会让后端应用程序的部署更加灵活。

说明:如果项目中使用了自动发布工具(如Jenkins),也可以通过自动修改配置文件以达到适配多个环境的效果。

但是,在默认情况下,配置文件是在后端应用程序(.war文件)里的,要将后端应用程序发布到不同环境的话需要修改配置文件,而这种修改可能会出现不必要的人为错误。因此,配置文件和后端应用程序应该分离。配置文件记录具体环境的相关信息,保存在对应环境当中,后端应用程序可以不加修改地发布到不同环境,如图4.52所示。

说明:生产环境、测试环境和开发环境,指的都是完整的网站系统。生产环境指的是线上环境,正式运营的版本;测试环境指的是给内部测试人员使用的环境;开发环境指的是给开发人员使用的环境。除了这三个基本环境,根据具体项目的规模,还可能有回归环境、预发布环境等。

搞不懂大型网站架构技术细节:后端架构规整化集中配置就不睡觉了

图4.52 配置文件与后端应用程序分离

要实现配置文件与后端应用程序分离,需要解决两个问题:

·设置配置文件所在目录;

·设置配置文件名,每个后端应用程序引用专属的配置文件。

1.设置配置文件所在目录

默认情况下,配置文件是在后端应用程序(.war文件)里的。如果需要引用外部配置文件目录,则需要在Web应用服务器软件中设置。以Tomcat为例,需要在Tomcat目录下的/conf/catalina.properties文件中(推荐在文件末尾)添加如代码4.22所示的设置,其中,spring.config.location是设置配置文件目录的字段,${catalina.home}会自动获取Tomcat的根目录,${catalina.home}/appconfig/指的是Tomcat根目录下的appconfig文件夹(如图4.53所示)。

代码4.22 设置外部配置文件目录

spring.config.location=${catalina.home}/appconfig/

说明:配置文件的目录也可以是其他路径,如/home/backendconfig等。后端应用程序会优先引用设置目录中的配置文件,而.war文件中的配置文件将不再生效。如果设置目录中没有配置文件,.war文件中的配置文件会生效。

搞不懂大型网站架构技术细节:后端架构规整化集中配置就不睡觉了

图4.53 ${catalina.home}/appconfig/对应的目录

设置配置文件目录的本质,不是对Tomcat(Web应用服务器软件)本身的设置,而是设置了Java程序的启动参数。如果后端应用程序被打包成.jar文件的话,带有配置文件目录设置的启动命令如代码4.23所示,其中,-D后面的设置等同于代码4.22的设置。

代码4.23 带有配置文件目录设置的.jar文件启动命令

java -jar xxx.jar -D spring.config.location=/home/backendconfig

另外,在Spring Boot工程中,如果配置文件不生效,或者要想挪动工程内的配置文件目录的话,可以在build.gradle中添加如代码4.24所示的设置,其中,/config为自定义的配置文件目录。其对应的配置文件目录如图4.54所示。

注意:build.gradle中对配置文件目录的设置只对所在工程生效,不能替代Tomcat(Web应用服务器软件)的配置。

代码4.24 build.gradle中对配置文件目录的设置

//设置配置文件目录

sourceSets {

main {

resources {

srcDir = '/config'

}

}

}

搞不懂大型网站架构技术细节:后端架构规整化集中配置就不睡觉了

图4.54 挪动Spring Boot工程中配置文件的位置

2.设置配置文件名

默认情况下,采用Spring Boot框架的后端应用程序的配置文件名为application,后端应用程序会自动寻找application.properties文件并加载其配置。因此,在设置了外部配置文件目录后,在一个Tomcat(Web应用服务器软件)下的多个后端应用程序会使用同一个配置文件(application.properties)。但是,多个后端应用程序使用同一个配置文件是不合理的,每个后端应用程序都应该引用自己专属的配置文件。因此,需要设置配置文件名,让每个后端应用程序引用其专属的配置文件。

配置文件名的设置需要在代码(xxApplication.java和ServletInitializer.java)中实现,修改后的xxApplication.java文件如代码4.25所示,修改后的ServletInitializer.java文件如代码4.26所示,其中,spring.config.name是设置配置文件名的字段,xxx是想要设置的文件名。如xxx设置为demo时,后端应用程序会自动引入demo.properties文件,如图4.55所示。

代码4.25 修改后的xxApplication.java文件

@SpringBootApplication

public class xxApplication {

public static void main(String[] args) {

//新增代码,设置配置文件名

new SpringApplicationBuilder(xxApplication.class)

.properties("spring.config.name=xxx")

.run(args);

//初始工程的代码,需要去除

//SpringApplication.run(xxApplication.class, args);

}

}

代码4.26 修改后的ServletInitializer.java文件

public class ServletInitializer extends SpringBootServletInitializer {

@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilderapplication) {

//新增代码,设置配置文件名

return application

.properties("spring.config.name=xxx")

.sources(xxApplication.class);

//初始工程的代码,需要去除

//return application.sources(xxApplication.class);

}

}

搞不懂大型网站架构技术细节:后端架构规整化集中配置就不睡觉了

图4.55 引用自定义配置文件的工程目录

设置配置文件名的本质,其实是设置了Java程序的启动参数。但是这个设置不能放在Tomcat(Web应用服务器软件)中,因为Tomcat中不能针对不同的后端应用程序设置不同的值。因此,只能在后端应用程序的启动代码中加入启动参数(设置配置文件名)。

3.集中配置

通过设置“配置文件所在目录”和“配置文件名”,可以实现“后端应用程序与配置文件分离”。配置文件在不同的环境中记录对应的环境信息,而后端应用程序可以不加修改地在不同环境中运行,从而实现配置文件集中管理的目的,如图4.56所示。

搞不懂大型网站架构技术细节:后端架构规整化集中配置就不睡觉了

图4.56 配置文件集中管理

本文给大家讲解的内容是大型网站架构的技术细节:后端架构规整化集中配置

  1. 下篇文章给大家讲解的内容是大型网站架构的技术细节:后端架构规整化Cookie和Session
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持

继续阅读