前面我们介绍了Nacos作为配置中心组件实现,是如何配置和接入的。对于Nacos来说,他是集注册中心及配置中心为一体的。基于它的强大能力,我们在这里来统一分享几个Nacos在生产环境的配置技巧。
一、热加载配置
Nacos 本身是支持配置热加载的,可以在运行过程中允许直接对新的配置项进行重新加载而不需要手动重启。首先咱们了解下热加载背后的处理机制。
Nacos 采用的是 Pull 拉取模式,但并不是简单的 Pull,而是一种长轮询机制。客户端采用长轮询的方式定时发起 Pull 请求,去检查服务端配置信息是否发生了变更,如果发生了变更,则客户端会根据变更的数据获得最新的配置。所谓的长轮询,是客户端发起轮询请求之后,服务端如果有配置发生变更,就直接返回。
如果客户端发起 Pull 请求后,发现服务端的配置和客户端的配置是保持一致的,那么服务端会先“冻结”住这个请求,也就是服务端拿到这个连接之后在指定的时间段内一直不返回结果,直到这段时间内配置发生变化,服务端会把原来“冻结”住的请求进行返回,如图所示:
Nacos 服务端收到请求之后,先检查配置是否发生了变更,如果没有,则设置一个定时任务,延期 29.5s 执行,并且把当前的客户端长轮询连接加入 allSubs 队列。这时候有两种方式触发该连接结果的返回:
-
第一种是在等待 29.5s 后触发自动检查机制,这时候不管配置有没有发生变化,都会把结果返回客户端。而 29.5s 就是这个长连接保持的时间。
-
第二种是在 29.5s 内任意一个时刻,通过 Nacos Dashboard 或者 API 的方式对配置进行了修改,这会触发一个事件机制,监听到该事件的任务会遍历 allSubs 队列,找到发生变更的配置项对应的 ClientLongPolling 任务,将变更的数据通过该任务中的连接进行返回,就完成了一次“推送”操作。
这样既能够保证客户端实时感知配置的变化,也降低了服务端的压力。其中,这个长连接的会话超时时间默认为 30s。
二、切换环境配置文件
这里比如我们新开发的微服务准备上线,便可利用Nacos提供的环境配置快速完成从开发环境到生产环境的切换。
下面我们来实际演示一下:
- 1、在 Nacos 中设置生产环境的配置,Data Id 为 order-service-prd.yml,其中 prd 是 production 的缩写,代表生产环境配置。
这份配置最大的变化是 Nacos 通信地址与自定义配置均指向生产环境 IP,同时 flag 也变为production 代表生产环境。
- 2、调整 order-service 的 bootstrap.yml 引导文件,最重要的地方是修改环境名为 prd,同时更换为生产环境 Nacos 的通信地址,打包后发布。
spring:
application:
name: order-service #微服务id
profiles:
active: prd #环境名
cloud:
nacos:
config: #这里配置的是Nacos配置中心
file-extension: yml #指定文件扩展名
server-addr: 192.168.31.10:8848
username: nacos
password: nacos
- 3、测试访问 访问测试接口,运行结果如下,这里看到 flag:production 说明已切换到生产环境。
//http://localhsot:8000/test
flag:development
database:10.181.36.22
三、管理基础配置数据
对比 order-service-dev.yml 与 order-service-prd.yml 发现,在不同环境的配置文件中普遍存在固定的配置项,例如:=order-service 配置项就是稳定的,且修改它会影响所有环境配置文件。对于这种基础的全局配置,我们可以将其存放到单独的 order-service.yml 配置中,在 order-service 服务启动时,这个不带环境名的配置文件必然会被加载。
其中,order-service.yml 包含了应用名称,是其他环境配置都需要包含的内容。
spring:
application:
name: order-service
order-service-dev.yml 只包含与开发环境的相关配置。
server:
port: 8000
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.31.10:8848
username: nacos
password: nacos
custom: #自定义配置项
flag: development
database: 192.168.10.33
order-service-prd.yml 只包含与生产环境的相关配置。
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 10.181.36.10:8848
username: nacos
password: nacos
custom: #自定义配置项
flag: production
database: 10.181.36.22
到这里,我们针对Nacos的配置技巧就介绍完毕了。