Spring Cloud集成Nacos服务发现源码解析?翻了三套源码,保质保鲜!

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Spring Cloud集成Nacos服务发现源码解析?翻了三套源码,保质保鲜!

前言

前面文章我们介绍了Nacos的功能及设计架构,这篇文章就以Nacos提供的服务注册功能为主线,来讲解Nacos的客户端是如何在Spring Cloud进行集成和实现的。

本会配合源码分析、流程图整理、核心API解析等维度来让大家深入浅出、系统的来学习。

Spring Boot的自动注册

故事要从头Spring Boot的自动注入开始。很多朋友大概都了解过Spring Boot的自动配置功能,而Spring Cloud又是基于Spring Boot框架的。

因此,在学习Nacos注册业务之前,我们先来回顾一下Spring Boot的自动配置原理,这也是学习的入口。

Spring Boot通过@EnableAutoConfiguration注解,将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

上述过程是通过@Import(AutoConfigurationImportSelector.class)导入的配置功能,AutoConfigurationImportSelector中的方法getCandidateConfigurations,得到待配置的class的类名集合,即所有需要进行自动配置的(xxxAutoConfiguration)类,这些类配置于META-INF/spring.factories文件中。

最后,根据这些全限定名类上的注解,如:OnClassCondition、OnBeanCondition、OnWebApplicationCondition条件化的决定要不要自动配置。

了解了Spring Boot的基本配置之后,我们来看看Nacos对应的自动配置在哪里。

Spring Cloud中的Nacos自动配置

查看Spring Cloud的项目依赖,本人引入依赖对应的jar包为spring-cloud-starter-alibaba-nacos-discovery-2021.1.jar;

对应的pom依赖为:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

查看jar包中META-INF/spring.factories文件的内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  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.reactive.NacosReactiveDiscoveryClientConfiguration,\
  com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\
  com.alibaba.cloud.nacos.NacosServiceAutoConfiguration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
  com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration

可以看到EnableAutoConfiguration类对应了一系列的Nacos自动配置类。

其中NacosServiceRegistryAutoConfiguration是用来封装实例化Nacos注册流程所需组件的,装载了对三个对象NacosServiceRegistry、NacosRegistration、NacosAutoServiceRegistration,这三个对象整体都是为了Nacos服务注册使用的。

@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(
      NacosDiscoveryProperties nacosDiscoveryProperties) {
    return new NacosServiceRegistry(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);
  }
}

其中NacosServiceRegistry封装的就是注册流程,它继承自ServiceRegistry:

public class NacosServiceRegistry implements ServiceRegistry<Registration> {...}

查看该类源码,可以看到该类中实现了服务注册、注销、关闭、设置状态、获取状态5个功能。

我们要追踪的服务注册功能,便是通过它提供的register方法来实现的。

至此,我们可以梳理一下Nacos客户端在Spring Cloud中集成并实例化的处理流程。 image.png

Spring Cloud的ServiceRegistry接口

上面提到NacosServiceRegistry集成自ServiceRegistry,那么ServiceRegistry又是何方神圣呢?

ServiceRegistry接口是Spring Cloud的类,来看一下ServiceRegistry接口的定义:

public interface ServiceRegistry<R extends Registration> {
  void register(R registration);
  void deregister(R registration);
  void close();
  void setStatus(R registration, String status);
  <T> T getStatus(R registration);
}

可以看出ServiceRegistry接口中定义了服务注册、注销、关闭、设置状态、获取状态五个接口。

如果看其他服务发现框架对Spring Cloud进行集成时,基本上都是实现的这个接口。也就是说,ServiceRegistry是Spring Cloud提供的一个服务发现框架集成的规范。对应的框架安装规范实现对应的功能即可进行集成。image.png我们可以看到Eureka、Zookeeper、Consul在Spring Cloud中集成也都是实现了该接口,同时,如果你需要自定义服务发现功能,也可以通过实现该接口来达到目的。

NacosServiceRegistry服务注册实现

暂且不关注其他的辅助类,直接来看NacosServiceRegistry#register方法,它提供了服务注册的核心业务逻辑实现。

我们把该类的辅助判断去掉,直接展示最核心的代码如下:

@Override
public void register(Registration registration) {
    // 获取NamingService
  NamingService namingService = namingService();
  String serviceId = registration.getServiceId();
  String group = nacosDiscoveryProperties.getGroup();
    // 构造实例,封装信息来源于配置属性
  Instance instance = getNacosInstanceFromRegistration(registration);
    // 将实例进行注册
  namingService.registerInstance(serviceId, group, instance);
}

上述代码中NamingService已经属于Nacos Client项目提供的API支持了。

关于Nacos Client的API流程查看,可直接查看Nacos对应的源码,NamingService#registerInstance方法对应的流程图整理如下: image.png上述流程图还可以继续细化,这个我们在后续章节中进行专门讲解,这里大家知道大概的调用流程即可。

Spring Cloud服务注册链路

下面我们来梳理一下Spring Cloud是如何进行服务注册的,其中流程的前三分之二部分几乎所有的服务注册框架都是一样的流程,只有最后一部分进行实例注册时会调用具体的框架来进行实现。

直接来看整个调用的链路图: image.png图中不同的颜色代表这不同的框架,灰色表示业务代码,浅绿色表示SpringBoot框架,深绿色表示Spring框架,浅橙色表示SpringCloud框架,其中这一部分也包含了依赖的Nacos组件部分,最后浅紫色代表着Nacos Client的包。

核心流程分以下几步:

第一步,SpringBoot在启动main方法时调用到Spring的核心方法refresh;

第二步,在Spring中实例化了WebServerStartStopLifecycle对象。

重点说一下WebServerStartStopLifecycle对象,它的start方法被调用时会发布一个ServletWebServerInitializedEvent事件类,这个事件类继承自WebServerInitializedEvent。后面用来处理服务注册的类AbstractAutoServiceRegistration同时也是一个监听器,专门用来监听WebServerInitializedEvent事件。

第三步,AbstractApplicationContext的finishRefresh中会间接调用DefaultLifecycleProcessor的startBeans方法,进而调用了WebServerStartStopLifecycle的start方法。就像上面说的,触发了ServletWebServerInitializedEvent事件的发布。

第四步,AbstractAutoServiceRegistration监听到对应的事件,然后基于Spring Cloud定义的ServiceRegistry接口进行服务注册。

上面的描述省略了一些部分细节,但整个流程基本上就是SpringBoot在启动时发布了一个事件,Spring Cloud监听到对应的事件,然后进行服务的注册。

小结

为了这篇文章,肝了好几天。Spring Cloud源码、Spring Boot源码、Nacos源码都翻了个遍。最终为大家分享了Nacos或者说是Spring Cloud中服务发现的实现机制及流程。

之所以写这篇文章,也是想倡导大家更多的走进源码,而不是仅仅在使用。你学到了吗?

PS:笔者计划在较长一段时间内研究Spring Cloud微服务系列源码,像这篇文章一样深入底层源码。Nacos(服务发现)只是开设,如果你对此方面感兴趣,添加微信好友(zhuan2quan),备注Nacos,在人数足够时会建立相关交流群。

目录
相关文章
|
1月前
|
缓存 供应链 物联网
如何将 Salesforce IoT Cloud 与其他系统集成
Salesforce IoT Cloud 可通过其开放的 API 和集成云平台轻松与外部系统集成,实现数据交换和流程自动化,支持多种协议和标准,帮助企业构建智能物联网应用。
|
1月前
|
存储 Java Nacos
Spring Cloud+Nacos+KMS 动态配置最佳实践
本文讲述了 Spring Cloud 应用中结合 Nacos 实现了运行期配置动态更新的功能,以及在此基础上结合 KMS 在不改动代码的情况下对应用使用的敏感配置进行保护,解决将配置迁移到 Nacos 中可能存在的数据安全顾虑,并对其底层工作原理做了简单介绍。
436 13
|
4月前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
305 0
|
1月前
|
存储 人工智能 Java
Spring AI Alibaba 配置管理,用 Nacos 就够了
本文通过一些实操案例展示了 Spring AI Alibaba + Nacos 在解决 AI 应用中一系列复杂配置管理挑战的方案,从动态 Prompt 模板的灵活调整、模型参数的即时优化,到敏感信息的安全加密存储。Spring AI Alibaba 简化了对接阿里云通义大模型的流程,内置 Nacos 集成也为开发者提供了无缝衔接云端配置托管的捷径,整体上极大提升了 AI 应用开发的灵活性和响应速度。
220 13
|
1月前
|
API Docker 微服务
Ocelot集成Consul实现api网关与服务发现
本文介绍了如何在.NET微服务架构中集成API网关Ocelot和Consul服务发现。首先通过Docker安装并配置Consul,接着在GoodApi项目中实现服务的自动注册与注销,并配置健康检查。然后,通过修改Ocelot的配置文件`ocelot.json`和`Program.cs`,实现基于Consul的服务发现,确保API请求能够正确路由到后端服务。最后,解决了服务解析时可能出现的问题,确保服务的IP地址而非节点名称被正确解析。
39 0
Ocelot集成Consul实现api网关与服务发现
|
2月前
|
IDE API 开发工具
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
Alibaba Cloud API Toolkit for VSCode 是集成了 OpenAPI 开发者门户多项功能的 VSCode 插件,开发者可以通过这个插件方便地查找API文档、进行API调试、插入SDK代码,并配置基础环境设置。我们的目标是缩短开发者在门户和IDE之间的频繁切换,实现API信息和开发流程的无缝结合,让开发者的工作变得更加高效和紧密。
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
|
2月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
176 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
2月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡