CAP
C(一致性),A(可用性),P(分区容错)
AP:满足可用性和分区容错
当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。
数据可以短暂不一致,但最终是需要一致的,无论如何都要保证服务的可用。
AP模式为临时实例,默认情况下,启动服务后,每隔5秒会向nacos发送一个"心跳包",这个心跳包中包含了当前服务的基本信息,Nacos收到这个“心跳包”如果发现这个服务的信息不在注册列表中,就进行注册,如果这个服务的信息在注册列表中就表明这个服务还是健康的。
客户端通过心跳上报的方式告知nacos 注册中心健康状态(默认心跳间隔5s,nacos将超过超过15s未收到心跳的实例设置为不健康,超过30s将实例删除)
这种特性适合于需要应对流量突增的场景,服务可以弹性扩容,当流量过去后,服务停掉即可自动注销。
CP:满足一致性和分区容错
当网络分区出现后,为了保证一致性,就必须拒绝请求,否则无法保证一致性。
我们服务可以不能用,但必须要保证数据的一致性。
CP模式为永久实例,启动时向nacos注册,nacos会对这个实例进行持久化处理,nacos主动检查客户端的健康状态(默认时间间隔20s,健康检查失败后会设置为不健康,不会立即删除),优点就是可以实时的监控到实例的健康状态,便于后续的告警和扩容等一系列处理。只有项目的主干业务才会设置为永久实例。
CP和AP模式之间的相互转换
curl -X PUT "$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP"
curl -X PUT "$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=AP"
成功示例:
需配置如下选项指明注册为临时/永久实例
AP模式不支持数据一致性,所以只支持服务注册的临时实例,CP模式支持服务注册的永久实例,满足配置文件的一致性
spring:
cloud:
nacos:
discovery:
# 示例类型(true为临时实例,false为永久实例 ==> CP模式)
ephemeral: true
tip:
- 这个不能随便切,建议保持默认的AP即可。
- 集群环境下所有的服务都要切换
- 可以使用postman模拟,必须使用put请求。用get和post均无效