nacos(附加2)

 
 
 

这是一个比较深入的问题,涉及 Nacos 的两种服务发现方式。很多人容易把 DNSIP 注册 混为一谈。

先说结论:

不是必须使用域名,也不是因为 IP 不行,而是 DNS 提供了一种与语言无关、无需引入 Nacos SDK 的服务发现方式。


一、普通的 Nacos 服务发现(最常见)

Spring Cloud Alibaba 使用的是 Naming API

例如:

 
User-Service 启动

↓

registerInstance()

↓

Nacos 保存:

user-service

192.168.1.5:8081
 

Order 调用:

 
namingService.getAllInstances("user-service")
 

获得:

 
192.168.1.5:8081
192.168.1.6:8081
 

这是 API 模式

特点:

  • Java
  • Go
  • Python
  • C#
  • 只要有 Nacos Client SDK 都可以

这种方式效率最高,也是生产环境最常见的。


二、什么叫 DNS 服务发现?

DNS 模式下,不需要调用:

 
NamingService.getAllInstances()
 

而是直接:

 
lookup(user-service.xxx)
 

例如:

 
user-service.test.nacos
 

程序会像解析普通域名一样:

 
DNS Query

↓

Nacos DNS Server

↓

返回

192.168.1.5
192.168.1.6
 

然后客户端自己选择一个。

整个过程:

 
程序

↓

DNS 查询

↓

Nacos DNS

↓

IP列表
 

是不是很像:

 
www.baidu.com

↓

DNS

↓

110.xxx.xxx.xxx
 

只是:

以前解析:

 
www.baidu.com
 

现在解析:

 
user-service
 

三、为什么说支持异构语言?

因为:

DNS 是所有操作系统、所有编程语言都支持的标准协议。

例如:

Linux:

 
nslookup user-service.test.nacos
 

Windows:

 
ping user-service.test.nacos
 

Python:

 
socket.gethostbyname("user-service.test.nacos")
 

Go:

 
net.LookupHost()
 

C:

 
gethostbyname()
 

PHP:

 
dns_get_record()
 

这些语言:

根本不用安装 Nacos SDK。

只要:

 
DNS
 

能访问即可。

所以:

Nacos 官方才说:

支持异构语言。

因为:

DNS 是全世界统一标准。


四、为什么不用 IP?

很多人会问:

既然:

 
192.168.1.5
 

也是地址。

为什么还要:

 
user-service
 

原因有几个。


第一:IP 会变化

例如:

今天:

 
User

192.168.1.5
 

明天:

 
192.168.1.18
 

如果代码:

 
http://192.168.1.5:8081
 

全部失效。

DNS:

 
user-service.test.nacos
 

永远不变。

DNS 后面:

 
192.168.1.5

↓

192.168.1.18
 

客户端根本不用改。


第二:一个服务有很多实例

例如:

 
User

192.168.1.5

192.168.1.6

192.168.1.7
 

DNS:

返回:

 
A Record

192.168.1.5

192.168.1.6

192.168.1.7
 

客户端:

随机挑一个。


第三:不用 SDK

例如:

有一个:

 
Nginx
 

它不会:

 
NamingService
 

但是:

Nginx 能:

 
resolver
 

解析 DNS。

所以:

 
proxy_pass http://user-service.test.nacos;
 

就可以工作。


五、是不是一定要暴露域名?

不是。

这里容易误解。

例如:

有人以为:

 
www.xxx.com
 

这种公网域名。

其实不是。

DNS 可以是:

 
user-service
 

或者:

 
user-service.nacos
 

或者:

 
user-service.namespace.local
 

甚至:

 
abc.xyz.internal
 

都是内部 DNS。

根本不会暴露公网。


六、是不是所有异构语言都必须用 DNS?

也不是。

例如:

Go 官方就有:

 
Nacos Go SDK
 

Python:

 
Nacos Python SDK
 

Node:

 
Nacos Node SDK
 

Rust:

社区 SDK。

因此:

异构语言完全可以:

 
SDK

↓

register()

↓

getInstance()
 

DNS 只是另外一种选择


七、什么时候会用 DNS?

一般:

  • 老系统(不能修改代码)
  • 没有 Nacos SDK 的语言
  • Nginx、Envoy、HAProxy 等基础设施
  • 一些 IoT 设备
  • C/C++ 老程序

这些:

不能:

 
NamingService
 

但是:

都会:

 
DNS
 

所以:

DNS 模式非常方便。


面试回答(推荐)

Nacos 提供了两种服务发现方式:一种是基于 SDK 的 Naming API,这是 Spring Cloud Alibaba 等框架最常用的方式;另一种是基于 DNS 协议的服务发现。DNS 模式并不是因为 IP 地址不能用,而是为了兼容没有 Nacos SDK 的异构语言或基础设施。由于 DNS 是操作系统和各种编程语言都原生支持的标准协议,任何支持 DNS 查询的程序都可以通过服务名解析到 Nacos 中注册的实例列表,而无需集成 Nacos Client。需要注意的是,异构语言并不一定要使用 DNS,只要对应语言有 Nacos SDK,也可以直接通过 SDK 完成服务注册与发现;DNS 只是提供了一种更加通用、语言无关的服务发现方案。

posted on 2026-08-06 23:11  日思日睿  阅读(4)  评论(0)    收藏  举报