单体服务

在每个服务的 src/main/resouces/ 目录下,包含两个工程配置文件 application.yml 和 application-dev.yml,以及一个日志配置文件 (log4j2.xml/logback-spring.xml),橙单会根据项目创建时所选的日志框架,而生成不同的日志配置文件。

  • application.yml。与运行时环境无关的配置项,推荐放到该配置文件中。见下图及文字注释。
  • application-dev.yml。与运行时环境相关的配置项,推荐放到包含环境后缀「-dev」的配置文件中。如数据库、Redis 和 Minio 等第三方服务的 IP、用户名和密码等信息,以确保不同环境可以使用不同的配置信息。
  • 从上图可以看出,spring.profiles.active 的配置值是 dev,因此 Spring Boot 服务启动时会自动读取 application-dev.yml 文件中的配置项。我们可以为不同环境,如 test、prod,指定不同的配置文件 (application-test.yml、application-prod.yml)。在服务启动时,可通过命令行参数的方式指定 spring.profiles.active 的配置值。
# 在服务启动参数中指定了 test 环境,因此 application.yml 和 application-test.yml 配置文件将生效。
java -jar xxxx.jar --spring.profiles.active=test

微服务

每个业务微服务均包含两个模块,分别为接口模块和实现模块,服务的所有业务实现和参数配置均位于实现模块内,如下图,course-paper 服务包含了course-paper-api 接口模块和 course-paper-service 实现模块。在每个实现模块的 src/main/resources/ 目录下,包含一个服务启动配置文件 bootstrap.yml,同时还会包含一个日志配置文件 (log4j2.xml/logback-spring.xml),橙单会根据项目创建时所选的日志框架,而生成不同的日志配置文件。

配置分组

在开始将本地配置文件导入到 Nacos 之前,我们刻意添加了该小节,因为经常会有开发者修改 Nacos 中 Group 的配置值,从而导致微服务启动时,因无法找到对应的配置项,而报出大量的异常栈错误信息。因此如果要想修改 Group 配置项,就必须同时修改以下两处,具体见下图。

共享配置

  • 进入工程的 zz-resource/config-data/ 目录,并打开 application-dev.yaml 文件,见下图。
  • 入 Nacos 管理控制台,localhost:8848/nacos,密码用户名均为 nacos。在「配置列表」菜单下,点击右侧的「加号」,创建新配置项,见下图。
  • 将 application-dev.yaml 文件中的配置全部粘贴到 Nacos 中,下图红框标注的地方必须完全匹配,特别是扩展名一定是 yaml。之后点击「发布」按钮即可。

微服务配置

  • 在 Nacos 中为每个微服务创建的缺省配置项,其「Data ID」的命名规则为 ${spring.application.name}-${spring.profiles.active}.yaml。如 upms-dev.yaml,见下图。
  • 进入工程的 zz-resource/config-data/ 目录,并打开 upms-dev.yaml 文件,见下图。
  • 在 Nacos 控制台创建新配置项,并将 upms-dev.yaml 文件中的配置全部粘贴到 Nacos 中,下图红框标注的地方必须完全匹配,之后点击「发布」按钮即可。

网关配置

  • 进入工程的 zz-resource/config-data/ 目录,并打开 gateway-dev.yaml 文件,见下图。
  • 在 Nacos 控制台创建新配置项,并将 gateway-dev.yaml 文件中的配置全部粘贴到 Nacos 中,下图红框标注的地方必须完全匹配,之后点击「发布」按钮即可。

uaa-auth配置

  • 仅当在生成器中配置的工程支持单点登录时,生成后的项目中才会存在 uaa/uaa-auth 目录。进入工程的 zz-resource/config-data/ 目录,并打开 uaa-auth-dev.yaml 文件,见下图。
  • 在 Nacos 控制台创建新配置项,并将 uaa-auth-dev.yaml 文件中的配置全部粘贴到 Nacos 中,下图红框标注的地方必须完全匹配,之后点击「发布」按钮即可。

部门同步服务配置

  • 仅当配置业务数据库链接支持「数据权限部门数据同步」时,生成后的工程中才会存在 application-consumer/upms-dept-sync 服务。生成器中的配置方式,见下图。
  • 进入工程的 zz-resource/config-data 目录,并打开 upms-dept-sync-dev.yaml 文件,见下图。

  • 在 Nacos 控制台创建新配置项,并将 upms-dept-sync-dev.yaml 文件中的配置全部粘贴到 Nacos 中,下图红框标注的地方必须完全匹配,之后点击「发布」按钮即可。

日志消费服务配置

  • 仅当配置工程支持「支持操作日志收集」时,生成后的工程中才会存在 application-consumer/operation-log-consumer 服务。生成器中的配置方式,见下图。
  • 进入工程的 zz-resource/config-data 目录,并打开 operation-log-consumer-dev.yaml 文件,见下图。
  • 在 Nacos 控制台创建新配置项,并将 operation-log-consumer-dev.yaml 文件中的配置全部粘贴到 Nacos 中,下图红框标注的地方必须完全匹配,之后点击「发布」按钮即可。

服务配置动态刷新

仅需在配置对象上加 @RefreshScope 注解即可。见如下代码,

@Data
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = "application")
public class ApplicationConfig {

   // 上传文件的基础目录
   private String uploadFileBaseDir;

   // 每个微服务的url目录上下文,如(/admin/upms),通常和网关的路由目录一致。
   private String serviceContextPath;
   // 下面忽略若干配置 ... ...
}

服务共享配置动态刷新

对于服务间共享配置,需要在上一条的基础上,打开每个服务的 resources/bootstrap.yml 文件,将 spring.cloud.nacos.config.shared-configs.refresh 属性设置为 true,见下图。

Sentinel 持久化

目前仅适用于微服务工程。Sentinel 作为限流、降级熔断服务组件,自身是不支持持久化的,可通过 Nacos 等配置服务实现持久化的目标。

  • 添加依赖项。我们在生成工程的 pom.xml 中已经添加。
<dependency>
   <groupId>com.alibaba.csp</groupId>
   <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
  • 在微服务的 bootstrap.yml 中添加配置。我们已经为每个服务生成了该配置。这里以 upms 服务为例,打开该服务资源目录下的 resource/bootstrap.yml 服务启动配置文件。在下面代码中,ds1 是我们的缺省命名方式,如果需要更多数据源配置,可继续增加,如 ds2、ds3 等。
  • 在 Nacos 创建新配置。新配置的 data-id、group-id 必须和上图保持一致,既 upms-dev-sentinel 和 DEFAULT_GROUP,配置格式为 JSON,见下图。
  • 启动微服务后,进入 Sentinel Dashboard 控制台页面,localhost:8858,用户名密码为 sentinel/sentinel。如果控制台左边栏的服务列表为空,请执行一次登录操作,因为 Sentinel 是基于懒加载的。通过下图可以看到,我们在 Nacos 中为 upms 服务配置的持久化数据,已经显示在 Sentinel 控制台了。

多租户

在阅读该小节之前,请先仔细阅读上面的「微服务」小节,因为多租户工程是建立在微服务工程基础之上的,上面已经介绍了微服务的相关配置,这里只是给出与多租户相关的系统配置。

租户管理服务配置

  • 进入工程的 zz-resource/config-data 目录,并打开 tenant-admin-dev.yaml 文件,见下图。
  • 在 Nacos 控制台创建新配置项,并将 tenant-admin-dev.yaml 文件中的配置全部粘贴到 Nacos 中,下图红框标注的地方必须完全匹配,之后点击「发布」按钮即可。

租户同步服务配置

  • 进入工程的 zz-resource/config-data 目录,并打开 tenant-sync-dev.yaml 文件,见下图。
  • 在 Nacos 控制台创建新配置项,并将 tenant-sync-dev.yaml 文件中的配置全部粘贴到 Nacos 中,下图红框标注的地方必须完全匹配,之后点击「发布」按钮即可。

网关白名单

本小节介绍的配置仅属于「微服务网关」,目前可支持两种配置模式。

  • 完全匹配模式。该模式性能更好,如果 URL 是确定的,应优先使用该配置。
  • Ant Path 匹配模式。支持通配符,因此更加灵活,但是效率则低于「完全匹配模式」。

日志配置

单体服务的日志配置,基本上就是微服务日志配置的子集,这里仅以 upms 服务为例,介绍微服务的日志配置。如下图所示,打开 resources/log4j2.xml 日志配置文件,

  • LOG_PATTERN,日志输出格式。注意右侧红框圈住的注释部分。如果在服务启动时,拉起了 PinPoint 或 SkyWalking 的 agent,此时可根据 APM 的类型选择不同的 LOG_PATTERN,以便收集 APM 的 traceid,并将其打印到控制台或存入 ELK 中。
  • LOG_APPENDER,日志添加器。请留意下图红框圈住的两个部分。上面的红框标记出 Kafka Appender 的配置,这样我们可以将服务日志写入到 Kafka 的 zz-log-topic 主题中,之后再由 ELK 消费、储存和显示。下面的红框标记了一段注释,提示当前的日志框架集成了 Disruptor 全异步队列,因此在日志采集过程中,不仅效率更高,而且也不会给业务线程带来阻塞。
  • 记录 SQL 输出。请留意下图红框标注的地方,AsyncLogger 标签的 name 属性指向了当前工程中 dao 所在的 package 全名,这样当有 SQL 调用时,便会将 SQL 输出到控制台和日志系统,这对于错误调试非常方便。如果使用了 Mybatis Log Plugin 插件,则必须添加该配置。

结语

赠人玫瑰,手有余香,感谢您的支持和关注。选择橙单,效率乘三,收入翻番。