《跟二师兄学Nacos》02篇 Nacos的临时与持久化实例,傻傻分不清?

简介: 《跟二师兄学Nacos》02篇 Nacos的临时与持久化实例,傻傻分不清?

学习不用那么功利,二师兄带你从更高维度轻松阅读源码~


本篇文章Nacos核心逻辑篇,给大家讲解一下「临时实例」与「持久化实例」的区别及运用场景。


Nacos的临时实例与持久化实例

在Nacos Client进行实例注册时,我们知道是通过Instance对象来携带实例的基本信息的。在Instance中有一个ephemeral字段,用来表示该实例是临时实例,还是持久化实例。


public class Instance implements Serializable {
    /**
     * If instance is ephemeral.
     *
     * @since 1.0.0
     */
    private boolean ephemeral = true;
    // 省略其他
}

从源码可以看出ephemeral字段是1.0.0版本新增的,用来表示注册的实例是否是临时实例还是持久化实例。


目前,无论是Nacos 1.x版本,还是2.x版本,ephemeral的默认值都是true。在1.x版本中服务注册默认采用http协议,2.x版本默认采用grpc协议,但这都未影响到ephemeral字段的默认值。


也就是说,一直以来,Nacos实例默认都是以临时实例的形式进行注册的。


当然,也是可以通过application的配置来改变这里默认值的。比如:


# false为永久实例,true表示临时实例

spring.cloud.nacos.discovery.ephemeral=false

1

2

上面是基于Spring Cloud进行配置,false为永久实例,true表示临时实例,默认为true。


临时实例与持久化实例的区别

临时实例与持久化实例的区别主要体现在服务器对该实例的处理上。


临时实例向Nacos注册,Nacos不会对其进行持久化存储,只能通过心跳方式保活。默认模式是:客户端心跳上报Nacos实例健康状态,默认间隔5秒,Nacos在15秒内未收到该实例的心跳,则会设置为不健康状态,超过30秒则将实例删除。


持久化实例向Nacos注册,Nacos会对其进行持久化处理。当该实例不存在时,Nacos只会将其健康状态设置为不健康,但并不会对将其从服务端删除。


另外,可以使用实例的ephemeral来判断健康检查模式,ephemeral为true对应的是client模式(客户端心跳),为false对应的是server模式(服务端检查)。


为什么要设计两种模式?

上面说了两种模式的不同和处理上的区别,那么Nacos为什么设计两种模式,它们是为了应对什么样的场景而存在呢?


对于临时实例,健康检查失败,则直接可以从列表中删除。这种特性就比较适合那些需要应对流量突增的场景,服务可以进行弹性扩容。当流量过去之后,服务停掉即可自动注销了。


对于持久化实例,健康检查失败,会被标记成不健康状态。它的好处是运维可以实时看到实例的健康状态,便于后续的警告、扩容等一些列措施。


除了上述场景之外,持久化实例还有另外一个场景用的到,那就是保护阈值。


Nacos的保护阈值

关于保护阈值,在前面的文章中专门写到过。


Nacos中可以针对具体的实例设置一个保护阈值,值为0-1之间的浮点类型。本质上,保护阈值是⼀个⽐例值(当前服务健康实例数/当前服务总实例数)。


⼀般情况下,服务消费者要从Nacos获取可⽤实例有健康/不健康状态之分。Nacos在返回实例时,只会返回健康实例。


但在⾼并发、⼤流量场景会存在⼀定的问题。比如,服务A有100个实例,98个实例都处于不健康状态,如果Nacos只返回这两个健康实例的话。流量洪峰的到来可能会直接打垮这两个服务,进一步产生雪崩效应。


保护阈值存在的意义在于当服务A健康实例数/总实例数 < 保护阈值时,说明健康的实例不多了,保护阈值会被触发(状态true)。


Nacos会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,请求失败,但这样也⽐造成雪崩要好。牺牲了⼀些请求,保证了整个系统的可⽤。


这里我们看到了不健康实例的另外一个作用:防止产生雪崩。


那么,如果所有的实例都是临时实例,当雪崩场景发生时,Nacos的阈值保护机制是不是就没有足够的(包含不健康实例)实例返回了?如果有一部分实例是持久化实例,即便它们已经挂掉,状态为不健康的,但当触发阈值保护时,还是可以起到分流的作用。


小结

关于Nacos临时实例与持久化实例就聊这么多了。如果想更深入了解,其实可以读一下源码。由于基于gRPC的实现过于复杂,可读性不够强,如果想阅读,建议阅读基于Http的实现。


如果文章内容有问题或想技术讨论请联系我(微信:zhuan2quan,备注Nacos),如果觉得写的还不错,值得一起学习,那就关注一下吧。



目录
相关文章
|
9月前
|
运维 Kubernetes Java
nacos常见问题之nacos的内存太高如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
9月前
|
人工智能 运维 测试技术
nacos常见问题之Nacos多出其他结点如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
|
9月前
|
运维 负载均衡 Java
nacos常见问题之用Feign无法互相如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
291 0
|
负载均衡 Java 数据库连接
终于整明白了Nacos是如何整合SpringCloud -- 注册中心篇
前面我们聊到了nacos是如何进行服务注册的 ,这篇文章我们再来聊一聊nacos是如何整合springcloud的,我们来看一看是如何实现服务的自动注册。
|
9月前
|
Java 网络安全 Nacos
nacos注册不上刷这个错,有解决方案吗?
【2月更文挑战第30天】nacos注册不上刷这个错,有解决方案吗? springboot项目,瘦身打包后,用java -jar 外置依赖和外置配置文件启动的时候,nacos注册不上刷这个错,有解决方案吗? com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING
452 1
|
6月前
|
Java Nacos Docker
"揭秘!Docker部署Seata遇上Nacos,注册成功却报错?这些坑你不得不防!一网打尽解决秘籍,让你的分布式事务稳如老狗!"
【8月更文挑战第15天】在微服务架构中,Nacos搭配Seata确保数据一致性时,Docker部署Seata后可能出现客户端连接错误,如“can not connect to services-server”。此问题多由网络配置不当、配置文件错误或版本不兼容引起。解决策略包括:调整Docker网络设置确保可达性;检查并修正`file.conf`和`registry.conf`中的Nacos地址和端口;验证Seata与Nacos版本兼容性;修改配置后重启服务;参考官方文档和最佳实践进行配置。通过这些步骤,能有效排除故障,保障服务稳定运行。
525 0
|
6月前
|
Kubernetes Nacos 微服务
【技术难题破解】Nacos v2.2.3 + K8s 微服务注册:强制删除 Pod 却不消失?!7步排查法+实战代码,手把手教你解决Nacos Pod僵死问题,让服务瞬间满血复活!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但有时会遇到“v2.2.3 k8s 微服务注册nacos强制删除 pod不消失”的问题。本文介绍此现象及其解决方法,帮助开发者确保服务稳定运行。首先需检查Pod状态与事件、配置文件及Nacos配置,确认无误后可调整Pod生命周期管理,并检查Kubernetes版本兼容性。若问题持续,考虑使用Finalizers、审查Nacos日志或借助Kubernetes诊断工具。必要时,可尝试手动强制删除Pod。通过系统排查,通常能有效解决此问题。
149 0
|
安全 Nacos
Nacos 客户端配置中心从浅入深原理及源码剖析(下)
Nacos 客户端配置中心从浅入深原理及源码剖析(下)
566 0
Nacos 客户端配置中心从浅入深原理及源码剖析(下)
|
存储 缓存 Java
项目实战典型案例23——-注册上nacos上的部分服务总是出现频繁掉线的情况
项目实战典型案例23——-注册上nacos上的部分服务总是出现频繁掉线的情况
556 0
|
存储 缓存 Java
案例23——-注册上nacos上的部分服务总是出现频繁掉线的情况
案例23——-注册上nacos上的部分服务总是出现频繁掉线的情况

热门文章

最新文章