Nacos 进阶篇---Nacos服务下线做了哪些事情 ?(八)

一、引言

   本章节是第一阶段最后一篇,那么我们今天要学习的源码内容是 “服务下线”.

   当Nacos客户端下线的时候,是要去通知服务端,告诉服务端 “ 我已经下线,不可用了 ”。并且在服务下线时,还要去通知其他客户端服务更新本地缓存列表,避免调用到已经下线的实例。

本章重点:

  • Nacos 客户端是怎么下线通知服务端的 ?
  • Nacos 服务端收到客户端的下线通知,做了什么操作 ?
  • 服务下线时,Nacos 服务端是怎么通知其他客户端更新本地缓存列表的 ?

二、目录  

目录

一、引言

二、目录  

三、客户端服务下线源码分析

四、服务端服务下线源码分析

五、变动事件发布源码分析

六、本章总结

七、第一阶段总结


三、客户端服务下线源码分析

主线任务:Nacos 客户端是怎么下线通知服务端的 ?

首先我们要先找到服务下线的代码入口在哪里 ?

当我们关闭Nacos客户端服务的时候,日志会打印出 [DEREGISTER-SERVICE] :销毁服务的意思,那我们直接根据这个 进行全局搜索,找到代码位置

可以看到这里发起调用 Nacos 服务端删除实例接口,那我们接着往上看,看看这个接口哪里调用了 ?

public void deregisterService(String serviceName, Instance instance) throws NacosException {

    NAMING_LOGGER
            .info("[DEREGISTER-SERVICE] {} deregistering service {} with instance: {}", namespaceId, serviceName,
                    instance);

    // 组装请求参数
    final Map<String, String> params = new HashMap<String, String>(8);
    params.put(CommonParams.NAMESPACE_ID, namespaceId);
    params.put(CommonParams.SERVICE_NAME, serviceName);
    params.put(CommonParams.CLUSTER_NAME, instance.getClusterName());
    params.put("ip", instance.getIp());
    params.put("port", String.valueOf(instance.getPort()));
    params.put("ephemeral", String.valueOf(instance.isEphemeral()));

    // 调用Nacos服务端删除接口方法,请求地址:/nacos/v1/ns/instance
    reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.DELETE);
}

调用链路:destroy() -> stop() -> deregister() -> namingService.deregisterInstance(serviceId, group, registration.getHost(),

registration.getPort(), nacosDiscoveryProperties.getClusterName()) -> deregisterInstance(serviceName, groupName, instance); ->

serverProxy.deregisterService(NamingUtils.getGroupedName(serviceName, groupName), instance) -> reqApi(UtilAndComs.nacosUrlInstance,

params, HttpMethod.DELETE);

<think>嗯,用户问的是关于Nacos RPC的面试题,我需要先理清楚Nacos和RPC的关系。Nacos作为阿里巴巴开源的配置中心和服务发现组件,通常和RPC框架比如Dubbo一起使用。但用户可能想知道Nacos自身是否涉及RPC机制,或者面试中常问的相关问题。 首先,我得回忆Nacos的基本功能,服务注册与发现、配置管理,这些是核心。然后考虑RPC部分,Nacos本身不处理RPC通信,但作为注册中心,它为RPC框架提供服务发现的能力。所以面试题可能围绕Nacos如何集成到RPC框架中,比如Dubbo如何利用Nacos进行服务发现。 接下来,常见的面试问题可能包括Nacos服务注册流程、心跳机制、健康检查,以及与Eureka的区别。同时,Nacos的CP和AP模式切换,一致性协议如Raft,这些也是重点。需要解释Nacos在RPC中的作用,比如服务发现如何帮助RPC客户端找到可用的服务节点。 用户可能需要具体的例子,比如Nacos和Dubbo的整合配置,或者如何处理服务下线的情况。还有可能涉及高可用性、负载均衡策略,以及Nacos的配置中心如何动态更新服务配置,影响RPC调用。 还要注意区分Nacos本身不实现RPC,而是支撑RPC框架的服务治理部分。因此,面试题可能考察对微服务架构中各个组件职责的理解,比如Nacos负责服务注册发现,Dubbo负责RPC通信,两者如何协同工作。 另外,可能的问题包括Nacos的持久化机制,集群部署方式,如何保证数据一致性,以及如何处理网络分区的情况。这些都是Nacos作为注册中心在RPC场景下的关键点。 最后,需要总结常见的面试考点,比如Nacos的核心功能、与RPC框架的集成、高可用设计、一致性模型等,帮助用户系统化准备。可能还需要提到实际项目中遇到的问题和解决方案,展示深入理解。</think>以下是关于Nacos与RPC的常见面试考点及解析,建议结合项目经验理解原理: --- ### **1. Nacos核心功能** - **服务注册与发现**:微服务通过Nacos注册地址,RPC客户端通过Nacos动态获取可用服务节点 - **配置中心**:支持动态配置管理,可实时调整RPC超时时间、负载均衡策略等参数 - **健康检查**:主动探测服务状态,自动剔除异常节点(TCP/HTTP探测) --- ### **2. Nacos与RPC框架协作** **典型流程**: ```java // Dubbo + Nacos示例 @DubboReference(version = "1.0.0", check = false) private UserService userService; // RPC客户端通过Nacos发现服务地址 ``` 1. 服务提供者启动时向Nacos注册元数据 2. 消费者通过Nacos订阅服务列表 3. RPC框架(如Dubbo/gRPC)基于负载均衡策略选择目标节点 4. 长连接建立后直接进行网络通信 --- ### **3. 高频面试题** #### **(1) Nacos服务注册发现原理** - **注册流程**:服务实例发送心跳包(默认5秒)到Nacos Server - **数据存储**:临时实例用内存存储(AP模式),持久化实例用Raft协议(CP模式) - **服务发现**:客户端定时拉取服务列表,本地缓存+增量更新 #### **(2) Nacos与Eureka区别** | 特性 | Nacos | Eureka | |--------------------|--------------------------------|------------------------| | 一致性协议 | AP+CP可切换 | AP模型 | | 健康检查 | TCP/HTTP/MYSQL/客户端上报 | 客户端心跳 | | 配置中心 | 原生支持 | 需配合Spring Cloud Config | | 服务权重 | 支持 | 不支持 | #### **(3) 如何保证高可用?** - **集群部署**:至少3节点组成集群,使用内嵌Raft协议保证数据一致性 - **数据持久化**:配置MySQL存储持久化数据(默认使用内嵌Derby) - **故障转移**:客户端自动重连其他可用节点 #### **(4) Nacos如何处理服务雪崩?** - **保护阈值**:设置比例(如0-1),当健康实例比例低于阈值时,仍返回不健康节点 - **熔断机制**:结合Sentinel实现RPC调用的熔断降级 - **集群隔离**:不同业务使用不同Namespace/Group --- ### **4. 进阶问题** **Q:Nacos如何实现配置动态推送?** - 客户端长轮询(Long Polling)监听配置变更 - Server端使用UDP广播+HTTP对比MD5值的方式减少网络开销 **Q:如何设计一个服务注册中心?** - 参考Nacos架构: 1. 数据分区(临时/持久化) 2. 心跳续约机制 3. 多级缓存(内存注册表+本地文件快照) 4. 集群一致性协议(Raft/Distro) 5. 开放OpenAPI和SDK --- ### **5. 实践建议** - **故障场景模拟**:主动断开Nacos节点,观察服务发现是否正常 - **性能调优**:调整心跳间隔(`spring.cloud.nacos.discovery.heartbeatInterval`) - **安全加固**:开启鉴权(`nacos.core.auth.enabled=true`) 建议结合源码分析核心类:`NacosNamingService`(注册发现)、`ConfigService`(配置管理)。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逸航不吃瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值