免费建设网站赚钱,中国设计最好的网站,郑州网站建设项目,国内哪些网站是php做的nacos官方文档地址#xff1a;nacos官方文档
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 简单来说#xff0c;nacos就是一个注册中心、配置中心#xff0…nacos官方文档地址nacos官方文档
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 简单来说nacos就是一个注册中心、配置中心这篇博客我们主要来学习nacos作为注册中心在业务应用启动的时候是如何将当前业务应用的信息注册到nacos中的
注册中心源码
首先在 我们的业务应用中在使用nacos的时候需要引入nacos相关的jar包
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdversion${latest.version}/version
/dependency在这个jar包中我们看spring.factories这个文件中自动注入的bean有哪些主要看第一个因为下面几个看起来都和注册中心没有关系 在这个bean中会通过Bean的形式注入了三个bean这三个bean是极其重要的☆☆☆这个打个星
在介绍这三个bean之前需要先介绍一个bean org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration#onApplicationEvent AbstractAutoServiceRegistration
这个bean是监听了WebServerInitializedEvent事件在监听到这个事件之后会进行一些列的逻辑我们来看下 主要关注这里的register()方法
protected void register() {this.serviceRegistry.register(getRegistration());
}getRegistration()
可以看到在register()方法中只有一行代码但是这里是核心的逻辑
我们先看getRegistration()的逻辑 com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration#getRegistration 可以看到这里在getRegistration()注册信息的时候实际上是通过构造函数传进来的这里的构造函数可以看下前面打星的地方(☆☆☆)
this.serviceRegistry.register
在这里我们可以看到是根据入参的registration从这个对象中获取到对应的instance信息然后调用nameService的registerInstance()方法这里的serviceRegistry的实现类是 com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register 从registration中获取到当前的ip和端口 这里我们知道最后会通过namingService进行服务注册如果我们点进去我们会发现namingService实际上已经是nacos-api的类了 com.alibaba.nacos.client.naming.NacosNamingService#registerInstance(java.lang.String, com.alibaba.nacos.api.naming.pojo.Instance) 可以看到这里会开启一个心跳然后继续调用serviceProxy的注册方法
注册心跳: 会发现这里注册心跳使用的是ScheduledExecutorService.schedule()方法我们知道schedule方法只会执行一次按道理来讲既然是心跳服务那一定是需要定时去发送心跳的我们接着来看下这里的task 会发现在task方法中执行了之后会继续调用schedule方法触发下次调用
在namingProxy的registerService()方法中会构建一个http请求去调用nacos服务端的代码这里服务端是如何处理的暂时先不关心后面单独起博客去记录
回归到NacosDiscoveryAutoConfiguration
我们再把思路拉会到这个bean中这个bean中注入的三个bean分别是 NacosAutoServiceRegistration别名A类 NacosRegistration别名B类 NacosServiceRegistry别名C类 为了便于描述这三个bean之间的关系我们分别命名别名为A、B、C类
根据前面的代码我们会发现在注册的过程中实际上就是通过这个类中注入的三个bean来完成注册的
先说结论实际上是A类会监听WebServerInitializedEvent在监听到这个事件之后会通过B类获取到当前业务系统的ip和端口信息最后去调度通过C类的注册方法完成服务的注册
NacosAutoServiceRegistration
会发现这个类继承了AbstractAutoServiceRegistration这个类的作用可以看博客的开头
NacosRegistration
我们发现在使用NacosRegistration.getPort()的时候是通过nacosDiscoveryProperties对象获取的 nacosDiscoveryProperties是通过构造函数注入的所以我们接着往上看 最终我们会发现是通过解析配置文件中以spring.cloud.nacos.discovery开头的配置信息 这也是nacos官网告诉我们在配置文件中要这样配置的原因
NacosServiceRegistry
这个类可以看 this.serviceRegistry.register 这一小节不再阐述
总结
对于nacos注册中心业务应用是如何注册的再总结下
在应用启动之前我们需要引入springcloud-nacos相关的jar包在jar包中会通过springboot自动注入的功能注入了NacosRegistration、NacosServiceRegistry、NacosAutoServiceRegistration这三个bean其中NacosAutoServiceRegistration是继承了spring-cloud-common中的一个abstract类在这个抽象类中spring-cloud会定义好服务注册的流程(简单来说就是监听到WebServerInitializedEvent事件之后会调用serviceRegistry.register()方法方法的入参是通过registration类来获取的)spring-cloud-common中定义了注册的规则至于底层的实现是nacos还是zookeeper还是其他注册中心springcloud不关心业务引入的是哪个类型的注册中心这里就会调用对应的实现类去注册所谓的注册实际上在和nacos交互的时候会通过http请求的方式去交互