首页 > 其他分享 >nacos 服务注册原理

nacos 服务注册原理

时间:2024-08-15 17:30:24浏览次数:6  
标签:spring request nacos alibaba 注册 原理 com cloud

springboot 的各种 starter 会根据 SPI 机制,读取 META-INFO/spring.factories 文件,自动注册一些 bean,spring-cloud-starter-alibaba-nacos-discovery 的 spring.factories 如下:

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
  com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration
org.springframework.boot.SpringApplicationRunListener=\
  com.alibaba.cloud.nacos.logging.NacosLoggingAppRunListener

发现并没有自动配置的自动装配的类?wtf?

从 spring boot2.7开始,慢慢不支持 META-INF/spring.factories 文件了,需要导入的自动配置类可以放在
/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,我这是 springcloud2023 版本,对应是 spring3.x 所以要看 META-INF/spring 下的文件

com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration
com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration
com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration
com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration
com.alibaba.cloud.nacos.discovery.NacosDiscoveryHeartBeatConfiguration
com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration
com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration
com.alibaba.cloud.nacos.loadbalancer.LoadBalancerNacosAutoConfiguration
com.alibaba.cloud.nacos.NacosServiceAutoConfiguration
com.alibaba.cloud.nacos.util.UtilIPv6AutoConfiguration

NacosServiceRegistryAutoConfiguration 主要看这个,这个类上面有一些注解,装配了 3 个 bean,这是 spring 的知识,可以翻翻前面的文章,这里就不赘述了,只要看 NacosAutoServiceRegistration 这个 bean(名字中带有 auto,意义也是一样的,完成自动注册)

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
@ConditionalOnNacosDiscoveryEnabled
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
		matchIfMissing = true)
@AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
		AutoServiceRegistrationAutoConfiguration.class,
		NacosDiscoveryAutoConfiguration.class })
public class NacosServiceRegistryAutoConfiguration {

    // 注册服务
	@Bean
	public NacosServiceRegistry nacosServiceRegistry(
			NacosServiceManager nacosServiceManager,
			NacosDiscoveryProperties nacosDiscoveryProperties) {
		return new NacosServiceRegistry(nacosServiceManager, nacosDiscoveryProperties);
	}

	@Bean
	@ConditionalOnBean(AutoServiceRegistrationProperties.class)
	public NacosRegistration nacosRegistration(
			ObjectProvider<List<NacosRegistrationCustomizer>> registrationCustomizers,
			NacosDiscoveryProperties nacosDiscoveryProperties,
			ApplicationContext context) {
		return new NacosRegistration(registrationCustomizers.getIfAvailable(),
				nacosDiscoveryProperties, context);
	}

    // 触发注册
	@Bean
	@ConditionalOnBean(AutoServiceRegistrationProperties.class)
	public NacosAutoServiceRegistration nacosAutoServiceRegistration(
			NacosServiceRegistry registry,
			AutoServiceRegistrationProperties autoServiceRegistrationProperties,
			NacosRegistration registration) {
		return new NacosAutoServiceRegistration(registry,
				autoServiceRegistrationProperties, registration);
	}

}

这里只能知道注册了 3 个 bean,bean 的功能是啥现在也不知道,点进去看一下会发现:NacosAutoServiceRegistration 实现了一个接口 ApplicationListener<WebServerInitializedEvent>。事件监听也回去看看之前的文章,作用是 spring 容器启动会回调 AbstractAutoServiceRegistration#onApplicationEvent() 这个方法,这个方法源码调用链如下

com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register 看下注册到 nacos 的服务信息

继续看下调用链

requestServer 方法如下

private <T extends Response> T requestToServer(AbstractNamingRequest request, Class<T> responseClass) throws NacosException {
    Response response = null;

    try {
        request.putAllHeader(this.getSecurityHeaders(request.getNamespace(), request.getGroupName(), request.getServiceName()));
        // rpc 请求发送到 nacos 服务端,没必要往下跟了,接下来就是看 nacos 怎么处理接收到的服务注册请求
        response = this.requestTimeout < 0L ? this.rpcClient.request(request) : this.rpcClient.request(request, this.requestTimeout);
    ...
}

服务端后续补充,https://blog.csdn.net/Weixiaohuai/article/details/135654876 这个文章写的很不错

标签:spring,request,nacos,alibaba,注册,原理,com,cloud
From: https://www.cnblogs.com/cyrushuang/p/18301303

相关文章

  • OpenFeign 服务注册和调用原理
    Feign注册到容器和springboot自动配置原理类似,在springboot启动时会扫描到EnableFeignClients注解,这个注解导入了一个FeignClientsRegistrar类@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(FeignClientsRegistrar.class)publi......
  • 三步搞清楚华为路由器配置文件保存原理
    要想搞清楚华为路由器临时配置和永久性配置,其实这个问题非常简单。所谓设备flash可以看成被精简后的Linux操作系统,如果是有Linux基础的朋友会更加容易理解。在用户模式下甚至连基础命令都和Linux一样,这样看起来非常容。在Linux中各类服务配置要想永久生效,都必须修改配置文件......
  • 易优User登录注册标签-Eyoucms标签手册
    user登录注册入口标签[基础用法]名称:user功能:动态显示登录、注册、退出、会员中心的入口;语法:{eyou:usertype='login'}<ahref="{$field.url}"id="{$field.id}">登录</a>{$field.hidden}{/eyou:user}参数:type=''标签类型-......
  • Windows通过dynv6提供免费的IPv6动态域名解析(DDNS)服务(注册服务的方式运行)
    Dynv6IPv6Updater项目简介特性使用方法环境依赖运行脚本参数说明示例日志输出Windows服务注册步骤1:下载并安装NSSM步骤2:准备Python环境和脚本步骤3:使用NSSM注册服务步骤4:启动服务并验证步骤5:设置日志记录(可选)步骤6:重启系统并验证附:以下为帮......
  • 高性能无锁队列 Disruptor 核心原理分析及其在i主题业务中的应用
    一、i主题及Disruptor简介i主题是vivo旗下的一款主题商店app,用户可以通过下载主题、壁纸、字体等,实现对手机界面风格的一键更换和自定义。Disruptor是英国外汇交易公司LMAX开发的一个高性能的内存队列(用于系统内部线程间传递消息,不同于RocketMQ、Kafka这种分布式消息......
  • 高性能无锁队列 Disruptor 核心原理分析及其在i主题业务中的应用
    作者:来自vivo互联网服务器团队-LiWanghong本文首先介绍了Disruptor高性能内存队列的基本概念、使用Demo、高性能原理及源码分析,最后通过两个例子介绍了Disruptor在i主题业务中的应用。一、i主题及Disruptor简介i主题是vivo旗下的一款主题商店app,用户可以通过下......
  • Kubernetes(k8s)基础及原理
    什么是Kubernetes(k8s)Kubernetes是一个开源的容器编排系统,用于自动化地部署、扩展和管理容器化应用程序。Kubernetes源自谷歌内部的Borg系统,旨在实现容器化应用的高效管理。它提供了服务发现、负载均衡、自动扩缩容等功能,并支持跨主机的容器管理。Kubernetes的设计以“一切......
  • “Datawhale x魔搭 AI夏令营”-AIGC方向-Day2从零入门AI生图原理&实践
    学习内容提要从通过代码实现AI文生图逐渐进阶,教程偏重图像工作流、微调、图像优化等思路,最后会简单介绍AIGC应用方向、数字人技术(选学)Task02:精读代码,实战进阶具体Datawhale教程学习内容见链接:https://linklearner.com/activity/14/10/32AIGC相关知识框图解读baseline代码文......
  • zabbix-自动注册
    一、自动注册原理自动注册,主要是Agent主动向zabbixserver注册;自动注册主要分为两个步骤:自动注册,客户端必须开启主动模式,并设定主机名在zabbixweb的告警-->动作-->自动注册动作,创建一个动作二、自动注册实践根据不同的主机名称或主机元数据关联不同的模板1、配置Ag......
  • 深入理解 ThreadLocal:机制、原理与实践
    引言ThreadLocal是Java中一个非常重要的工具,广泛用于解决多线程环境下变量共享的问题。然而,ThreadLocal的使用也可能带来一些隐患,尤其是在结合线程池的场景中,可能导致数据混乱。本文将深入探讨ThreadLocal的工作机制及其可能带来的问题,并给出相应的解决方案。一、Thr......