Spring Cloud-Nacos知识点学习总结

一.Nacos 服务注册和服务发现核心功能

  • 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中
  • 服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
  • 服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。 leader raft
  • 服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存
  • 服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)

二.Nacos和Eureka的区别有哪些

  • 接口方式:Nacos与Eureka都对外暴露REST风格的API接口,用来实现服务注册;
  • 实例类型:Nacos的实例有永久实例和临时实例之分;Eureka只支持临时实例;
  • 健康检测:Nacos对临时实例采用心跳模式检测,对永久实例采用主动请求HTTp方式来检测;Eureka只支持心跳模式;
  • 服务发现:Nacos支持定时拉取和订阅推送两种模式;Eureka只支持定时拉取模式。
    Nacos的服务发现功能有两种实现方式:
    • 一种是客户端主动请求服务端拉取注册的实例,第一种主动拉取的模式比较简单其实就是客户端发起拉取请求之后然后服务端根据请求的内容去双层map结构中找到对应的注册实例返回给客户端;
    • 另一种是客户端对服务端进行订阅之后,当服务端注册的实例发生变更之后,服务端会通过UDP套接字主动推送注册实例给客户端。第二种方式则比较复杂,需要服务端去进行数据的推送,和客户端的订阅。

三.Nacos注册表的构成

在这里插入图片描述
在这里插入图片描述

四.Nacos对于高并发问题的解决

  1. Nacos内部接收到注册的请求,不会立即写数据,而是将服务注册的任务放入一个BlockQuery(阻塞队列)就立即相应给客户端;
  2. 这样相当于客户端发送了一个异步请求
  3. 然后Nacos利用线程池读取阻塞队列中的任务,异步从队列中读取实例进行注册更新,这样就提高了承受高并发量的能力;

五. Nacos解决并发读写冲突问题

  • 这里的并发指的是同一Service下的多线程的并发读写;

  • 对于多个Service,Nacos已事先完成了环境隔离,各Service的读写互不影响;

  1. 并发读读

    读读不会存在不一致问题,无需解决

  2. 并发读写

    Nacos在更新实例列表时,采用CopyOnWrite技术,首先将旧的实例列表拷贝一份,然后更新拷贝的实例列表,再用更新后的实例列表来覆盖旧的实例列表

    并发读取时是读取旧实例列表内容,这样避免了并发脏读的产生。

  3. 并发写写

    扫描二维码关注公众号,回复: 15326783 查看本文章

    Nacos底层原码实现更新实例列表方法时,对于更新实例时加上了synchronized同步代码块的方式进行了加锁操作,从而保证并发写写的一致性。

猜你喜欢

转载自blog.csdn.net/zhangkai__/article/details/127837509