2026/10/21 2:26:30

Nacos 有哪些核心能力?SpringCloud 实战讲解

Nacos 有哪些核心能力?SpringCloud 实战讲解 目录前言一Nacos快速上手1引入依赖2配置Nacos服务地址服务要注册到哪里3远程调用4需要为RestTemplet实例添加LoadBalance注解补充RestTemplet实例添加LoadBalance注解之后整个调用流程是怎样的1LoadBalance做了什么二Nacos负载均衡1服务下线2配置权重​编辑3配置多集群并在配置中声明服务要注册到哪个集群4Nacos同集群优先访问机制三Nacos健康检查四Nacos配置中心 动态刷新1引入依赖2为什么bootstrap.yml加载时机更早3编写代码五Nacos与其他服务注册服务发现中间件对比六我问你答环节1Nacos 可以同时做注册中心和配置中心吗2临时实例和持久实例区别补充什么是CAP理论补充DistroAP RaftCP两种协议3Nacos 的 Namespace、Group、DataId 的作用4Nacos AP/CP 怎么选择配置中心是 AP 还是 CP5Nacos2.x 相比 1.x 做了什么优化6RefreshScope 原理7Nacos 集群为什么推荐奇数个节点8Nacos 配置中心配置变更推送流程9Nacos2.x 相比 1.x 做了什么优化前言在微服务架构下有两个核心问题需要解决1服务实例众多的情况下IP地址不固定每个微服务模块之间如何相互感知—— 服务注册与发现。2大量的配置分布在各个微服务配置文件中修改配置需要在原服务上面进行修改无法动态变更 —— 分布式配置中心。而Nacos可以实现一个组件同时搞定注册中心 配置中心。Nacos也因此成为国内微服务项目常用的中间件。一Nacos快速上手1引入依赖!-- Nacos 服务注册发现 -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency !-- Nacos 配置中心 -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency !-- 负载均衡 -- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-loadbalancer/artifactId /dependency2配置Nacos服务地址服务要注册到哪里3远程调用Service public class OrderService { Autowired private OrderMapper orderMapper; Autowired private RestTemplate restTemplate; //订单信息调用商品服务 public OrderInfo selectOrderById(Integer orderId){ OrderInfo orderInfo orderMapper.selectOrderById(orderId); String url http://product-service/product/ orderInfo.getProductId(); //配置服务地址 ProductInfo productInfo restTemplate.getForObject(url, ProductInfo.class); orderInfo.setProductInfo(productInfo); return orderInfo; } }4需要为RestTemplet实例添加LoadBalance注解Bean LoadBalanced //加上LoadBalanced注解之后RestTemplet发送的请求会先被拦截然后去服务器拉取对应名称的实例 public RestTemplate restTemplate(){ return new RestTemplate(); }补充RestTemplet实例添加LoadBalance注解之后整个调用流程是怎样的1LoadBalance做了什么LoadBalance为标记注解SpringCloud会拿到所有被这个注解标记的RestTemplet Bean并给这些Bean加上拦截器LoadBalanceInterceptor 负载均衡拦截器不加注解的RestTemplet Bean会直接解析域名上面的这种写法也就无法被识别进而报错关键点负载均衡发生在调用方而不是Nacos服务器属于客户单负载均衡。Nacos只负责保存实例清单不做转发不做负载分发。二Nacos负载均衡Nacos支持多种负载均衡策略可配置服务权重同机房同地域同环境等等同时操作也很便捷。1服务下线2配置权重由于SpringCloud有自己的负载均衡策略所以想要权重策略生效需要开启Nacos的权重配置配置如下3配置多集群并在配置中声明服务要注册到哪个集群配置文件中配置具体要把服务放到哪个集群即可nacos: discovery: server-addr: 47.95.43.199:8848 cluster-name: BJ #放到哪个集群4Nacos同集群优先访问机制当服务方分布在多个集群当调用方与服务方位于同一个集群时调用方优先访问同集群服务方同集群没有服务实例再访问其他集群。过程如下不再演示三Nacos健康检查Nacos作为注册中心需要感知服务的健康状态从而可以为调用方提供良好的服务Nacos提供了两种健康检查机制客户端主动上报: 客户端通过心跳上报方式告知服务端自身健康状态默认心跳间隔为5s。Nacos会在超过15s未收到心跳后将实例设置为不健康状态超过30s将实例删除。服务端反向探测nacos主动探测客户端的健康状态默认间隔为20s健康检查失败后实例会被标记为不健康不会被立刻删除。spring: cloud: nacos: discovery: ephemeral: true # true临时实例默认false持久实例临时实例 ephemeraltrue依靠心跳保活。服务宕机心跳停止Nacos 自动删除实例。 心跳规则客户端5s 发一次心跳Nacos 15s 没收到心跳标记不健康30s 没收到直接剔除实例。持久实例 ephemeralfalse实例不会自动删除需要手动下线。适合定时任务、数据库服务这类强一致性服务。四Nacos配置中心 动态刷新Nacos配置中心通过对一些配置项进行统一管理在配置中心可以集中查看修改和删除配置无需再单独修改配置文件提高效率也降低了出错的风险1引入依赖dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency !-- SpringCloud 2020.*之后版本需要引⼊bootstrap-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-bootstrap/artifactId /dependency需要在bootstrap配置文件中配置读取Nacos中哪个DataId以及nacos服务地址如下spring: application: name: product-service profiles: active: profile.name cloud: nacos: config: server-addr: http//127.0.0.1:8848/nacos程序启动后会先去Nacos读取对应DataId的配置然后再和项目本地配置文件进行整合。2为什么bootstrap.yml加载时机更早Spring Cloud 2020.0 之后bootstrap 引导机制默认关闭需要引入bootstrap依赖3编写代码Value注解用来把配置源中的配置注入到该成员变量RefreshScope用来实习配置热更新nacos中配置更新会即时同步五Nacos与其他服务注册服务发现中间件对比六我问你答环节1Nacos 可以同时做注册中心和配置中心吗可以。注册中心负责微服务实例管理配置中心统一管理分布式配置。2临时实例和持久实例区别临时实例 ephemeraltrueAP Distro心跳保活宕机自动删除。持久实例 ephemeralfalseCP Raft实例不会自动删除适合强一致性场景。补充什么是CAP理论CAP 是分布式系统里的基础定理分布式系统无法同时满足 C一致性、A可用性、P分区容错性三者最多只能同时满足两个。在分布式系统中网络分区是分布式系统一定会发生的现象无法避免所以在分布式系统中分区容错性一定要保证只能在C和A之间二选一AP放弃强一致性保留可用性 分区容错系统发生网络分区依然可以正常对外提供读写服务允许数据短暂不一致最终同步完成CP放弃可用性保留强一致性 分区容错网络分区发生时为了保证数据一致性集群直接拒绝写入牺牲可用性。补充DistroAP RaftCP两种协议3Nacos 的 Namespace、Group、DataId 的作用Namespace环境隔离 dev/test/prodGroup同一环境下业务分组DataId配置唯一标识。Namespace Group DataId 三元组定位一条配置4Nacos AP/CP 怎么选择配置中心是 AP 还是 CP服务发现临时实例 AP持久实例 CP。配置中心底层 Raft永远 CP。5Nacos2.x 相比 1.x 做了什么优化底层通信改为 gRPC 长连接提升性能新增 gRPC 端口。6RefreshScope 原理Spring Cloud 提供当配置变更会重新创建 Bean实现配置动态刷新。底层 RefreshEventListener 监听配置变更事件。7Nacos 集群为什么推荐奇数个节点Nacos 集群配置中心和持久实例底层是 Raft 协议Raft 要求选举、写操作需要过半节点确认。3 节点最多挂 1 台4 节点也最多只能挂 1 台偶数节点不会增加容错能力还浪费服务器资源。而且偶数节点网络分区时更容易分裂成数量相等的两个子集群增加脑裂风险所以推荐奇数节点。脑裂旧leader被网络隔开但还没感知到网络断开仍然认为自己是leader另一边分区已经选出了新的leader短暂出现两个leader。当旧leader收到了新人leader消息会立刻降级为follower双主状态快速消失。偶数奇数节点都有概率发生。8Nacos 配置中心配置变更推送流程用户修改配置Nacos 记录变更客户端和 Nacos 维持长连接Nacos 主动推送变更事件客户端收到事件拉取最新配置刷新本地 Bean。9Nacos2.x 相比 1.x 做了什么优化通信1.x HTTP 短连接2.x gRPC 长连接减少连接创建开销性能提升巨大。端口2.x 新增 9848、9849 gRPC 端口。推送配置变更、实例变更推送gRPC 长连接推送实时性更好。内存模型优化集群同步效率提升