Nacos作为Spring Cloud Alibaba的核心组件,既做注册中心,又做配置中心,用的人很多,但很多人对它的底层原理,可能只是一知半解。
之前写过一篇Spring Cloud Alibaba的整体原理剖析,今天这篇,就专门深入剖析一下Nacos配置中心的底层机制,从配置的发布、存储、推送,到长轮询、一致性、灰度发布,一步步带你深入理解Nacos配置中心的工作原理。文章会涉及一些源码和底层机制,但会尽量用通俗的语言来讲,希望能帮大家更好地理解和使用Nacos。
一、Nacos配置中心是什么,解决什么问题
在深入原理之前,先简单说说Nacos配置中心是什么,解决什么问题。
在微服务架构中,每个服务都有自己的配置,比如数据库连接、缓存配置、日志级别、功能开关等。如果这些配置,都写在代码里或者配置文件里,每次修改配置,都要改代码、重新打包、重新部署,非常麻烦,尤其是服务多了之后,管理起来更麻烦。
配置中心,就是用来统一管理所有服务的配置的,把配置从代码里抽出来,统一存放在配置中心,服务启动的时候,从配置中心拉取配置,运行的时候,配置变更了,配置中心会主动推送给服务,服务不需要重启,就能使用新的配置。
Nacos配置中心,就是阿里开源的一个配置中心,它的功能很全面,支持配置的发布、修改、删除、版本管理、灰度发布、监听推送等,而且性能很好,能支持大规模的配置管理,是目前国内很流行的配置中心之一。
Nacos配置中心的核心功能,主要有这几个:
- 配置的发布和管理:支持通过控制台、API、SDK发布和管理配置,支持dataId、group、namespace来组织和隔离配置。
- 配置的拉取和监听:客户端可以从Nacos拉取配置,也可以监听配置的变化,配置变更时,自动收到通知。
- 配置的版本管理:每次配置变更,都会记录历史版本,可以查看历史,也可以回滚到历史版本。
- 灰度发布:支持配置的灰度发布,先把配置推送给部分客户端,验证没问题了,再全量发布,降低风险。
- 权限管理:支持细粒度的权限控制,不同的用户,对不同的配置,有不同的操作权限。
二、Nacos配置中心的整体架构
了解了Nacos配置中心的功能之后,我们来看看它的整体架构。
Nacos配置中心的架构,主要分为三个部分:
1. Nacos Server(服务端)
Nacos Server是配置中心的服务端,负责配置的存储、管理、推送,是整个配置中心的核心。Nacos Server可以单机部署,也可以集群部署,生产环境一般是集群部署,保证高可用。
Nacos Server内部,又分为几个模块:
- 配置管理模块:负责配置的增删改查、版本管理、灰度发布等。
- 一致性协议模块:负责集群中各个节点之间的数据一致性,保证配置在各个节点上都是一致的。
- 长轮询模块:负责和客户端保持长轮询连接,配置变更时,及时通知客户端。
- 存储模块:负责配置的持久化存储,Nacos支持内嵌的Derby数据库,也支持MySQL等外部数据库。
2. Nacos Client(客户端)
Nacos Client是配置中心的客户端,集成在各个微服务里,负责从Nacos Server拉取配置,监听配置的变化,配置变更时,自动更新本地的配置。
Nacos Client提供了多种语言的SDK,Java、Go、Python、Node.js等都有,Java的SDK,还和Spring Cloud、Dubbo等框架做了深度集成,用起来很方便。
3. 控制台(Console)
Nacos提供了一个Web控制台,用户可以通过控制台,来管理配置,发布、修改、删除配置,查看历史版本,做灰度发布,管理权限等,非常方便。
整体的工作流程是这样的:
- 用户通过控制台或者API,把配置发布到Nacos Server。
- Nacos Server把配置存储起来,并且同步到集群的各个节点,保证一致性。
- 服务启动的时候,Nacos Client从Nacos Server拉取配置,缓存到本地。
- Nacos Client和Nacos Server保持长轮询连接,监听配置的变化。
- 当配置变更时,Nacos Server通过长轮询,通知Nacos Client配置变更了。
- Nacos Client收到通知后,重新从Nacos Server拉取最新的配置,更新本地缓存,并且通知应用配置变更了。
这个流程,看起来简单,但里面有很多细节,下面我们一个个来剖析。
三、配置的发布和存储
先说说配置的发布和存储,这是配置中心的基础。
配置的组织方式:
Nacos的配置,是通过dataId、group、namespace三个维度来组织的:
- namespace(命名空间):用于环境隔离,比如开发环境、测试环境、生产环境,可以用不同的namespace,互相隔离。
- group(分组):用于把配置分组,比如同一个应用的配置,可以放在同一个group里,方便管理。
- dataId(配置ID):具体的某个配置的ID,一般是应用名+配置类型,比如
user-service-dev.yml。
通过这三个维度,可以很灵活地组织和隔离配置,满足不同场景的需求。
配置的发布:
发布配置的时候,可以通过控制台、API、SDK来发布,发布的时候,需要指定dataId、group、namespace,以及配置的内容和格式(比如yaml、properties、json等)。
发布配置的时候,Nacos Server会做这几件事:
- 参数校验:校验dataId、group、配置内容等参数是否合法。
- 权限校验:校验当前用户,是否有发布这个配置的权限。
- 存储配置:把配置内容存储到数据库里,同时记录配置的版本号、发布人、发布时间等信息。
- 生成历史版本:每次配置变更,都会生成一个新的历史版本,保存变更前的配置,方便回滚。
- 通知变更:配置变更后,通知长轮询模块,有配置变更了,需要通知监听这个配置的客户端。
配置的存储:
Nacos的配置,默认是存储在内嵌的Derby数据库里的,Derby是一个Java的嵌入式数据库,不需要单独安装,Nacos启动的时候,会自动创建,适合单机部署和测试环境使用。
生产环境,一般会用MySQL作为外部数据库,Nacos支持MySQL 5.6及以上版本,配置起来也很简单,只需要在Nacos的配置文件里,配置MySQL的连接信息,然后导入Nacos提供的数据库脚本,就可以了。
用MySQL的好处是,数据更可靠,性能更好,也方便备份和管理,生产环境建议用MySQL。
除了持久化存储,Nacos还会把配置缓存到内存里,这样,客户端拉取配置的时候,直接从内存里读,不需要查数据库,性能更高。配置变更的时候,会同时更新内存缓存和数据库,保证一致性。
四、配置的拉取和长轮询机制
配置发布之后,客户端怎么获取配置,配置变更了,客户端怎么知道呢?这就涉及到Nacos的配置拉取和长轮询机制,这也是Nacos配置中心的核心。
配置的拉取:
客户端启动的时候,会调用Nacos的API,从Nacos Server拉取配置,拉取的时候,需要指定dataId、group、namespace,Nacos Server收到请求后,从内存缓存里读取对应的配置,返回给客户端。
客户端拉取到配置后,会把配置缓存到本地内存里,也可以缓存到本地文件里,这样,即使Nacos Server挂了,客户端也能从本地缓存里读取配置,保证服务正常运行。
长轮询机制:
配置拉取一次之后,如果配置变更了,客户端怎么知道呢?Nacos用的是长轮询(Long Polling)机制。
什么是长轮询呢?简单来说,就是客户端发起一个请求到Nacos Server,问"我监听的配置有没有变更",Nacos Server收到请求后,如果配置没有变更,就不会立即返回,而是把这个请求hold住,挂起,等到有配置变更了,或者超时了(默认30秒),再返回给客户端。
客户端收到返回后,如果是配置变更了,就重新拉取最新的配置,更新本地缓存;如果是超时了,说明配置没有变更,就立即再发起一个新的长轮询请求,继续监听。
这样,就实现了配置变更的实时通知,配置变更后,客户端很快就能收到通知,一般在几秒内,就能拿到最新的配置。
为什么用长轮询,而不是WebSocket或者推送呢?主要是因为长轮询的兼容性更好,基于HTTP,不需要额外的协议支持,也更容易穿透防火墙和代理,部署起来更简单。而且,配置变更的频率,一般不会太高,长轮询的性能,完全能满足需求。
长轮询的实现细节:
Nacos的长轮询,实现得很巧妙,主要有这几个关键点:
- 客户端批量监听:客户端可以一次监听多个配置,把要监听的dataId和group,都放在一个请求里,这样,一个长轮询请求,就能监听多个配置,减少请求数量。
- 服务端挂起请求:Nacos Server收到长轮询请求后,如果配置没有变更,就把请求挂起,用一个定时任务,检查是否超时,或者是否有配置变更。
- 配置变更时唤醒请求:当有配置变更时,Nacos Server会找到监听这个配置的挂起请求,把它唤醒,返回配置变更的信息给客户端。
- 超时处理:如果挂起的请求超时了(默认30秒),就返回给客户端,告诉客户端配置没有变更,客户端会立即发起新的长轮询请求。
这个机制,既保证了配置变更的实时性,又不会占用太多的资源,是一个很高效的实现。
五、集群一致性协议
Nacos Server一般是集群部署的,那配置在各个节点之间,怎么保证一致性呢?这就涉及到Nacos的一致性协议。
Nacos的一致性协议,分为两种,一种是用于服务发现的临时实例的一致性,用的是Distro协议,是最终一致性的;另一种是用于配置和持久化实例的一致性,用的是Raft协议,是强一致性的。
配置中心用的,就是Raft协议,保证配置在各个节点之间的强一致性,也就是说,配置变更后,只要有一个节点收到,就会同步到其他节点,各个节点上的配置,都是一致的,不会出现不一致的情况。
Raft协议简介:
Raft协议是一种分布式一致性协议,用来保证集群中各个节点的数据一致性,它比Paxos协议更容易理解,也更容易实现,现在很多分布式系统,都用Raft协议。
Raft协议的核心,是选举一个Leader节点,所有的写请求,都由Leader节点处理,Leader节点把数据同步给Follower节点,只要超过半数的节点确认收到,就认为写入成功,然后返回给客户端。
如果Leader节点挂了,Follower节点会发起选举,选出新的Leader节点,继续提供服务,保证集群的高可用。
Nacos中Raft的应用:
在Nacos配置中心里,配置的发布、修改、删除等写操作,都会通过Raft协议,同步到集群的各个节点,保证配置的一致性。
具体的流程是这样的:
- 客户端的配置变更请求,发到Nacos集群的某个节点。
- 如果这个节点不是Leader,就把请求转发给Leader节点。
- Leader节点处理请求,把配置写入本地,然后把变更同步给其他Follower节点。
- 只要超过半数的节点,确认收到了变更,Leader就认为写入成功,返回给客户端。
- 其他还没收到变更的节点,会在后续的同步中,补全数据,最终达到一致。
这样,就保证了配置在集群各个节点之间的强一致性,客户端不管连到哪个节点,读到的配置都是一致的。
当然,Raft协议的细节,比这个复杂得多,比如选举、日志复制、安全性、成员变更等,这里就不展开了,有兴趣的朋友,可以去看Raft协议的论文,或者Nacos的源码。
六、灰度发布
Nacos配置中心,还有一个很重要的功能,就是灰度发布,这个功能,在生产环境中,非常实用。
什么是灰度发布呢?就是配置变更的时候,不是一下子推送给所有的客户端,而是先推送给一部分客户端,验证新配置有没有问题,如果没问题,再逐步推送给更多的客户端,最后全量发布。这样,即使新配置有问题,也只会影响一部分客户端,不会影响全部,降低了风险。
Nacos的灰度发布,主要有两种方式:
1. 按Beta发布
Beta发布,就是把配置先推送给指定的一些客户端,这些客户端,一般是测试机,或者特定的机器,验证没问题了,再全量发布。
Beta发布的原理,是在发布配置的时候,指定Beta的IP列表,只有这些IP的客户端,长轮询的时候,才会收到配置变更的通知,拉取新配置,其他客户端,还是用旧配置。等验证没问题了,再去掉Beta IP列表,全量发布,所有客户端,都能收到新配置。
这个方式,适合在发布前,先在几台机器上验证,确认没问题了,再全量发布,风险很小。
2. 按标签灰度
除了按IP的Beta发布,Nacos还支持按标签灰度,就是给客户端打标签,比如按机房、按版本、按应用名等,发布配置的时候,指定标签,只有符合标签的客户端,才能收到新配置。
这个方式,更灵活,可以按各种维度来灰度,比如先在一个机房发布,验证没问题了,再发布到其他机房;或者先在某个版本的应用上发布,验证没问题了,再全量发布。
灰度发布,是生产环境中非常重要的功能,尤其是配置变更,可能会影响服务的正常运行,有了灰度发布,就能大大降低配置变更的风险,保证服务的稳定。
七、Nacos配置中心的性能优化
Nacos配置中心,虽然性能已经很好了,但在大规模使用的时候,还是需要做一些性能优化,才能支撑更大的规模。
1. 客户端缓存
客户端拉取到配置后,会缓存到本地内存和文件里,这样,后续读取配置,就直接从本地缓存读,不需要每次都请求Nacos Server,大大减少了Nacos Server的压力。而且,即使Nacos Server挂了,客户端也能从本地缓存读取配置,保证服务正常运行。
2. 长轮询批量监听
客户端一次长轮询请求,可以监听多个配置,这样,就不需要每个配置,都发一个长轮询请求,大大减少了请求数量,降低了Nacos Server的压力。
3. 服务端内存缓存
Nacos Server会把配置缓存到内存里,客户端拉取配置的时候,直接从内存里读,不需要查数据库,性能很高。配置变更的时候,会同时更新内存缓存和数据库,保证一致性。
4. 集群部署和负载均衡
生产环境,Nacos Server一般是集群部署,前面挂负载均衡,客户端的请求,会分散到各个节点,提高整体的处理能力,也保证了高可用。
5. 合理设置长轮询超时时间
长轮询的超时时间,默认是30秒,可以根据实际情况调整。超时时间太短,客户端会频繁发起请求,增加Nacos Server的压力;超时时间太长,配置变更的通知,可能会有延迟。一般用默认的30秒,就可以了。
6. 数据库优化
如果用MySQL作为存储,要对MySQL做优化,比如合理设置索引,优化SQL,保证数据库的性能,因为配置的持久化,最终还是要落到数据库里,数据库的性能,会影响Nacos的整体性能。
八、常见问题和注意事项
最后,说说Nacos配置中心使用中,常见的问题和注意事项,帮助大家少踩坑。
1. 配置变更不生效
如果配置变更了,但客户端没有生效,先检查这几点:
- 客户端的dataId、group、namespace,是不是和发布的配置一致,有没有写错。
- 客户端有没有正确配置Nacos Server的地址,能不能连上Nacos Server。
- 长轮询是不是正常,有没有被防火墙或者代理拦截。
- 客户端的配置类,有没有加@RefreshScope注解,Spring Cloud里,配置变更后,需要加@RefreshScope,才能自动刷新。
2. Nacos Server挂了怎么办
Nacos Server挂了,客户端还是能从本地缓存里读取配置,服务能正常运行,只是配置变更,暂时不能通知客户端了。等Nacos Server恢复后,长轮询会重新连接,配置变更也会继续通知。所以,生产环境,建议Nacos Server集群部署,保证高可用,避免单点故障。
3. 配置的权限管理
生产环境的配置,很重要,一定要做好权限管理,不同的用户,给不同的权限,避免无关人员,随便修改配置,导致服务出问题。Nacos支持细粒度的权限控制,可以按namespace、group、dataId来设置权限,建议生产环境,一定要开启权限管理。
4. 配置的备份和回滚
Nacos会自动保存配置的历史版本,可以回滚到历史版本,但还是建议定期备份配置,尤其是重要的配置,避免误操作或者数据丢失,导致不可挽回的损失。
5. 不要在配置里存敏感信息
配置中心里,不要存敏感信息,比如密码、密钥、token等,这些信息,应该用专门的加密配置,或者密钥管理系统来管理,不要明文存在配置中心里,避免泄露。Nacos也支持配置加密,可以对敏感配置进行加密存储,建议开启。
九、写在最后
Nacos配置中心,是一个功能强大、性能优秀的配置中心,也是Spring Cloud Alibaba生态的核心组件之一,深入理解它的底层原理,能帮助我们更好地使用它,也能在出问题的时候,快速定位和解决。
这篇文章,从整体架构,到配置的发布、存储、拉取、长轮询、一致性、灰度发布,剖析了Nacos配置中心的底层机制,希望能帮大家更好地理解Nacos。
当然,Nacos的原理,比这篇文章讲的要复杂得多,很多细节,这里没有展开,有兴趣的朋友,可以去看Nacos的源码,或者官方文档,深入学习。
最后,希望这篇文章,能给用Nacos的朋友一些参考,也欢迎大家在评论区,分享自己使用Nacos的经验和问题,一起交流讨论。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录