Nacos服务注册与发现源码剖析

简介: 本文通过Nacos源码了解服务注册与发现原理。

前提介绍

服务注册与发现作用主要是为了更好的管理众多的服务,不论Nacos还是Zookeeper、Eureka,作为注册中心都是为了解决以下两个问题:

  1. 屏蔽、解耦服务之间相互依赖的细节。服务之间的远程调用必须要知道IP、端口信息,一旦这些信息改变,调用方都需要更新,依赖性太强。
  2. 微服务架构中,服务众多、服务之间的相互依赖错综复杂,无论是服务停止、上线,还是扩容,都需要尽快通知调用方。注册中心作用就是对微服务进行动态配置,解决这一问题。

Nacos作为注册中心其本质是作为服务端,提供接口进行客户端实例的注册存储实例信息,通过心跳机制保证实例的存活,实例通过服务端发现获取其他实例信息。

本文通过Nacos源码了解服务注册与发现原理。

Nacos源码下载

下载Nacos源码

将源码导入Idea中,工程结构如下
在这里插入图片描述
逻辑架构如下图
在这里插入图片描述

Nacos客户端源码

服务实例是如何注册到Nacos的?通过源码提供的示例NamingExample.java可以看到一个服务注册到Nacos只需几行代码

在这里插入图片描述

NamingService作为注册中心客户端的接口,包括注册实例、注销实例、获取实例等接口,也就是服务注册/发现的功能。通过createNamingService方法可以看到其实现为NacosNamingService

在这里插入图片描述

NacosNamingService.java中可以看到registerInstance的具体实现。通过代码追踪可以看到最终通过clientProxy去调用注册服务接口。

在这里插入图片描述

这个clientProxy是在NacosNamingService实例的时候进行了声明

在这里插入图片描述

NamingClientProxyDelegate.java中可以看到有grpc和http两种协议去和Nacos进行通信。

在这里插入图片描述

如果注册为临时实例使用grpc,永久实例使用http,在调用时会根据实例的属性选择。

在这里插入图片描述

所以最终向Nacos服务端注册服务、注销服务、获取实例列表等通过NamingGrpcClientProxy.javaNamingHttpClientProxy.java调用。整体的链路是比较简单清晰的。

在这里插入图片描述

Spring Cloud Starter Nacos 源码

通过上面的示例可以看到通过简单的几行代码就可以实现服务注册、发现等功能,但是我们在使用Nacos时通常基于Spring Cloud结合使用。一般在引入相关依赖,添加几个配置之后会发现服务自动注册到Nacos了,这是如何实现的?

在引入nacos注册发现依赖后可以看到该包下面的spring.factories文件,根据Spring Boot自动装配原理,首先会加载EnableAutoConfiguration对应的类,服务注册就找NacosServiceRegistryAutoConfiguration这个类。
在这里插入图片描述

NacosServiceRegistryAutoConfiguration类中的这些Bean会交给Spring管理,服务注册是通过NacosAutoServiceRegistration注入实现。

在这里插入图片描述

NacosAutoServiceRegistration 继承了AbstractAutoServiceRegistration,而AbstractAutoServiceRegistration实现了ApplicationListener,所以在项目启动的时候会执行onApplicationEvent

在这里插入图片描述

当调用start()方法后最终会指向NacosServiceRegistry的register方法

在这里插入图片描述

可以看到register方法中的代码最终还是会通过NamingService进行服务注册,也就是服务通过API注册时的流程。

Nacos服务端源码

当客户端发送请求后,Nacos服务端接收并响应,在naming项目中有个controllers包,用来接收客户端的请求

在这里插入图片描述

InstanceController是实例相关的接口,其中register方法把接收到的信息解析成instance,然后调用registerInstance方法完成注册,该方法是服务端注册的核心

在这里插入图片描述

在nacos2.0以后新增了Client模型,一个服务gRPC长连接对应一个Client,用来管理服务注册发布、服务心跳、服务订阅等操作

在这里插入图片描述

通过clientOperationService的实现EphemeralClientOperationServiceImpl调用registerInstance将服务与Client、Nacos服务三者绑定,完成注册。

在这里插入图片描述

相关文章
|
18天前
|
网络安全 Nacos 开发者
Nacos作为流行的微服务注册与配置中心,“节点提示暂时不可用”是常见的问题之一
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,“节点提示暂时不可用”是常见的问题之一。本文将探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务的正常运行。通过检查服务实例状态、网络连接、Nacos配置、调整健康检查策略等步骤,可以有效解决这一问题。
31 4
|
18天前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,实际使用中常遇到“客户端不发送心跳检测”的问题。本文深入探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务正常运行。通过检查客户端配置、网络连接、日志、版本兼容性、心跳策略、注册状态、重启应用和环境变量等步骤,系统地排查和解决这一问题。
38 3
|
18天前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
29 3
|
27天前
|
数据管理 Nacos 开发者
"Nacos架构深度解析:一篇文章带你掌握业务层四大核心功能,服务注册、配置管理、元数据与健康检查一网打尽!"
【10月更文挑战第23天】Nacos 是一个用于服务注册发现和配置管理的平台,支持动态服务发现、配置管理、元数据管理和健康检查。其业务层包括服务注册与发现、配置管理、元数据管理和健康检查四大核心功能。通过示例代码展示了如何在业务层中使用Nacos,帮助开发者构建高可用、动态扩展的微服务生态系统。
74 0
|
27天前
|
SQL 关系型数据库 数据库连接
"Nacos 2.1.0版本数据库配置写入难题破解攻略:一步步教你排查连接、权限和配置问题,重启服务轻松解决!"
【10月更文挑战第23天】在使用Nacos 2.1.0版本时,可能会遇到无法将配置信息写入数据库的问题。本文将引导你逐步解决这一问题,包括检查数据库连接、用户权限、Nacos配置文件,并提供示例代码和详细步骤。通过这些方法,你可以有效解决配置写入失败的问题。
53 0
|
2月前
|
Kubernetes Nacos 容器
nacos注册不上
我正在使用开源的Nacos,并已在Kubernetes中部署了Nacos服务,通过端口映射可在集群外访问Nacos控制台。Kubernetes使用NodePort类型暴露了8848、9848、9849、7848和9555端口,但在尝试注册时遇到问题,出现“Client not connected, current status: STARTING”的错误,导致启动失败。
|
3月前
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
3月前
|
Java Nacos Docker
"揭秘!Docker部署Seata遇上Nacos,注册成功却报错?这些坑你不得不防!一网打尽解决秘籍,让你的分布式事务稳如老狗!"
【8月更文挑战第15天】在微服务架构中,Nacos搭配Seata确保数据一致性时,Docker部署Seata后可能出现客户端连接错误,如“can not connect to services-server”。此问题多由网络配置不当、配置文件错误或版本不兼容引起。解决策略包括:调整Docker网络设置确保可达性;检查并修正`file.conf`和`registry.conf`中的Nacos地址和端口;验证Seata与Nacos版本兼容性;修改配置后重启服务;参考官方文档和最佳实践进行配置。通过这些步骤,能有效排除故障,保障服务稳定运行。
281 0
|
3月前
|
Kubernetes Nacos 微服务
【技术难题破解】Nacos v2.2.3 + K8s 微服务注册:强制删除 Pod 却不消失?!7步排查法+实战代码,手把手教你解决Nacos Pod僵死问题,让服务瞬间满血复活!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但有时会遇到“v2.2.3 k8s 微服务注册nacos强制删除 pod不消失”的问题。本文介绍此现象及其解决方法,帮助开发者确保服务稳定运行。首先需检查Pod状态与事件、配置文件及Nacos配置,确认无误后可调整Pod生命周期管理,并检查Kubernetes版本兼容性。若问题持续,考虑使用Finalizers、审查Nacos日志或借助Kubernetes诊断工具。必要时,可尝试手动强制删除Pod。通过系统排查,通常能有效解决此问题。
78 0
|
3月前
|
安全 Nacos 数据库
【技术安全大揭秘】Nacos暴露公网后被非法访问?!6大安全加固秘籍,手把手教你如何保护数据库免遭恶意篡改,打造坚不可摧的微服务注册与配置中心!从限制公网访问到启用访问控制,全方位解析如何构建安全防护体系,让您从此告别数据安全风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其公网暴露可能引发数据库被非法访问甚至篡改的安全隐患。本文剖析此问题并提供解决方案,包括限制公网访问、启用HTTPS、加强数据库安全、配置访问控制及监控等,帮助开发者确保服务安全稳定运行。
375 0
下一篇
无影云桌面