欢迎关注方志朋的博客,回复”666“获面试宝典

来源:https://blog.csdn.net/cold___play/article/details/108032204

Nacos架构

  • Provider APP:服务提供者

  • Consumer APP:服务消费者

  • Name Server:通过VIP(Virtual IP)或DNS的方式实现Nacos高可用集群的服务路由

  • Nacos Server:Nacos服务提供者,里面包含的Open API是功能访问入口,Conig Service、Naming Service 是Nacos提供的配置服务、命名服务模块。Consitency Protocol是一致性协议,用来实现Nacos集群节点的数据同步,这里使用的是Raft算法(Etcd、Redis哨兵选举)

  • Nacos Console:控制台

注册中心的原理

  • 服务实例在启动时注册到服务注册表,并在关闭时注销

  • 服务消费者查询服务注册表,获得可用实例

  • 服务注册中心需要调用服务实例的健康检查API来验证它是否能够处理请求

SpringCloud完成注册的时机

在Spring-Cloud-Common包中有一个类org.springframework.cloud. client.serviceregistry .ServiceRegistry ,它是Spring Cloud提供的服务注册的标准。集成到Spring Cloud中实现服务注册的组件,都会实现该接口。

该接口有一个实现类是NacoServiceRegistry。

SpringCloud集成Nacos的实现过程:

在spring-clou-commons包的META-INF/spring.factories中包含自动装配的配置信息如下:

其中AutoServiceRegistrationAutoConfiguration就是服务注册相关的配置类:

在AutoServiceRegistrationAutoConfiguration配置类中,可以看到注入了一个AutoServiceRegistration实例,该类的关系图如下所示。

可以看出, AbstractAutoServiceRegistration抽象类实现了该接口,并且最重要的是NacosAutoServiceRegistration继承了AbstractAutoServiceRegistration。

看到EventListener我们就应该知道,Nacos是通过Spring的事件机制继承到SpringCloud中去的。

AbstractAutoServiceRegistration实现了onApplicationEvent抽象方法,并且监听WebServerInitializedEvent事件(当Webserver初始化完成之后) , 调用this.bind ( event )方法。

最终会调用NacosServiceREgistry.register()方法进行服务注册。

NacosServiceRegistry的实现 在NacosServiceRegistry.registry方法中,调用了Nacos Client SDK中的namingService.registerInstance完成服务的注册。

跟踪NacosNamingService的registerInstance()方法:

通过beatReactor.addBeatInfo()创建心跳信息实现健康检测, Nacos Server必须要确保注册的服务实例是健康的,而心跳检测就是服务健康检测的手段。

serverProxy.registerService()实现服务注册

心跳机制:

从上述代码看,所谓心跳机制就是客户端通过schedule定时向服务端发送一个数据包 ,然后启动-个线程不断检测服务端的回应,如果在设定时间内没有收到服务端的回应,则认为服务器出现了故障。Nacos服务端会根据客户端的心跳包不断更新服务的状态。

注册原理:

Nacos提供了SDK和Open API两种形式来实现服务注册。

Open API:

SDK:

这两种形式本质都一样,底层都是基于HTTP协议完成请求的。所以注册服务就是发送一个HTTP请求:

在这里插入图片描述

对于nacos服务端,对外提供的服务接口请求地址为nacos/v1/ns/instance,实现代码咋nacos-naming模块下的InstanceController类中:

在这里插入图片描述
  • 从请求参数汇总获得serviceName(服务名)和namespaceId(命名空间Id)

  • 调用registerInstance注册实例

  • 创建一个控服务(在Nacos控制台“服务列表”中展示的服务信息),实际上是初始化一个serviceMap,它是一个ConcurrentHashMap集合

  • getService,从serviceMap中根据namespaceId和serviceName得到一个服务对象

  • 调用addInstance添加服务实例

  • 根据namespaceId、serviceName从缓存中获取Service实例

  • 如果Service实例为空,则创建并保存到缓存中

  • 通过putService()方法将服务缓存到内存

  • service.init()建立心跳机制

  • consistencyService.listen实现数据一致性监听

    service.init ( ) 方法的如下图所示,它主要通过定时任务不断检测当前服务下所有实例最后发送心跳包的时间。如果超时,则设置healthy为false表示服务不健康,并且发送服务变更事件。在这里请大家思考一一个问题,服务实例的最后心跳包更新时间是谁来触发的?实际上前面有讲到, Nacos客户端注册服务的同时也建立了心跳机制。

putService方法,它的功能是将Service保存到serviceMap中:

继续调用addInstance方法把当前注册的服务实例保存到Service中:

总结:

Nacos客户端通过Open API的形式发送服务注册请求 Nacos服务端收到请求后,做以下三件事:构建一个Service对象保存到ConcurrentHashMap集合中 使用定时任务对当前服务下的所有实例建立心跳检测机制 基于数据一致性协议服务数据进行同步 服务提供者地址查询 Open API:

SDK:

InstanceController中的list方法:

  • 解析请求参数

  • 通过doSrvIPXT返回服务列表数据

  • 根据namespaceId、serviceName获得Service实例

  • 从Service实例中基于srvIPs得到所有服务提供者实例

  • 遍历组装JSON字符串并返回

Nacos服务地址动态感知原理

可以通过subscribe方法来实现监听,其中serviceName表示服务名、EventListener表示监听到的事件:

具体调用方式如下:

或者调用selectInstance方法,如果将subscribe属性设置为true,会自动注册监听:

Nacos客户端中有一个HostReactor类,它的功能是实现服务的动态更新,基本原理是:

  • 客户端发起时间订阅后,在HostReactor中有一个UpdateTask线程,每10s发送一次Pull请求,获得服务端最新的地址列表

  • 对于服务端,它和服务提供者的实例之间维持了心跳检测,一旦服务提供者出现异常,则会发送一个Push消息给Nacos客户端,也就是服务端消费者

  • 服务消费者收到请求之后,使用HostReactor中提供的processServiceJSON解析消息,并更新本地服务地址列表

    热门内容:最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
    明天见(。・ω・。)ノ♡
    
    • 居然有人提问“国家何时整治程序员的高薪现象”?

    • Spring官宣新家族成员:Spring Authorization Server!

    • 21 款 yyds 的 IDEA插件

    • Lombok!代码简洁神器还是代码“亚健康”元凶?

Nacos实现原理详解相关推荐

  1. SpringCloudAlibaba:Nacos实现原理详解

    欢迎关注方志朋的博客,回复"666"获面试宝典 Nacos 架构 Provider APP:服务提供者 Consumer APP:服务消费者 Name Server:通过VIP(V ...

  2. 微服务注册中心 Nacos 实现原理详解!

    Nacos 架构 Provider APP:服务提供者 Consumer APP:服务消费者 Name Server:通过VIP(Virtual IP)或DNS的方式实现Nacos高可用集群的服务路由 ...

  3. Nacos如何实现Raft算法与Raft协议原理详解

    前言 大名鼎鼎的Paxos算法可能不少人都听说过,几乎垄断了一致性算法领域,在Raft协议诞生之前,Paxos几乎成了一致性协议的代名词.但是对于大多数人来说,Paxos算法太难以理解了,而且难以实现 ...

  4. 一致性哈希算法原理详解

    一.普通 hash 算法 (取模算法): 在了解一致性哈希算法之前,我们先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那 ...

  5. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  6. LVS原理详解(3种工作方式8种调度算法)--老男孩

    一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...

  7. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  8. nginx配置文件及工作原理详解

    nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...

  9. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

最新文章

  1. apache 源代码安装
  2. linux 安装 apache+mysql+php
  3. python haskell 使用对比_性能-为什么这个Haskell程序比等效的Python程序慢得多?
  4. MFC和OpenCV结合
  5. sharepoint安装心得_过程
  6. SendMessage
  7. WinFrm程序使用的图片展示控件.带删除的
  8. Spring中异步注解@Async的使用、原理及使用时可能导致的问题
  9. 信息安全系统设计基础第八周期中学习总结—20135227黄晓妍
  10. 如何做到免驱打印_证卡打印机云打印方案
  11. 外媒:已有5家芯片厂商获准继续向华为供货
  12. SourceInsight初学使用笔记
  13. mysql 中 unix_timestamp和from_unixtime 时间戳函数
  14. Oracle数户库、表导入导出
  15. ThinkPad E550 Catalina用OC换Clover引导的过程(支持Mac Update)
  16. 怎么更改计算机上的限制应用,图文详解通过修改win10系统组策略实现限制指定应用程序的运行-系统操作与应用 -亦是美网络...
  17. 行业研究方法与框架合集
  18. 陈春花:创造价值 做好产品
  19. 打开Excel2007都提示向程序发送命令时出现问题的解决办法
  20. 天龙八部手游服务器维护公告,天龙八部手游 近期更新维护公告

热门文章

  1. C++忽略第三方库的警告
  2. java内存泄漏问题排查
  3. 控制输入框只能输入数字
  4. android中的回调
  5. js url传值中文乱码完美解决(JAVA)
  6. python中的单例模式
  7. 【BZOJ 3879】SvT
  8. test markdown
  9. 解决ubuntu上opengl的问题
  10. iOS 的本地化使用和创建过程