Nacos Java SDK 使用手册
1. 引用概述
Maven 坐标
注意:由于Nacos Java SDK在2.0版本后引入了gRPC,为了避免用户业务引入的gRPC版本不同导致冲突,使用了shaded技术将部分依赖直接封装进nacos-client中,导致nacos-client较大。
如果用户未自行引入gRPC或确认版本无冲突,希望使用纯净版的nacos-client以减小依赖,可以使用classifier来指定使用纯净版。
2. 初始化SDK
Nacos 初始化SDK仅需要使用 NacosFactory
类进行不同模块的创建即可:
如果初始化SDK时,还需要配置一些参数,可以使用 Properties
类进行配置:
更多初始化时所涉及的参数配置,请参考Java SDK 配置参数。
注意:一个Nacos Java SDK实例只能用于获取同一个命名空间下的配置和服务,如果要获取不同的命名空间下的配置或服务,需要创建不同的Nacos Java SDK实例。
3. 配置管理 API
3.1. 获取配置
描述
用于服务启动的时候从 Nacos 获取配置。
请求参数
参数名 | 参数类型 | 描述 |
---|
dataId | string | 配置 ID,采用类似 package.class(如com.taobao.tc.refund.log.level)的命名规则保证全局唯一性,class 部分建议是配置的业务含义。全部字符小写。只允许英文字符和 4 种特殊字符(”.”、”:”、”-”、”_”),不超过 256 字节。 |
group | string | 配置分组,建议填写产品名:模块名(Nacos)保证唯一性,只允许英文字符和4种特殊字符(”.”、”:”、”-”、”_”),不超过128字节。 |
timeout | long | 读取配置超时时间,单位 ms,推荐值 3000。 |
返回值
请求示例
异常说明
读取配置超时或网络异常,抛出 NacosException 异常。
3.2. 监听配置
描述
如果希望 Nacos 推送配置变更,可以使用 Nacos 动态监听配置接口来实现。
请求参数
参数名 | 参数类型 | 描述 |
---|
dataId | string | 配置 ID,采用类似 package.class(如com.taobao.tc.refund.log.level)的命名规则保证全局唯一性,class 部分建议是配置的业务含义。全部字符小写。只允许英文字符和 4 种特殊字符(”.”、”:”、”-”、”_”),不超过 256 字节。 |
group | string | 配置分组,建议填写产品名:模块名(Nacos)保证唯一性,只允许英文字符和4种特殊字符(”.”、”:”、”-”、”_”),不超过128字节。 |
listener | Listener | 监听器,配置变更进入监听器的回调函数。 |
返回值
参数类型 | 描述 |
---|
string | 配置值,初始化或者配置变更的时候通过回调函数返回该值。 |
请求示例
3.3. 删除监听
描述
取消监听配置,取消监听后配置不会再推送。
请求参数
参数名 | 参数类型 | 描述 |
---|
dataId | string | 配置 ID,采用类似 package.class(如com.taobao.tc.refund.log.level)的命名规则保证全局唯一性,class 部分建议是配置的业务含义。全部字符小写。只允许英文字符和 4 种特殊字符(”.”、”:”、”-”、”_”),不超过 256 字节。 |
group | string | 配置分组 |
listener | ConfigChangeListenerAdapter | 监听器,配置变更进入监听器的回调函数。 |
使用示例
3.4. 发布配置
描述
用于通过程序自动发布 Nacos 配置,以便通过自动化手段降低运维成本。
注意:创建和修改配置时使用的同一个发布接口,当配置不存在时会创建配置,当配置已存在时会更新配置。
请求参数
参数名 | 参数类型 | 描述 |
---|
dataId | string | 配置 ID,采用类似 package.class (如 com.taobao.tc.refund.log.level )的命名规则保证全局唯一性。建议根据配置的业务含义来定义 class 部分。全部字符均为小写。只允许英文字符和 4 种特殊字符(“.”、“:”、“-”、“_”),不超过 256 字节。 |
group | string | 配置分组,建议填写产品名:模块名 (如 Nacos:Test )来保证唯一性。只允许英文字符和 4 种特殊字符(“.”、“:”、“-”、“_”),不超过 128 字节。 |
content | string | 配置内容,不超过 100K 字节。 |
type | string | @Since 1.4.1. 配置类型,见 com.alibaba.nacos.api.config.ConfigType ,默认为TEXT |
返回参数
请求示例
异常说明
读取配置超时或网络异常,抛出 NacosException 异常。
3.5. 删除配置
描述
用于通过程序自动删除 Nacos 配置,以便通过自动化手段降低运维成本。
注意: 当配置已存在时会删除该配置,当配置不存在时会直接返回成功消息。
请求参数
参数名 | 参数类型 | 描述 |
---|
dataId | string | 配置 ID |
group | string | 配置分组 |
返回参数
请求示例
异常说明
读取配置超时或网络异常,抛出 NacosException 异常。
3.6. 带监听器的获取配置
描述
如果希望在程序首次启动获取配置时自行注册的Listener用于以后配置更新,建议您直接使用该接口。
该接口等价于先使用getConfig
之后再使用addListener
。
请求参数
参数名 | 参数类型 | 描述 |
---|
dataId | string | 配置 ID,采用类似 package.class(如com.taobao.tc.refund.log.level)的命名规则保证全局唯一性,class 部分建议是配置的业务含义。全部字符小写。只允许英文字符和 4 种特殊字符(”.”、”:”、”-”、”_”),不超过 256 字节。 |
group | string | 配置分组,建议填写产品名:模块名(Nacos)保证唯一性,只允许英文字符和4种特殊字符(”.”、”:”、”-”、”_”),不超过128字节。 |
timeout | long | 读取配置超时时间,单位 ms,推荐值 3000。 |
listener | Listener | 监听器,配置变更进入监听器的回调函数。 |
返回值
请求示例
异常说明
读取配置超时或网络异常,抛出 NacosException 异常。
3.7. 带Compare-And-Swap(CAS)的发布配置
描述
直接使用publishConfig
进行配置发布时,可能存在不同进程间并发的配置覆盖问题,此时可以使用带Compare-And-Swap(CAS)的发布配置API,来保证不会此类情形。
注意:创建和修改配置时使用的同一个发布接口,当配置不存在时会创建配置,当配置已存在时会更新配置。
请求参数
参数名 | 参数类型 | 描述 |
---|
dataId | string | 配置 ID,采用类似 package.class (如 com.taobao.tc.refund.log.level )的命名规则保证全局唯一性。建议根据配置的业务含义来定义 class 部分。全部字符均为小写。只允许英文字符和 4 种特殊字符(“.”、“:”、“-”、“_”),不超过 256 字节。 |
group | string | 配置分组,建议填写产品名:模块名 (如 Nacos:Test )来保证唯一性。只允许英文字符和 4 种特殊字符(“.”、“:”、“-”、“_”),不超过 128 字节。 |
content | string | 配置内容,不超过 100K 字节。 |
casMd5 | string | 前配置内容的md5 |
type | string | 配置类型,见 com.alibaba.nacos.api.config.ConfigType ,默认为TEXT |
返回参数
请求示例
异常说明
读取配置超时或网络异常,抛出 NacosException 异常。
4. 服务发现API
4.1. 注册实例
描述
注册一个实例到服务。
由于同一个Nacos Client实例,仅能向一个服务注册一个实例;若同一个Nacos Client实例多次向同一个服务注册实例,后注册的实例将会覆盖先注册的实例。
若有存在代理注册的场景,请使用批量注册服务实例
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
ip | 字符串 | 服务实例IP | 无,必填 |
port | int | 服务实例port | 无,必填 |
clusterName | 字符串 | 集群名 | DEFAULT |
instance | 参见代码注释 | 实例属性 | 无,必填 |
返回参数
无
请求示例
4.2. 注销实例
描述
删除服务下的一个实例。
若该服务是通过批量注册服务实例进行注册,使用注销实例进行注销时,将注销所有批量注册的实例。
若仅希望注销部分批量注册的实例,请使用批量注销服务实例
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
ip | 字符串 | 服务实例IP | 无,必填 |
port | int | 服务实例port | 无,必填 |
clusterName | 字符串 | 集群名 | DEFAULT |
instance | 参见代码注释 | 实例属性 | 无,必填 |
返回参数
无
请求示例
4.3. 获取全部实例
描述
获取服务下的所有实例。
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
subscribe | Boolean | 是否订阅服务,为true时将会订阅该服务,同时查询优先通过内存缓存;为false时将直接查询Nacos Server | true |
clusters | 字符串列表 | 实例的clusterName,空列表时将查询所有实例。 | 空列表 |
返回参数
List<Instance> 实例列表。
请求示例
4.4. 获取健康或不健康实例列表
描述
根据条件获取过滤后的实例列表。
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
subscribe | Boolean | 是否订阅服务,为true时将会订阅该服务,同时查询优先通过内存缓存;为false时将直接查询Nacos Server | true |
clusters | 字符串列表 | 实例的clusterName,空列表时将查询所有实例。 | 空列表 |
healthy | boolean | 是否健康,为true时仅会返回健康的实例列表,反之则返回不健康的实例列表。 | true |
返回参数
List<Instance> 实例列表。
请求示例
4.5. 获取一个健康实例
描述
根据负载均衡算法随机获取一个健康实例。
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
subscribe | Boolean | 是否订阅服务,为true时将会订阅该服务,同时查询优先通过内存缓存;为false时将直接查询Nacos Server | true |
clusters | 字符串列表 | 实例的clusterName,空列表时将查询所有实例。 | 空列表 |
返回参数
Instance 实例。
请求示例
4.6. 监听服务
描述
监听服务下的实例列表变化。
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
clusters | 字符串列表 | 实例的clusterName,空列表时将查询所有实例。 | 空列表 |
listener | EventListener | 回调listener | 无,必填 |
返回参数
无
请求示例
使用自定义线程池进行异步监听
Nacos 支持使用自定义线程池进行异步监听回调,只需要将EventListener
更换为AbstractEventListener
,并实现Executor getExecutor()
方法来返回自定义的线程池,Nacos Client将在服务发生变更时使用该线程池进行异步回调。
监听服务变化的差值
Nacos 从2.4.0版本你开始,支持监听服务变化的差值,即和之前相比,有哪些实例被新增,移除和修改,只需要将EventListener
更换为AbstractNamingChangeListener
,实现onChange
方法即可。onChange
中会传入NamingChangeEvent
,其中InstancesDiff
记录了此次通知和之前相比的实例变化。
同时为了防止差值的错误和异常,NamingChangeEvent
仍然可以通过getInstances
方法获取最终的服务实例列表。
4.7. 取消监听服务
描述
取消监听服务下的实例列表变化。
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
clusters | 字符串列表 | 实例的clusterName,空列表时将查询所有实例。 | 空列表 |
listener | EventListener | 回调listener | 无,必填 |
注意:取消监听服务时,需要使用进行订阅时的listener
进行取消监听,否则可能造成取消监听失败。
返回参数
无
请求示例
4.8. 批量注册服务实例
描述
注册一系列实例到指定服务。
由于同一个Nacos Client实例,仅能向一个服务注册一个实例;若同一个Nacos Client实例多次向同一个服务注册实例,后注册的实例将会覆盖先注册的实例。
考虑到社区存在代理注册的场景:如Nacos-Sync, Proxy-Registry等,需要在一个客户端中注册同一个服务的不同实例,社区新增了批量注册服务实例的功能。
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
instances | Instance的List | 服务实例列表 | 无,必填 |
返回参数
无
请求示例
4.9. 批量注销服务实例
描述
从指定服务中注销一系列实例。
针对使用了批量注册服务实例的用户设计,允许用户选择一部分或全部批量注册的实例进行注销。
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
instances | Instance的List | 服务实例列表 | 无,必填 |
返回参数
无
请求示例
4.10. 带选择器的监听服务
描述
使用自定义逻辑的选择器,监听服务下的实例列表变化,当服务列表发生变化时,会使用自定义的选择器进行过滤,当过滤后的数据仍然有变化时,才会进行回调通知。
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
clusters | 字符串列表 | 实例的clusterName,空列表时将查询所有实例。 | 空列表 |
selector | NamingSelector | 自定义的数据选择器 | 无,必填 |
listener | EventListener | 回调listener | 无,必填 |
返回参数
无
请求示例
预设提供的数据选择器
Nacos Client 提供了预设的多种数据选择器以供默认场景下使用:
- Cluster选择器,
NamingSelectorFactory.newClusterSelector(Collection<String> clusters)
, 当订阅服务时传入了clusters
参数,Nacos Client将自动使用该数据选择器。
- Ip选择器,
NamingSelectorFactory.newClusterSelector(String ipRegex)
,当实例的ip满足传入的ipRegex时,才会被通知回调。
- 元数据选择器,
NamingSelectorFactory.newMetadataSelector(Map<String, String> metadata)
,当实例的元数据包含所有传入选择器的metadata时,才会被通知回调。
- 任意元数据选择器,
NamingSelectorFactory.newMetadataSelector(Map<String, String> metadata, false)
,当实例的元数据包含任意一对传入选择器的metadata时,才会被通知回调。
开发自定义数据选择器
多数情况下, 开发自定义数据选择器只需要创建DefaultNamingSelector
即可,在构建时传入一个Predicate<Instance> filter
作为单个实例是否满足您过滤条件的结果,类似Java中stream的filter方法,如此您仅需要考虑单个实例的过滤条件即可。
若是DefaultNamingSelector
无法满足需求,您需要实现NamingSelector
接口,根据传入的NamingContext
进行复杂的逻辑校验,最后输出NamingResult
给Nacos Client。
4.11. 取消带选择器的监听服务
描述
使用自定义逻辑的选择器进行监听服务下的实例列表变化,那么在取消监听时需要使用取消带选择器的监听服务
的API才能正确取消监听。
注意:取消监听时需要传入监听时使用的selector和listener,否则可能导致取消监听失败。
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
serviceName | 字符串 | 服务名 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
clusters | 字符串列表 | 实例的clusterName,空列表时将查询所有实例。 | 空列表 |
selector | NamingSelector | 自定义的数据选择器 | 无,必填 |
listener | EventListener | 回调listener | 无,必填 |
返回参数
无
请求示例
4.12. 分页获取服务列表
描述
通过分页的方式获取当前客户端所在命名空间的服务列表
注意,使用AbstractSelector
的getServicesOfServer
方法已废弃,请勿继续使用。
请求参数
名称 | 类型 | 描述 | 默认值 |
---|
pageNo | int | 分页序号 | 无,必填 |
pageSize | int | 分页中每页的服务个数 | 无,必填 |
groupName | 字符串 | 分组名 | DEFAULT_GROUP |
返回参数
服务名列表: ListView
请求示例
4.13. 获取当前客户端所监听的服务列表
描述
获取当前客户端所的所有服务列表
请求参数
无
返回参数
服务列表: List
请求示例
5. Java SDK的生命周期
Nacos的Java SDK 生命周期从创建时开始,到调用shutdown()
方法时结束,期间对应创建的线程池、连接等均会始终保留,及时连接断开,也会不断重试重新建立连接。
因此在使用时需要注意应用中创建的Nacos Java SDK的实例个数,避免造成线程池和连接的泄漏,在更换Nacos Java SDK实例时,切记调用shutdown()
方法,同时在应用中应尽量复用同一个Nacos Java SDK实例,避免频繁的初始化实例。