1、服务注册
原理:Nacos客户端会通过发送REST请求的方式向Nacos服务端注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
2、服务心跳
原理:在服务注册后,Nacos客户端会定时发送心跳来持续通知Nacos服务端,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
3、服务同步
原理:Nacos server集群之间会互相同步服务实例,用来保证服务信息的一致性。
一般用的nginx来配置轮询策略(默认),在访问nacos集群。
4、服务发现
原理:服务消费者(Nacos客户端)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面 注册的服务清单,并且缓存在Nacos客户端本地,同时会在Nacos客户端本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。
简而言之:每个注册到了nacos上面的服务,都会定时去拉取nacos已经注册了的服务的清单,缓存到本地。
5、服务健康检查
原理:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳 的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册。
简而言之:服务端超过15秒没收到客户端的心跳,则会把服务设置成下线模式。如下图1。超过30秒,则会之间把服务从列表中剔除。如图2。如果重新发送心跳,则重新注册。
图1
图2
6、默认的负载均衡实现
默认用的Ribbon实现。
7、临时实例/永久实例
临时实例:即当服务宕机了,超过30秒,则会从服务列表中剔除。
永久实例:即当服务宕机了,永远不会从服务列表中剔除。
对于每一个注册的服务而言,默认都是临时实例,即spring.cloud.nacos.discovery.ephemeral = true。
###设置成永久实例,如下图。
即spring.cloud.nacos.discovery.ephemeral = false。
8、雪崩保护
对于每一个服务而言,都有保护阈值的设置。
健康实例数/总实例数 < 保护阈值。
例:一个服务,总共有两个实例,保护阈值设置的是0.6。
此时挂了一个实例,则0.5< 0.6,此时当你去访问的时候,下线的那个实例依旧会被访问到,强行征用。
这样可以防止洪峰流量到来的时候,服务不够用,全线崩溃。
9、特性
目前使用的这个版本,可以不用在启动类上加@EnableDiscoveryClient注解了,只要引入了这个nacos这个依赖,就会自动开启服务注册与发现。
10、负载均衡机制
Nacos默认使用的Ribbon作负载均衡,只需要在启动类用@LoadBalanced注解
实现restTemplate就可以了,如下图:
11、注册服务
服务注册到nacos中,不仅仅需要在配置文件中配置相对应的地址,账号密码,
还需要在对应的服务中引入如下依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
不然,nacos注册中心里一直注册失败。