【Springcloud】Nacos
【一】介绍服务发现:Nacos
(1)服务发现原理
(1)服务发现机制就是通过一个中间件去记录服务提供者的ip地址,服务名以及心跳等数据(比如用mysql去存储这些信息,所以Nacos要配置持久化),然后服务消费者会去这个中间平台去查询相关信息,然后再去访问对应的地址,这就是服务注册和服务发现。
(2)当用户地址发生了变化也没有影响,因为服务提供方修改了用户地址,在中间件中会被更新,当服务消费方去访问中间件时就能及时获取最新的用户地址,就不会出现用户地址发生变化导致服务找不到
(2)什么是Nacos?如何安装和启动?
(1)官方文档:什么是Nacos
(2)下载安装搭建NacosServer
下载Nacos:Nacos下载
搭建Nacos:Nacos搭建
启动服务器:(单机启动模式,非集群)
下载解压后,终端进入bin目录:cd /Library/Java/AllenNacos/nacos/bin
Linux/Unix/Mac:
sh startup.sh -m standalone
Windows:
cmd startup.md
使用此地址进入界面,http://127.0.0.1:8848/nacos/
账号密码均为nacos
在终端进入bin目录使用sh shutdown.sh关闭nacos
(3)配置Nacos持久化到数据库
来到Nacos的解压目录下的conf下的application.properties文件中,将连接到外置本地数据库的代码去掉注释并修改为
自己的数据库和用户名和密码
修改内容
spring.datasource.platform=mysql
Count of DB:
db.num=1
Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/ry-configcharacterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=你的密码
(3)将应用注册到Nacos
(1)目标
1-用户中心注册到Nacos
2-内容中心注册到Nacos
(2)用户中心注册到Nacos
1-pom加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2-加注解
早期在启动类上需要加上 @EnableDiscoveryClient注解,现在已经可以不需要加了
3-加yml配置
spring:
cloud:
discovery:
server-addr: localhost:8848 #指定nacos server的地址
application:
name: 服务名称 # 比如 user-center,服务名称尽量用- ,不要用_
注册成功如图所示
4-补充内容
使用DiscoverClient的相关Api可以在代码中获取Nacos提供的微服务的一些信息,调用方法如图:
【二】Nacos作为服务注册中心演示(替代Eureka)
1-新建生产者Module,端口为9001
cloudalibaba-provider-payment9001
2-修改pom,添加依赖
父模块pom引入SpringCloudAlibaba的依赖
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
本模块pom引入nacos-discovery的依赖
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3-修改yml配置文件
将9001微服务注册到8848Nacos服务中心
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置nacos的地址
# 将监控的内容暴露出来
management:
endpoints:
web:
exposure:
include: '*'
4-编写主启动类
添加注解@EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class,args);
}
}
5-编写业务类
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
6-测试
先启动安装好的Nacos,默认端口就是8848,启动成功后进入 http://127.0.0.1:8848/nacos/ 查看控制台页面
然后启动9001服务的Application,启动成功后再看Nacos页面,可以看到新的服务注册进来了
7-参照9001新建9002,准备演示Nacos的负载均衡
Nacos天生自带负载均衡,内部封装集成了Ribbon
几乎完全拷贝,只是port端口不一样
也进行启动,然后看到新的服务注册进来了
点进详情查看
8-新建消费者Module,端口为83
cloudalibaba-consumer-nacos-order83
接下来的修改pom、修改yml配置文件、修改主启动类等等相同的步骤跳过
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
9-编写消费者83端口的业务类
编写RestTemplate类的封装,加上了@LoadBalanced注解,83端口消费者根据请求的接口到Nacos服务中心去找,结果会找到两个一样的接口,分别在9001和9002,加上@LoadBalanced注解以后就会实现负载均衡,在这两个接口之间选择使用。
如果不加@LoadBalanced注解会报错,表示分不清用哪一个端口的接口
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced//负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@RestController
@Slf4j
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
//value注解读取的是yml配置文件里的数据,将配置和代码分开
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id){
//访问提供者的路径
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
10-测试消费者的负载均衡
启动83服务
访问83的端口:http://localhost:83/consumer/payment/nacos/13
可以看到访问的接口在9001端口和9002端口轮流调用
11-服务注册中Nacos和Eureka以及Zookeeper、Consul的比较
Nacos支持AP和CP模式的切换!!!
【三】Nacos作为服务配置中心演示(替代Config和Bus)
【1】基本介绍
(1)什么是配置中心?
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图:
总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件。
(2)为什么使用配置中心?
配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
(3)Nacos配置中心
Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
配置中心的服务流程如下:
1、用户在配置中心更新配置信息。
2、服务A和服务B及时得到配置更新通知,从配置中心获取配置。
【2】Nacos作为配置中心-基础配置
(1)新建Module
cloudalibaba-config-nacos-client3377
(2)修改pom
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
(3)修改yml配置文件
Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
在这里需要由bootstrap.yml和application.yml两个配置文件,为的就是方便Nacos和springcloud的Config无缝的迁移。springboot中配置文件的加载是存在优先级顺序的,bootstrap>application。
所以我们要把重点的配置信息放在bootstrap.yml配置文件中,全局的一些配置放在bootstrap.yml,自己单独的配置放在application.yml
bootstrap.yml内容如下
spring:
application:
name: nacos-config-client
profiles:
active: dev # 表示开发环境,test表示测试环境,info
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定ymal格式的配置
# 配置文件名(data id):${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# nacos-config-client-dev.yaml
# 共享配置
shared-configs:
- application-${
spring.profiles.active}.${
spring.cloud.nacos.config.file-extension}
application.yml内容如下
server:
port: 3377
这两个配置文件合并起来的意思就是:到8848上面找一个名字为XXX.yaml的配置文件
配置文件加载的优先级(由高到低)
bootstrap.properties ->bootstrap.yml -> application.properties -> application.yml
(4)在Application启动类加入注解@SpringBootApplication
添加@EnableDiscoveryClient的注解
(5)创建业务类
@RestController
@RefreshScope//支持Nacos的动态刷新功能
public class ConfigClientController {
//可以从8848配置中心中读取到${config.info}的值
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
(6)给配置中心默认添加一个数据集 (Data Id)
在Nacos的配置列表中添加data id,这个id名称的命名规则如下,配置文件名(data id):
${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
1-spring.application.name的值在这里就是配置文件中的nacos-config-client
2-spring.profile.active的值就是dev
3-spring.cloud.nacos.config.file-extension的值就是yaml
4-所以最终的dataId的名称就是nacos-config-client-dev.yaml
加下来开始实操在Nacos中添加配置信息
然后点击发布就行了
(7)编写测试类在Controller类中通过@Value注解获取配置值
启动3377,然后调用接口查看配置信息:http://localhost:3377/config/info
(8)动态刷新@RefreshScope
通常会在Controller里边用@Value取出使用,但是你要是想改变他,就要重新改代码,打包,部署,十分麻烦,我们需要让配置文件的值变得动起来,Nacos也采用了Spring Cloud原生注解@RefreshScope实现配置自动更新。
在Nacos配置中心中修改配置的内容,然后在不重启3377的情况,重新访问接口查看3377获取到的配置信息有没有实时刷新
可以看到修改过后的配置信息已经实时刷新了,而且不需要重新服务
【3】Nacos作为配置中心-分类配置
(1)问题:多环境多项目管理
问题1:在实际开发中,通常一个系统会准备 dev开发环境、test测试环境、prod生产环境。如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
问题2:在一个大型分布式微服务系统中有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境等等。那怎么对这些微服务配置进行管理呢?
(2)Nacos的图形化管理界面
(3)Namespace+Group+DataID三者关系?为什么这么设计?
默认情况:Namespace=public, Group=DEFAULT_GROUP, 默认Cluster是DEFAULT
(4)案例
(1)将开发环境配置dev和测试环境配置test放在同一个分组Group(DEFAULT_GROUP)下面,命名空间namespace为默认的public
(2)将开发环境配置dev和测试环境配置test放在不同的分组,同一个命名空间中
创建配置文件DataID的时候,DataID是一样的,但是指定不同的分组,分别为TEST_GROUP和DEV_GROUP两个分组
创建完成后的效果如下
在bootstrap.xml配置文件中引入配置信息的方式,只需要多指明一个分组就可以了
(3)在不同的命名空间下面新建配置文件
首先新建命名空间
然后回到服务列表就可以看到上方多出来了两个刚刚创建好的命名空间,可以点进去查看分组和配置文件信息
在bootstrap.xml配置文件中指定命名空间
【4】mysql支持,持久化存储配置信息
在单机模式时nacos使用自带的嵌入式数据库derty实现数据的存储,不方便观察数据存储的基本情况,而且在集群情况下会出现数据不一致的情况。我们可以配置mysql数据库,可视化的查看数据的存储。
1、安装数据库,版本要求:5.6.5+
2、进入nacos安装包下的conf文件,找到nacos-mysql.sql文件,复制里面的sql脚本到mysql执行,会创建nacos-config库,专门用来存放nacos的配置信息
3、修改conf/application.properties文件增加mysql支持
# db mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=password
这个application.properties指nacos的解压目录nacos/conf目录下的文件
【四】集群部署(在Linux系统下搭建Nacos的集群)
【1】介绍
之前在使用Eureka的时候,如果要搭建集群就要启动好几个Eureka服务,让它们之间互相注册互相守望,而且还要添加Eureka的自我保护机制。现在换成Nacos不用手动创建和启动多个服务中心了,也屏蔽了自我保护机制。
如果只有一台Nacos,如果它挂了,那就没有备用的了,单点故障后整个系统都挂了,所以需要搭建集群模式。
在实际开发过程中,如果使用Nacos的话,为了确保高可用,我们一般都会对其进行集群的部署。Nacos规定集群中Nacos节点的数量需要大于等于3个;同时,单机模式下Nacos的数据默认保存在其内嵌数据库中,不方便观察数据存储的基本情况。而且如果集群中启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储;此外,我们还需要借助Nginx实现负载均衡。这一过程的部署架构图如下所示:
【2】Nacos下载Linux版
【3】Nginx配置
Nginx搭建和学习的笔记:Nginx的学习和搭建
(1)回到nginx安装目录,并且开始编辑配置文件nginx.conf,可以修改端口号
cd /usr/local/nginx/conf
(2)启动nginx服务
切换到/usr/local/nginx/sbin下面
执行启动命令
./nginx
(3)查看nginx服务是否启动成功
ps -ef | grep nginx
10-访问一下自己的服务器ip:http://192.168.19.11:9001/(因为之前已经配置了路由转发,会将9001转发到80端口)
【3】集群配置步骤(重点)
【4】测试
【5】高可用小总结
集群模式适用于生产环境需要依赖mysql,单机可不必,三个及以上Nacos节点才能构成集群。
1、在nacos的解压目录nacos/conf目录下,修改配置文件cluster.conf
192.168.100.101:8848
192.168.100.102:8848
192.168.100.103:8848
2、修改bootstrap.yml中的server-addr属性,添加对应集群地址。
server-addr: 192.168.100.101:8848,192.168.100.102:8848,192.168.100.103:8848
3、启动运行成功后显示如图表示成功。
【五】控制台使用
(1)服务管理
(1)服务列表管理
(2)服务流量权重支持及流量保护
Nacos为用户提供了流量权重控制的能力,同时开放了服务流量的阈值保护,以帮助用户更好的保护服务服务提供者集群不被意外打垮。如下图所以,可以点击实例的编辑按钮,修改实例的权重。如果想增加实例的流量,可以将权重调大,如果不想实例接收流量,则可以将权重设为0。
(3)服务元数据管理
Nacos提供多个维度的服务元数据的暴露,帮助用户存储自定义的信息。这些信息都是以K-V的数据结构存储,在控制台上,会以{“version”:“1.0”,“env”:“prod”}这样的格式展示。类似的,编辑元数据可以通过相同的格式进行。例如服务的元数据编辑,首先点击服务详情页右上角的“编辑服务”按钮,然后在元数据输入框输入:{“version”:“1.0”,“env”:“prod”}。
点击确认,就可以在服务详情页面,看到服务的元数据已经更新了。
服务优雅上下线
Nacos还提供服务实例的上下线操作,在服务详情页面,可以点击实例的“上线”或者“下线”按钮,被下线的实例,将不会包含在健康的实例列表里。
(2)配置管理
Nacos支持基于Namespace和Group的配置分组管理,以便用户更灵活的根据自己的需要按照环境或者应用、模块等分组管理微服务以及Spring的大量配置,在配置管理中主要提供了配置历史版本、回滚、订阅者查询等核心管理能力。
(1)配置的版本及一键回滚
Nacos基于Namespace帮助用户逻辑隔离多个命名空间,这可以帮助用户更好的管理测试、预发、生产等多环境服务和配置,让每个环境的同一个配置(如数据库数据源)可以定义不同的值。
(3)修改默认密码
修改用户名和密码,将ry-config中的user表username替换成你需要的登录账户,password改成你需要的密码,密码运行即可得到加密有算法。注意盐值是随机的,所以生成密码每次可能不一样,请不要担心。
public static void main(String[] args)
{
System.out.println(new BCryptPasswordEncoder().encode("ruoyi"));
}
(4)会话时间
默认会话保持时间为30分钟。30分钟后需要重新登录认证。 暂时不支持修改该默认时间。
【六】Nacos的实现原理
【1】Nacos的整体架构
【2】Nacos信息同步的几种方式
(1)push (服务端主动push)
(2)pull (客户端的轮询), 超时时间比较短
(3)long pull (超时时间比较长)
【3】Nacos作为配置中心的原理
nacos配置中心同步信息采用是:客户端 long pull 的方式
(1)Nacos 客户端会循环请求服务端变更的数据,并且超时时间设置为30s,当配置发生变化时,请求的响应会立即返回,否则会一直等到 29.5s+ 之后再返回响应
(2)客户端的请求到达服务端后,服务端将该请求加入到一个叫 allSubs 的队列中,等待配置发生变更时 DataChangeTask主动去触发,并将变更后的数据写入响应对象。
(3)与此同时服务端也将该请求封装成一个调度任务去执行,等待调度的期间就是等DataChangeTask 主动触发的,如果延迟时间到了 DataChangeTask 还未触发的话,则调度任务开始执行数据变更的检查,然后将检查的结果写入响应对象(基于文件的MD5)
【4】Nacos作为注册中心的原理
nacos注册中心采用了 :pull (客户端的轮询)和push (服务端主动push)
(1)客户端启动时会将当前服务的信息包含ip、端口号、服务名、集群名等信息封装为一个Instance对象,然后创建一个定时任务,每隔一段时间向Nacos服务器发送PUT请求并携带相关信息。
(2)nacos服务器端在接收到心跳请求后,会去检查当前服务列表中有没有该实例,如果没有的话将当前服务实例重新注册,注册完成后立即开启一个异步任务,更新客户端实例的最后心跳时间,如果当前实例是非健康状态则将其改为健康状态。
(3)心跳定时任务创建完成后,通过POST请求将当前服务实例信息注册进nacos服务器。
(4)nacos服务器端在接收到注册实例请求后,会将请求携带的数据封装为一个Instance对象,然后为这个服务实例创建一个服务Service,一个Service下可能有多个服务实例,服务在Nacos保存到一个ConcurrentHashMap中Map(namespace,Map(group::serviceName, Service));
(5)nacos将实例添加到对应服务列表中会根据AP和CP不同的模式,采用不同协议。
(6)nacos在更新完成之后,通过发布服务变化事件,将服务变动通知给客户端,采用的是UDP通信,客户端接收到UDP消息后会返回一个ACK信号,如果一定时间内服务端没有收到ACK信号,还会尝试重发,当超出重发时间后就不在重发。
(7)客户端通过定时任务定时从服务端拉取服务数据保存在本地缓存。
服务端在发生心跳检测、服务列表变更或者健康状态改变时会触发推送事件,在推送事件中会基于UDP通信将服务列表推送到客户端,虽然通过UDP通信不能保证消息的可靠抵达,但是由于Nacos客户端会开启定时任务,每隔一段时间更新客户端缓存的服务列表,通过定时轮询更新服务列表做兜底,所以不用担心数据不会更新的情况,这样既保证了实时性,又保证了数据更新的可靠性。
【5】心跳机制
服务的健康检查分为两种模式:
(1)客户端上报模式:客户端通过心跳上报的方式告知nacos 注册中心健康状态(默认心跳间隔5s,nacos将超过超过15s未收到心跳的实例设置为不健康,超过30s将实例删除)
(2)服务端主动检测:nacos主动检查客户端的健康状态(默认时间间隔20s,健康检查失败后会设置为不健康,不会立即删除)
为什么nacos有两种心跳机制?
(1)对于临时实例,健康检查失败,则直接删除。这种特性适合于需要应对流量突增的场景,服务可以弹性扩容,当流量过去后,服务停掉即可自动注销。
(2)对于持久化实例,健康检查失败,会设置为不健康状态。它的优点就是可以实时的监控到实例的健康状态,便于后续的告警和扩容等一系列处理。
【6】自我保护
nacos也有自我保护机制(当前健康实例数/当前服务总实例数),值为0-1之间的浮点类型。正常情况下nacos 只会健康的实例。单在高并发场景,如果只返回健康实例的话,流量洪峰到来可能直接打垮剩下的健康实例,产生雪崩效应。
保护阈值存在的意义在于当服务A健康实例数/总实例数 < 保护阈值时,Nacos会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,请求失败,但这样远比造成雪崩要好。牺牲了请求,保证了整个系统的可用。
简单来说不健康实例的另外一个作用:防止雪崩
如果所有的实例都是临时实例,当雪崩出现时,Nacos的阈值保护机制是不是就没有足够的(包含不健康实例)实例返回了,其实如果有部分实例是持久化实例,即便它们已经挂掉,状态为不健康,但当触发自我保护时,还是可以起到分流的作用。
【七】Nacos和Eureka的区别
【1】CAP理论
C一致性,A高可用,P分区容错性。
(1)eureka只支持AP
(2)nacos支持CP和AP两种
nacos是根据配置识别CP或AP模式,如果注册Nacos的client节点注册时是ephemeral=true即为临时节点,那么Naocs集群对这个client节点效果就是AP,反之则是CP,即不是临时节点
#false为永久实例,true表示临时实例开启,注册为临时实例
spring.cloud.nacos.discovery.ephemeral=true
【2】连接方式
(1)nacos使用的是netty和服务直接进行连接,属于长连接
(2)eureka是使用定时发送和服务进行联系,属于短连接
【3】服务异常剔除
(1)Eureka
Eureka client在默认情况每隔30s向Eureka Server发送一次心跳,当Eureka Server在默认连续90s秒的情况下没有收到心跳,会把Eureka client 从注册表中剔除,在由Eureka-Server 60秒的清除间隔,把Eureka client 给下线
EurekaInstanceConfigBean类下
private int leaseRenewalIntervalInSeconds = 30; //心跳间隔30s
private int leaseExpirationDurationInSeconds = 90; //默认90s没有收到心跳从注册表中剔除
EurekaServerConfigBean 类下
private long evictionIntervalTimerInMs = 60000L; //异常服务剔除下线时间间隔
也就是在极端情况下Eureka 服务 从异常到剔除在到完全不接受请求可能需要 30s+90s+60s=3分钟左右(还是未考虑ribbon缓存情况下)
(2)Nacos
nacos client 通过心跳上报方式告诉 nacos注册中心健康状态,默认心跳间隔5秒,
nacos会在超过15秒未收到心跳后将实例设置为不健康状态,可以正常接收到请求
超过30秒nacos将实例删除,不会再接收请求
【4】操作实例方式
(1)nacos:
提供了nacos console可视化控制话界面,可以对实例列表进行监听,对实例进行上下线,权重的配置,并且config server提供了对服务实例提供配置中心,且可以对配置进行CRUD,版本管理
(2)eureka:
仅提供了实例列表,实例的状态,错误信息,相比于nacos过于简单
【5】自我保护机制
相同点:保护阈值都是个比例,0-1 范围,表示健康的 instance 占全部instance 的比例。
不同点:
(1)保护方式不同
Eureka保护方式:当在短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。自我保护开关(eureka.server.enable-self-preservation: false)
Nacos保护方式:当域名健康实例 (Instance) 占总服务实例(Instance) 的比例小于阈值时,无论实例 (Instance) 是否健康,都会将这个实例 (Instance) 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例 (Instance) 能正常工作。
(2)范围不同
Nacos 的阈值是针对某个具体 Service 的,而不是针对所有服务的。但 Eureka的自我保护阈值是针对所有服务的。