Nacos 2.x 系列【14】临时实例、永久实例

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 中的配置,设置 ephemeralfasle ,即注册为永久实例:

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目录下的文件删除,解决上述问题:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨 禹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值