IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【Spring Cloud 】 Nacos 服务注册过程 源码 -> 正文阅读

[Java知识库]【Spring Cloud 】 Nacos 服务注册过程 源码

1.Nacos客户端依赖项目版本

2.2.2.RELEASE

2. @EnableDiscoveryClient 控制服务注册功能

开启nacos客服端的服务注册需要在主启动类上添加 @EnableDiscoveryClient 注解

我们先看下 这个注解干了什么事情

image-20220328192658892

有一个属性 boolean autoRegister() default true; 且默认值是 true 也就是默认开启服务的自动注册

导入了一个 EnableDiscoveryClientImportSelector 选择器组件

继承了 SpringFactoryImportSelector ,看下它的的 selectImports方法

image-20220328205620753

从注解的属性中拿到 autoRegister 的值 默认为true 如果为true 则往容器中添加

org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration

image-20220328205907264

@EnableConfigurationProperties({AutoServiceRegistrationProperties.class})

使 AutoServiceRegistrationProperties 配置类生效

image-20220328193229478

都是有默认值的

也就是说 @EnableDiscoveryClient 注解可以不加 也能正常注册服务

如果添加了 @EnableDiscoveryClient 注解,并且给属性 autoRegister 设置值为 false 则不会添加nacos服务

或者可以设置

spring.cloud.service-registry.auto-registration.enabled= false   ///默认值为 true

3.自动配置机制

image-20220328193250359

  com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\
  com.alibaba.cloud.nacos.ribbon.RibbonNacosAutoConfiguration,\
  com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\
  com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\
  com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
  com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration,\
  com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\
  com.alibaba.cloud.nacos.NacosServiceAutoConfiguration

其中添加了一个 NacosServiceRegistryAutoConfiguration 自动配置类

4. NacosServiceRegistryAutoConfiguration

image-20220328193354641

new NacosAutoServiceRegistration 对象

跟进去 NacosAutoServiceRegistration 类

5.NacosAutoServiceRegistration

com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration

public class NacosAutoServiceRegistration
      extends AbstractAutoServiceRegistration<Registration> 

继承了 AbstractAutoServiceRegistration 抽象类

体系结构如图

image-20220328193627564

image-20220328193824377

先初始化了父类 点进 super(serviceRegistry, autoServiceRegistrationProperties) 方法

注意调用父类构造方法的这个配置信息类 如果没有添加 @EnableDiscoveryClient 注解 容器中是不会有 AutoServiceRegistrationProperties 实例的

image-20220328193956208

6.AbstractAutoServiceRegistration

org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration

image-20220328194128411

注意这个抽象类实现了 ApplicationListener接口 重写了改接口的 void onApplicationEvent(E event) 方法 可以对Spring容器的启动事件进行监听 并且这里指定了类型 ApplicationListener

image-20220328194634156

org.springframework.boot.web.context.WebServerInitializedEvent

也就是监听WebServer的事件

6.1 onApplicationEvent 方法

回到 onApplicationEvent 方法 看下 AbstractAutoServiceRegistration.onApplicationEvent监听事件方法做了什么事

image-20220328195019756

调用了本类的 bind 方法

6.2 bind 方法

image-20220328195615271

在改方法中 将当前AbstractAutoServiceRegistration对象 port属性通过cas改成了 web容器的端口号

然后调用了 当前对象的start方法

6.3 start方法

image-20220328200113667

6.4 register()方法

image-20220328200134343

调用了 ServiceRegistry.register方法

ServiceRegistry是一个接口 只有一个实现类 NacosServiceRegistryimage-20220328200444670

7.NacosServiceRegistry

com.alibaba.cloud.nacos.registry.NacosServiceRegistry

7.1 register 方法

image-20220328201004426

简单看下 getNacosInstanceFromRegistration 生成 Instance

image-20220328201213381

image-20220328201406601

调用了 NamingService.registerInstance 方法

NamingService同样是一个接口 也只有一个实现类 NacosNamingService

8. NacosNamingService

8.1 registerInstance 方法

image-20220328201514946

调用了 serverProxy.registerService

这个 serverProxy 类型是 NamingProxy

9.NamingProxy

com.alibaba.nacos.client.naming.net.NamingProxy

9.1 registerService 方法

看下这个方法干了什么事情

image-20220328201814165

new 了一个 HashMap 自动初始化容器为16 封装了 11个参数 为什么11个参数设置默认大小为16 2?? hashmap的容量是2的幂次方

最后调用本类的 reqApi 方法

注意调用该方法传的三个参数

  1. `UtilAndComs.nacosUrlInstance 常量类 此处值为 /nacos/v1/ns/instance

image-20220328202229020

  1. `params

? hashmap封装的参数

  1. `“POST”

    ? 简单的一个字符串 具体什么用看方法内干了什么

9.2 reqApi 方法

image-20220328202435324

调用了本类的重载方法

image-20220328203144550

调用了 本类的 callServer 方法

9.3callServer 方法

image-20220328203953073

最后调用了本类的 nacosRestTemplate.exchangeForm(url, header, params, body, method, String.class) 方法

nacosRestTemplate 的类型为 NacosRestTemplate

10 NacosRestTemplate

最终发送请求

image-20220328204214330

记住 发送请求的地址 http://xxxx:8848/nacos/v1/ns/instance

至此 Nacos客户端服务的注册流程结束

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:09:58  更:2022-03-30 18:11:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:29:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码