nacos open-api

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里是如何具体实现的


wechat
微信扫一扫,订阅我的博客动态^_^