配置
在服务注册时有一个属性ephemeral
用于描述当前实例在注册时是否以临时实例出现;
- 为true则为临时实例(默认值);
- 为false则为持久实例;
区别
临时实例
- 默认情况,服务实例仅会注册在Nacos内存,不会持久化到Nacos磁盘,其健康检测机制为Client模式,即Client主动向Server上报其健康状态(类似于推模式);
- 默认心跳间隔为5秒,在15秒内Server未收到Client心跳,则会将其标记为“不健康”状态;在30秒内若收到了Client心跳,则重新恢复“健康”状态,否则该实例将从Server端内存清除。即对于不健康的实例,Server会自动清除;
持久实例
- 服务实例不仅会注册到Nacos内存,同时也会被持久化到Nacos磁盘,其健康检测机制为Server模式,即Server会主动去检测Client的健康状态(类似于拉模式);
- 默认每20秒检测一次,健康检测失败后服务实例会被标记为“不健康”状态,但不会被清除,因为其是持久化在磁盘的,其对不健康持久实例的清除,需要专门进行;
- 总结:持久实例就像是亲儿子;
适用场景
- 临时实例:适合于存在突发流量暴增可能的互联网项目,可以实现弹性扩容,正常生产中的环境就是这样;
- 持久实例:保护阈值,比如说服务A有100个实例,那么当有98个不可用时:
- 如果是临时实例,则只会返回两个服务,那么大并发量请求这两个服务肯定会造成雪崩的,造成整个服务不可用;
- 如果是持久实例,实例会全部返回,虽然有98个不可用,消费者可能会请求失败,但不至于剩下的两个健康实例崩溃;