nacos(附加2)
这是一个比较深入的问题,涉及 Nacos 的两种服务发现方式。很多人容易把 DNS 和 IP 注册 混为一谈。
先说结论:
不是必须使用域名,也不是因为 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 只是提供了一种更加通用、语言无关的服务发现方案。
浙公网安备 33010602011771号