nacos概念
- 实例:提供一个或多个服务的具有可访问网络地址(IP:Port)的进程
- 服务:通过预定义接口网络访问的提供给客户端的软件功能。
- 服务名:服务提供的标识,通过该标识可以唯一确定其指代的服务。
- 元信息:Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。
服务发现
open-api接口:https://nacos.io/zh-cn/docs/open-api.html
服务发现是nacos的一个重要功能,本次主要关注服务发现部分的open-api接口,open-api贯穿在nacos的所有版本中,nacos 2.0之后开始支持gRPC
实例相关
注册实例
POST /nacos/v1/ns/instance
请求参数
名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
ip | 字符串 | 是 | 服务实例IP |
port | int | 是 | 服务实例port |
serviceName | 字符串 | 是 | 服务名 |
namespaceId | 字符串 | 否 | 命名空间ID |
weight | double | 否 | 权重 |
enabled | boolean | 否 | 是否上线 |
healthy | boolean | 否 | 是否健康 |
metadata | 字符串 | 否 | 扩展信息 |
clusterName | 字符串 | 否 | 集群名 |
groupName | 字符串 | 否 | 分组名 |
ephemeral | boolean | 否 | 是否临时实例 |
> curl -X POST 'http://172.16.57.42:8848/nacos/v1/ns/instance?port=8848&healthy=true&ip=172.16.57.42&weight=1.0&serviceName=nacos.test.3&encoding=GBK&namespaceId=n1'
> ok
注销实例
DELETE /nacos/v1/ns/instance
请求参数
名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
serviceName | 字符串 | 是 | 服务名 |
ip | 字符串 | 是 | 服务实例IP |
port | int | 是 | 服务实例port |
groupName | 字符串 | 否 | 分组名 |
clusterName | 字符串 | 否 | 集群名称 |
namespaceId | 字符串 | 否 | 命名空间ID |
ephemeral | boolean | 否 | 是否临时实例 |
> curl -X DELETE '172.16.57.42:8848/nacos/v1/ns/instance?serviceName=nacos.test.1&ip=172.16.57.42&port=8888&clusterName=TEST1'
> ok
这个接口貌似不检查参数是否正确,随便填写ip、端口、serviceName, 服务都返回ok,nacos的服务端会记录一条删除不存在的实例的日志
2021-10-15 14:01:44,413 WARN remove instance from non-exist client: 1.1.1.1:8888#true
修改实例
PUT /nacos/v1/ns/instance
请求参数
名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
serviceName | 字符串 | 是 | 服务名 |
ip | 字符串 | 是 | 服务实例IP |
port | int | 是 | 服务实例port |
groupName | 字符串 | 否 | 分组名 |
clusterName | 字符串 | 否 | 集群名称 |
namespaceId | 字符串 | 否 | 命名空间ID |
weight | double | 否 | 权重 |
metadata | JSON | 否 | 扩展信息 |
enabled | boolean | 否 | 是否打开流量 |
ephemeral | boolean | 否 | 是否临时实例 |
> curl -X PUT '172.16.57.42:8848/nacos/v1/ns/instance?serviceName=nacos.test.3&ip=172.16.57.42&port=8848&weight=8&metadata={}&namespaceId=n1'
> ok
> curl -X GET '172.16.57.42:8848/nacos/v1/ns/instance/list?serviceName=nacos.test.3&namespaceId=n1'
> {"name":"DEFAULT_GROUP@@nacos.test.3","groupName":"DEFAULT_GROUP","clusters":"","cacheMillis":10000,"hosts":[{"instanceId":"172.16.57.42#8848#DEFAULT#DEFAULT_GROUP@@nacos.test.3","ip":"172.16.57.42","port":8848,"weight":8.0,"healthy":false,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@nacos.test.3","metadata":{},"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000,"instanceIdGenerator":"simple"}],"lastRefTime":1634281689202,"checksum":"","allIPs":false,"reachProtectionThreshold":false,"valid":true}
查询serviceName下的实例列表
GET /nacos/v1/ns/instance/list
请求参数
名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
serviceName | 字符串 | 是 | 服务名 |
groupName | 字符串 | 否 | 分组名 |
namespaceId | 字符串 | 否 | 命名空间ID |
clusters | 字符串,多个集群用逗号分隔 | 否 | 集群名称 |
healthyOnly | boolean | 否,默认为false | 是否只返回健康实例 |
> curl -X GET '172.16.57.42:8848/nacos/v1/ns/instance/list?serviceName=nacos.test.3&namespaceId=n1'
> {"name":"DEFAULT_GROUP@@nacos.test.3","groupName":"DEFAULT_GROUP","clusters":"","cacheMillis":10000,"hosts":[{"instanceId":"172.16.57.42#8848#DEFAULT#DEFAULT_GROUP@@nacos.test.3","ip":"172.16.57.42","port":8848,"weight":1.0,"healthy":false,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@nacos.test.3","metadata":{},"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000,"instanceIdGenerator":"simple"}],"lastRefTime":1634278267643,"checksum":"","allIPs":false,"reachProtectionThreshold":false,"valid":true}
查询某个实例详情
GET /nacos/v1/ns/instance
请求参数
名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
serviceName | 字符串 | 是 | 服务名 |
ip | 字符串 | 是 | 实例IP |
port | 字符串 | 是 | 实例端口 |
groupName | 字符串 | 否 | 分组名 |
namespaceId 字符串 | 否 | 命名空间ID | |
cluster | 字符串 | 否 | 集群名称 |
healthyOnly | boolean | 否,默认为false | 是否只返回健康实例 |
ephemeral | boolean | 否 | 是否临时实例 |
> curl -X GET '172.16.57.42:8848/nacos/v1/ns/instance?serviceName=nacos.test.3&namespaceId=n1&ip=172.16.57.42&port=8848'
> {"service":"DEFAULT_GROUP@@nacos.test.3","ip":"172.16.57.42","port":8848,"clusterName":"DEFAULT","weight":1.0,"healthy":true,"instanceId":"172.16.57.42#8848#DEFAULT#DEFAULT_GROUP@@nacos.test.3","metadata":{}}
发送实例心跳
PUT /nacos/v1/ns/instance/beat
请求参数
名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
serviceName | 字符串 | 是 | 服务名 |
beat | JSON格式字符串 | 是 | 实例心跳内容 |
groupName | 字符串 | 否 | 分组名 |
ephemeral | boolean | 否 | 是否临时实例 |
namespaceId | string | 否 | 命名空间ID |
> curl -X PUT '172.16.57.42:8848/nacos/v1/ns/instance/beat?serviceName=nacos.test.3&beat=%7B%22cluster%22%3A%22DEFAULT%22%2C%22ip%22%3A%22172.16.57.42%22%2C%22metadata%22%3A%7B%7D%2C%22port%22%3A8848%2C%22scheduled%22%3Atrue%2C%22serviceName%22%3A%22DEFAULT_GROUP%40%40nacos.test.3%22%2C%22weight%22%3A1%7D&namespaceId=n1'
> {"clientBeatInterval":5000,"code":10200,"lightBeatEnabled":true}
> curl -X GET '172.16.57.42:8848/nacos/v1/ns/instance/list?serviceName=nacos.test.3&namespaceId=n1'
> {"name":"DEFAULT_GROUP@@nacos.test.3","groupName":"DEFAULT_GROUP","clusters":"","cacheMillis":10000,"hosts":[{"instanceId":"172.16.57.42#8849#DEFAULT#DEFAULT_GROUP@@nacos.test.3","ip":"172.16.57.42","port":8848,"weight":8.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@nacos.test.3","metadata":{},"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000,"instanceIdGenerator":"simple"}],"lastRefTime":1634283879987,"checksum":"","allIPs":false,"reachProtectionThreshold":false,"valid":true}
beat为json字符串,需要进行urlencode, open-api文档里有个坑,请求参数里没有提及 namespaceId,实际也是需要的 如果注册了实例后,不维护心跳,一段时间后nacos会自动剔除掉这个实例
服务相关
接下来是服务级的几个接口,关于创建服务,删除服务,修改服务这几个接口没有测试,通常这种低频的操作直接在 nacos 自带的web控制台中操作即可,直接看查询接口接口
查询服务
GET /nacos/v1/ns/service
请求参数
名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
serviceName | 字符串 | 是 | 服务名 |
groupName | 字符串 | 否 | 分组名 |
namespaceId | 字符串 | 否 | 命名空间ID |
> curl -X GET '172.16.57.42:8848/nacos/v1/ns/service?serviceName=nacos.test.3&namespaceId=n1'
> {"namespaceId":"n1","groupName":"DEFAULT_GROUP","name":"nacos.test.3","protectThreshold":0.0,"metadata":{},"selector":{"type":"none"},"clusters":[{"name":"DEFAULT","healthChecker":{"type":"TCP"},"metadata":{}}]}
查询服务列表
GET /nacos/v1/ns/service/list
请求参数
名称 | 类型 | 是否必选 | 描述 |
---|---|---|---|
pageNo | int | 是 | 当前页码 |
pageSize | int | 是 | 分页大小 |
groupName | 字符串 | 否 | 分组名 |
namespaceId | 字符串 | 否 | 命名空间ID |
> curl -X GET '172.16.57.42:8848/nacos/v1/ns/service/list?pageNo=1&pageSize=2&namespaceId=n1'
> {"doms":["nacos.test.2","nacos.test.3"],"count":2}
其他接口
更新实例的健康状态: 仅在集群健康检查关闭时才生效
获取集群server列表和集群的leader
疑问
open-api的接口中未发现订阅服务变更的接口, 需要查看sdk里是如何具体实现的