Nacos 配置共享文件 如何在Nacos配置共享文件
这里以黑马程序员的黑马商城为例!!!
在每一个服务中,我们希望将一些常用的配置抽取出来,并在 Nacos 配置中心进行统一管理,同时支持动态更新,避免每次修改配置都需要重启服务。
1. 共享配置的整理与存储到 Nacos
1.1 识别可共享的配置
在多个微服务中,可能会用到相同的配置,比如:
- 数据库(JDBC)相关配置
- 日志配置
- Swagger & OpenFeign 配置
这些配置如果每个服务都单独维护,不仅重复,而且难以维护,因此可以抽取出来放到 Nacos 配置中心,供多个服务共享。
1.2 在 Nacos 配置中心存储共享配置
步骤:
- 进入 Nacos 控制台 → 配置管理 → 配置列表
- 新建配置,分别添加以下共享配置文件
每一个配置文件的分组统一设置为默认DEFAULT_GROUP
① JDBC 相关配置(shared-jdbc.yaml
)
spring:
datasource:
url: jdbc:mysql://192.168.48.128:3306/${hm.db.database}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: rootroot
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
global-config:
db-config:
update-strategy: not_null
id-type: auto
首先考虑到,每一个服务的数据库的数据库名不一样,其他的账号密码端口号等可能无变化,所以这里可以使用${hm.db.database}占位符来配置,然后我们在每一个服务的配置文件中写入数据库名字即可,一定要与nacos共享配置文件中的格式一致,hm.db.database
也可以使用更为灵活的配置
spring:
datasource:
url: jdbc:mysql://${hm.db.host:192.168.150.101}:${hm.db.port:3306}/${hm.db.database}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: ${hm.db.un:root}
password: ${hm.db.pw:123}
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
global-config:
db-config:
update-strategy: not_null
id-type: auto
以数据库ip为例,${hm.db.host:192.168.150.101}表示如果没有配置hm.db.host,则默认以192.168.150.101为ip地址,端口号、账号和密码同理!
🔹 关键点:
hm.db.host
、hm.db.port
等参数使用了 占位符,可以在不同环境下灵活覆盖默认值,提高配置的可变性。
② 统一日志配置(shared-log.yaml
)
logging:
level:
com.hmall: debug
pattern:
dateformat: HH:mm:ss:SSS
file:
path: "logs/${spring.application.name}"
🔹 关键点:
- 日志文件存放路径
logs/${spring.application.name}
采用 服务名称 作为日志文件夹的名称,方便分类管理。
③ Swagger & OpenFeign 配置(shared-swagger.yaml
)
knife4j:
enable: true
openapi:
title: ${hm.swagger.title:黑马商城接口文档}
description: ${hm.swagger.description:黑马商城接口文档}
email: ${hm.swagger.email:zhanghuyi@itcast.cn}
concat: ${hm.swagger.concat:虎哥}
url: https://www.itcast.cn
version: v1.0.0
group:
default:
group-name: default
api-rule: package
api-rule-resources:
- ${hm.swagger.package}
🔹 关键点:
- 占位符 方式支持不同服务自定义 Swagger 文档的
title
、email
、concat
等信息。
将共享文件配置完后,应该如何让每一个服务在启动时去nacos拉取这些信息呢?
2. 微服务如何拉取 Nacos 共享配置
2.1 需要先配置 bootstrap.yaml
⚠️ 注意:
Spring Cloud 在初始化上下文时,会优先加载 bootstrap.yaml
,然后再加载 application.yaml
。
所以 Nacos 连接信息 需要写在 bootstrap.yaml
里,否则无法加载共享配置。
📌 配置 bootstrap.yaml
spring:
application:
name: cart-service # 服务名称
profiles:
active: dev
cloud:
nacos:
server-addr: 192.168.48.128 # nacos地址
config:
file-extension: yaml # 文件后缀名
shared-configs: # 共享配置
- dataId: shared-jdbc.yaml # 共享mybatis配置
- dataId: shared-log.yaml # 共享日志配置
- dataId: shared-swagger.yaml # 共享日志配置
- dataId: shared-seata.yaml # 共享seata配置
🔹 关键点:
shared-configs
指定共享配置文件,这里的dataId就是刚才在nacos添加的文件名称,Nacos 会自动拉取这些配置并合并到application.yaml
。
2.2 修改 application.yaml
因为部分配置已经抽取到 bootstrap.yaml
,application.yaml
只需要保留当前服务的独有配置。
server:
port: 8082
feign:
okhttp:
enabled: true # 开启OKHttp连接池支持
sentinel:
enabled: true # 开启Feign的sentinel整合
hm:
db:
database: hm-cart
swagger:
title: 购物车服务接口文档
package: com.hmall.cart.controller
🎯 现在 cart-service
服务启动时,会自动从 Nacos 拉取共享配置!
2.3 引入对应的Bootstrap依赖
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 读取共享配置文件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
引入完毕后启动项目时会去nacos读取配置信息