文章目录
- 1. 概述
- 2. 注册实例
- 2.1 SDK
- 2.2 Open API
- 2.3 Spring Cloud
- 3. 临时实例
- 4. 永久实例
1. 概述
Nacos
提供了两种服务类型供用户注册实例时选择:
- 临时实例:只是临时存在于注册中心中,会在服务下线或不可用时被注册中心剔除,临时实例会与注册中心保持心跳,注册中心会在⼀段时间没有收到来自客户端的心跳后会将实例设置为不健康,然后在⼀段时间后进行剔除。
- 永久实例:在被删除之前会永久的存在于注册中心,且有可能并不知道注册中心存在,不会主动向注册中心上报心跳,需要注册中心主动进行探活。
2. 注册实例
Nacos
的服务发现提供了多种注册实例的方式,注册时可以设置是否临时实例。
2.1 SDK
直接使用 Nacos Client SDK
注册时,可以设置是否临时实例:
// 属性
Properties properties = new Properties();
properties.put("serverAddr", "127.0.0.1:8848"); // Nacos 服务器地址
properties.put("namespace", "0faa0970-1179-4143-8aa2-cac3ee6b42ec"); // 命名空间,可选
properties.put("username", "nacos"); // 用户名
properties.put("password", "nacos"); // 密码
// 创建 NamingService 实例
NamingService naming = NacosFactory.createNamingService(properties);
// 实例化要注册的实例对象
Instance instance = new Instance();
instance.setIp("127.0.0.1"); // 实例IP
instance.setPort(8080); // 实例端口
instance.setEphemeral(false); // 是否临时实例
instance.setWeight(1.0); // 实例权重
instance.setHealthy(true); // 实例健康状态
instance.setEnabled(true); // 实例启用状态
instance.setClusterName("DEFAULT"); // 集群名称
instance.setServiceName("test-demo"); // 服务名称
// 注册实例
naming.registerInstance("test-demo", instance);
2.2 Open API
使用 Open API 注册实例时,可以通过参数 ephemeral
设置是否临时实例:
2.3 Spring Cloud
使用 spring-cloud-starter-alibaba-nacos-discovery
注册时,在 application.yml
中可以设置是否临时实例:
spring:
application:
name: order-demo
cloud:
nacos:
# 服务端用户名密码
username: nacos
password: nacos
# 服务发现
discovery:
# 命名空间
namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec
# 服务端地址,默认:127.0.0.1:8848
server-addr: 127.0.0.1:8848
# 是否临时实例
ephemeral: true
在服务发现配置属性类 NacosDiscoveryProperties
中,可以看到该配置默认为 true
:
private boolean ephemeral = true;
3. 临时实例
启动 order-demo
注册到 Nacos
,在服务详情中的实例列表,可以看到临时实例为 true
:
当关闭服务后,临时实例在服务列表中会被剔除:
4. 永久实例
修改 order-demo
中的配置,设置 ephemeral
为 fasle
,即注册为永久实例:
spring:
cloud:
nacos:
# 服务端用户名密码
username: nacos
password: nacos
# 服务发现
discovery:
# 命名空间
namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec
# 服务端地址,默认:127.0.0.1:8848
server-addr: 127.0.0.1:8848
# 是否临时实例
ephemeral: fasle
查看实例列表:
当关闭服务后,永久实例在服务列表中不会被剔除:
只会将健康状态设置为 fasle
:
当注册为永久实例后,该服务如果再注册为临时实例,会报错is persistent service, can't register ephemeral instance.
:
Caused by: com.alibaba.nacos.api.exception.NacosException: errCode: 400, errMsg: Current service DEFAULT_GROUP@@order-demo is persistent service, can't register ephemeral instance.
at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:662) ~[nacos-client-2.2.1.jar:na]
at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:623) ~[nacos-client-2.2.1.jar:na]
at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:357) ~[nacos-client-2.2.1.jar:na]
at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.doRegisterService(NamingGrpcClientProxy.java:210) ~[nacos-client-2.2.1.jar:na]
at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.registerService(NamingGrpcClientProxy.java:124) ~[nacos-client-2.2.1.jar:na]
at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.registerService(NamingClientProxyDelegate.java:98) ~[nacos-client-2.2.1.jar:na]
at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:143) ~[nacos-client-2.2.1.jar:na]
at com.alibaba.cloud.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:75) ~[spring-cloud-starter-alibaba-nacos-discovery-2022.0.0.0.jar:2022.0.0.0]
... 25 common frames omitted
这是因为在 Nacos 2.x
中,同一服务名称下,不能注册不同类型的实例,即要么都是临时的,要么都是永久的。永久实例注册后,会持久化到磁盘文件中,不再被允许注册为临时实例。
可以主动删除实例,或者直接将\nacos\data
目录下的文件删除,解决上述问题: