全部产品
云市场

工程配置解决方案

更新时间:2019-09-19 13:32:11

当您在不同工作空间下(如开发、测试、预发布、生产工作空间)提供不同的配置时,可能会需要多次打包代码。通过 profile 的配置,您可以在使用同一套配置和代码的情况下为不同的工作空间提供适合于该工作空间的相应配置,省去多次打包的麻烦。

SOFABoot 技术栈(2.0 架构)1.0.7 及以上版本还支持针对单个租户进行 profile 配置。有关技术栈版本的说明参见 技术栈版本说明

说明:必须把所有工作空间相关的配置放在应用代码中可部署模块的 resources 目录下。可部署模块指的是使用 spring-boot-maven-plugin 打包出 fat JAR 的模块。

全局配置解决方案

全局配置文件默认为 config/application.properties,用于全局通用(即不依赖工作空间)的公共配置项。要为多个工作空间提供不同的 profile,请在 config目录下创建多个 .properties 文件。

配置方法

  1. 配置 application.properties 文件。

    • SOFABoot 技术栈 1.0.6 及更早的版本:

      支持针对工作空间进行 profile 配置。建议将 config 目录下的配置文件命名为 config/application-{$workspace_name}.properties,其中 {$workspace_name} 变量为该文件对应的工作空间名称,如 dev、test、pre、prod 等。例如 application-dev.properties

    • SOFABoot 技术栈 1.0.7 及以上版本:

      支持针对工作空间及单个租户进行 profile 配置。建议将config目录下的配置文件命名为 application-${tenant_name}_${workspace_name}.properties,其中 ${tenant_name} 为租户名,${workspace_name} 为工作空间名。同时以前的 application-${workspace_name}.properties 命名风格依然支持。

      例如:租户名为 1234, 工作空间名为 dev,则配置文件命名推荐为:application-1234_dev.properties。 如果 application-1234_dev.propertiesapplication-dev.properties 两个文件同时存在,那么它们都会生效,且 application-1234_dev.properties 优先级别更高。

  2. 配置 /etc/metafile 文件。

    • SOFABoot 技术栈 1.0.6 及更早的版本:

      技术栈根据当前工作空间名,即 /etc/metafile 文件中的 workspace_name 值,指定启动参数 -Dspring.profiles.active=${workspace_name}。要使用某个工作空间的配置文件,请将中 workspace_name 配置项对应的值设置为该工作空间名称。例如,当workspace_name=dev 时,dev 工作空间的配置文件 application-dev.properties 生效。

    • SOFABoot 技术栈 1.0.7 及以上版本:

      技术栈根据当前工作空间名及租户名,即 /etc/metafile 文件中的 workspace_nametenant_name,指定启动参数 -Dspring.profiles.active=${workspace_name},${tenant_name}_${workspace_name}。例如,当workspace_name=devtenant_name=1234时,配置文件 application-1234_dev.properties 生效。

  3. 如果需要自定义激活多个 profile,请在全局通用配置文件 config/application.properties 中添加属性值 spring.profiles.include=${profile1},${profile2}。多个 profile 用英文逗号分隔。被添加的 profile 将和 -Dspring.profiles.active=${workspace_name} 参数指定的 profile 同时被加载。

生效方式

SOFABoot 技术栈在启动 SOFABoot 应用时会自动加上 JVM 的启动参数 -Dspring.profiles.active=,用以制定在启动后将会生效指定后缀的全局配置文件。此机制完全使用 Spring Boot 的 Profile 机制,详情请参考 Spring Boot Reference Guide > Profiles(英文)

日志配置解决方案

  • 配置路径:在 resources/logback-spring.xml 文件中定义日志的配置信息。
  • 文件命名:SOFABoot 使用 Spring Boot 扩展 profile 的支持来提供日志配置的解决方案,因此日志配置文件名为 logback-spring.xml,而不是 logback.xml。当然,需要提供依赖 spring-boot-starter-logging,此依赖默认使用 logback 进行日志打印。
  • 生效方式:在 logback-spring.xml 配置文件中增加 <springProfile> 标签来标识指定的 spring.profiles.active 参数生效时,这段 XML 配置文件将被解析,示例如下。 如果在 logback-spring.xml 文件中配置 <springProfile> 标签为 devtest,那么当激活参数 spring.profiles.active 中包含 devtest 时,这段配置将被激活。与此同时,可以在 appender-ref 中使用这个 DEV-TEST-APPENDER
  1. <springProfile name="dev,test">
  2. <appender name="DEV-TEST-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
  3. <append>true</append>
  4. <filter class="ch.qos.logback.classic.filter.LevelFilter">
  5. <level>${logging.level}</level>
  6. <onMatch>ACCEPT</onMatch>
  7. <onMismatch>DENY</onMismatch>
  8. </filter>
  9. <file>${logging.path}/sofaboot-client/app-default-dev.log</file>
  10. <!-- 每天生成一个日志文件,日志文件保存 30 -->
  11. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  12. <!--日志文件输出的文件名:按天回滚 -->
  13. <FileNamePattern>${logging.path}/sofaboot-client/app-default-dev.log.%d{yyyy-MM-dd}
  14. </FileNamePattern>
  15. <!--日志文件保留天数-->
  16. <MaxHistory>30</MaxHistory>
  17. </rollingPolicy>
  18. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  19. <!--格式化输出:%d 表示日期;%thread 表示线程名;%-5level 表示级别,从左显示 5 个字符宽度;%msg 表示日志消息;%n 表示换行符-->
  20. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  21. <!-- 编码 -->
  22. <charset>UTF-8</charset>
  23. </encoder>
  24. </appender>
  25. </springProfile>

关于 <springProfile> 标签的更多信息,可以参考 Spring Boot 官方文档

启动 Tengine

您可以使用 Tengine 来配置静态资源的访问和指定端口流量的转发。

  • 配置路径:Tengine 配置文件存放在需要被打包为 fat JAR (即可部署模块)中的 classpath 根目录下,即应用代码的 src/main/resources 目录下的 tenginx-conf 文件夹下。
  • 文件命名:文件需要命名为 tengine.conf
  • 生效方式:完整的配置文件路径为 tenginx-conf/tengine.conf。当使用 SOFABoot 技术栈在 SOFAStack 上自动发布部署时,技术栈会读取 tenginx-conf/tengine.conf 配置文件的内容来作为 Tengine 的配置去启动 Tengine。

支持 JVM 参数

当应用在不同的 ECS 上启动时,需要指定的堆(heap)大小可能也不同,因此 SOFABoot 可按照 ECS 内存大小来选择不同 JVM 参数。在部署的 fat JAR 包中的 classpath 根目录下,即应用代码的 src/main/resources 目录下,您可以配置以 “java_opts” 开头的文件,规则如下:

  1. 可以提供多个以 “java_opts” 开头的文件,以内存大小标识作为后缀,如 java_opts_2g,java_opts_4g 等,只支持整数。
  2. 如未找到正确的 java_opts_?g 文件,默认读取 java_opts 文件。
  3. 如未提供 java_opts 文件,相当于无任何 JVM 参数,则应用使用 JVM 默认参数。

支持 Shell 脚本 Hook 机制

一些应用在启动 Java 程序前,需要执行其他操作,例如:启动一个 Python 脚本,将一个 .so 文件添加到环境变量中。为满足这类需求,SOFABoot 技术栈支持在应用代码中添加 hook 脚本,在部署应用时,技术栈会调用这些脚本中的函数。规则如下:

  1. hook 脚本必须放置在需要部署的 fat JAR 包(即可部署模块)中的 classpath 根目录下,即应用代码的 src/main/resources 目录下,文件名为 hook.sh
  2. hook.sh 脚本中声明要被调用的函数,不同函数名对应不同的调用时机:
    • before_appstart_hook:应用启动前
    • after_appstart_hook:应用启动后
    • 其他名字的函数不会被调用
  3. hook.sh 脚本中,除了 shell 函数的声明以外,不要有其他执行逻辑,否则每次在调用 hook 函数时都会触发这些执行逻辑。
  4. 如果不需要该功能,可以不提供 hook 脚本。以下为 hook.sh 文件的示例代码:
  1. function before_appstart_hook {
  2. echo 'before_appstart_hook executed'
  3. }
  4. function after_appstart_hook {
  5. echo 'after_appstart_hook executed'
  6. }