首先,我们需要在 coupon-customer-impl 项目的 resource 文件夹中创建 bootstrap.yml 配置文件。
接下来,你需要在 bootstrap.yml 文件中添加一些 Nacos Config 配置项,我把一些常用的配置项写到了这里,你可以参考一下。
spring:
# 必须把name属性从application.yml迁移过来,否则无法动态刷新
application:
name: coupon-customer-serv
cloud:
nacos:
config:
# nacos config服务器的地址
server-addr: localhost:8848
file-extension: yml
# prefix: 文件名前缀,默认是spring.application.name
# 如果没有指定命令空间,则默认命令空间为PUBLIC
namespace: dev
# 如果没有配置Group,则默认值为DEFAULT_GROUP
group: DEFAULT_GROUP
# 从Nacos读取配置项的超时时间
timeout: 5000
# 长轮询超时时间
config-long-poll-timeout: 10000
# 轮询的重试时间
config-retry-time: 2000
# 长轮询最大重试次数
max-retry: 3
# 开启监听和自动刷新
refresh-enabled: true //默认true
# Nacos的扩展配置项,数字越大优先级越高
extension-configs: //读取多份配置
- dataId: redis-config.yml
group: EXT_GROUP
# 动态刷新
refresh: true
- dataId: rabbitmq-config.yml
group: EXT_GROUP
refresh: true
文件定位配置项:主要用于匹配 Nacos 服务器上的配置文件。
- namespace:Nacos Config 的 namespace 和 Nacos 服务发现阶段配置的 namespace 是同一个概念和用法。我们可以使用 namespace 做多租户(multi-tenant)隔离方案,或者隔离不同环境。我指定了 namespace=dev,应用程序只会去获取 dev 这个命名空间下的配置文件;
- group:概念和用法与 Nacos 服务发现中的 group 相同,如未指定则默认值为 DEFAULT_GROUP,应用程序只会加载相同 group 下的配置文件;
- prefix:需要加载的文件名前缀,默认为当前应用的名称,即 spring.application.name,一般不需要特殊配置;
- file-extension:需要加载的文件扩展名,默认为 properties,我改成了 yml。你还可以选择 xml、json、html 等格式。
超时和重试配置项:
- timeout:从 Nacos 读取配置项的超时时间,单位是 ms,默认值 3000 毫秒;
- config-retry-time:获取配置项失败的重试时间;
- config-long-poll-timeout:长轮询超时时间,单位为 ms;
- max-retry:最大重试次数。
在这里,我想多跟你介绍一下超时和重试配置里提到的长轮询机制的工作原理。
当 Client 向 Nacos Config 服务端发起一个配置查询请求时,服务端并不会立即返回查询结果,而是会将这个请求 hold 一段时间。
如果在这段时间内有配置项数据的变更,那么服务端会触发变更事件,客户端将会监听到该事件,并获取相关配置变更;
如果这段时间内没有发生数据变更,那么在这段“hold 时间”结束后,服务端将释放请求。采用长轮询机制可以降低多次请求带来的网络开销,并降低更新配置项的延迟。
通用配置:
- server-addr:Nacos Config 服务器地址;
- refresh-enabled: 是否开启监听远程配置项变更的事件,默认为 true。
扩展配置:
- extension-configs:如果你想要从多个配置文件中获取配置项,那么你可以使用 extension-configs 配置多源读取策略。
- extension-configs 是一个 List 的结构,每个节点都有 dataId、group 和 refresh 三个属性,分别代表了读取的文件名、所属分组、是否支持动态刷新。
在实际的应用中,我们经常需要将一个公共配置项分配给多个微服务使用,比如多个服务共享同一份 Redis、RabbitMQ 中间件连接信息。
这时我们就可以在 Nacos Config 中添加一个配置文件,并通过 extension-configs 配置项将这个文件作为扩展配置源加到各个微服务中。
这样一来,我们就不需要在每个微服务中单独管理通用配置了。