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知识库 -> Nacos系列【25】源码分析篇之Spring Cloud启动器 -> 正文阅读

[Java知识库]Nacos系列【25】源码分析篇之Spring Cloud启动器

有道无术,术尚可求,有术无道,止于术。

版本說明:

spring-boot:2.6.3

spring-cloud:2021.0.1

spring-cloud-alibaba:2.2.8.RELEASE

Nacos:2.1.1

前言

源碼地址

spring-cloud-starter-alibaba-nacos-discovery是一个基于Spring Cloud开发的Nacos服务注册启动器。

源码结构如下
在这里插入图片描述

应用检测

基于Spring Boot Actuator提供了服务注册健康检测,从源码中可以看到健康状态、服务发现这两个端点:
在这里插入图片描述
可以参考Spring Boot 2.x系列来获取这些监控端点。

访问健康状态端点,可以看到当前服务发现和配置中心的状态为UP
在这里插入图片描述
访问服务发现端点,可以看到当前注册的服务名、IP、端口等信息:
在这里插入图片描述

集成 ribbon

ribbon 是一个客户端负载均衡组件,主要功能是提供客户端的软件负载均衡算法和服务调用。Nacos默认提供了集成,引入了spring-cloud-starter-netflix-ribbon包,需要注意的是spring cloud数字年份版本移除了netflix 所有组件。
在这里插入图片描述
ConditionalOnRibbonNacos是一个条件注入注解,可以通过ribbon.nacos.enabled配置关闭ribbon

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@ConditionalOnProperty(
    value = {"ribbon.nacos.enabled"},
    matchIfMissing = true
)
public @interface ConditionalOnRibbonNacos {
}

ExtendBalancer 继承自 Balancer,是一个负载均衡器,可以看到Nacos这里默认采用的是随机权重算法:
在这里插入图片描述
NacosServer继承netflix Server类,是一个服务对象,维护了服务实例、元数据等信息:
在这里插入图片描述
NacosRule 继承自 AbstractLoadBalancerRule抽象类,可以看出这是一个负载均衡规则类,从服务提供者的实例中选出一个可用服务:
在这里插入图片描述

NacosServerList服务列表,顾名思义封装了所有的服务对象:
在这里插入图片描述
NacosServerIntrospector从方法看,是获取服务的元数据和是否Https:
在这里插入图片描述
NacosRibbonClientConfiguration配置类,注入了两个Bean 对象:

@Configuration(
    proxyBeanMethods = false
)
// 使用 ribbon.nacos.enabled 可以关闭
@ConditionalOnRibbonNacos
public class NacosRibbonClientConfiguration {
    @Autowired
    private PropertiesFactory propertiesFactory;

    // 服务列表对象
    @Bean
    @ConditionalOnMissingBean
    public ServerList<?> ribbonServerList(IClientConfig config, NacosDiscoveryProperties nacosDiscoveryProperties) {
        if (this.propertiesFactory.isSet(ServerList.class, config.getClientName())) {
            ServerList serverList = (ServerList)this.propertiesFactory.get(ServerList.class, config, config.getClientName());
            return serverList;
        } else {
            NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties);
            serverList.initWithNiwsConfig(config);
            return serverList;
        }
    }
    // 注入NacosServerIntrospector
    @Bean
    @ConditionalOnMissingBean
    public NacosServerIntrospector nacosServerIntrospector() {
        return new NacosServerIntrospector();
    }
}

RibbonNacosAutoConfiguration自动配置类的主要作用是使用@RibbonClients注解,将NacosRibbonClientConfiguration配置类注入到上下文中:
在这里插入图片描述

自动注册

在微服务架构中,服务注册、服务发现、注册中心的概念,想必大家都很熟悉了,所谓自动服务注册就是项目启动的时候,会自动将当前服务自己的信息地址注册到注册中心。

Nacos通过实现Spring Cloud提供的接口能力来实现注册功能,集成代码如下:
在这里插入图片描述

ServiceRegistrySpring Cloud提供的服务注册接口,声明了注册功能各种方法:

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);
}

NacosServiceRegistry实现了该接口,提供了注册的相关方法,流程后续会解读:
在这里插入图片描述

ServiceInstance也是Spring Cloud提供了接口,它表示一个具体的服务实例对象,NacosRegistration实现了该接口:
在这里插入图片描述
AbstractAutoServiceRegistration抽象类也是Spring Cloud提供,这就是自动注册实现的核心代码,由它来调用服务注册实例进行自动注册,NacosAutoServiceRegistration继承自该抽象类,并主要实现了其注册方法:
在这里插入图片描述
NacosServiceRegistryAutoConfiguration自动配置类,主要负责自动配置的开关,以及注册相关Bean 对象:

@Configuration(
    proxyBeanMethods = false
)
@EnableConfigurationProperties
@ConditionalOnNacosDiscoveryEnabled
// 可以使用spring.cloud.service-registry.auto-registration.enabled参数关闭自动注册
@ConditionalOnProperty(
    value = {"spring.cloud.service-registry.auto-registration.enabled"},
    matchIfMissing = true
)
@AutoConfigureAfter({AutoServiceRegistrationConfiguration.class, AutoServiceRegistrationAutoConfiguration.class, NacosDiscoveryAutoConfiguration.class})
public class NacosServiceRegistryAutoConfiguration {

    // Nacos 服务注册器
    @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((List)registrationCustomizers.getIfAvailable(), nacosDiscoveryProperties, context);
    }
    // 自动注册器
    @Bean
    @ConditionalOnBean({AutoServiceRegistrationProperties.class})
    public NacosAutoServiceRegistration nacosAutoServiceRegistration(NacosServiceRegistry registry, AutoServiceRegistrationProperties autoServiceRegistrationProperties, NacosRegistration registration) {
        return new NacosAutoServiceRegistration(registry, autoServiceRegistrationProperties, registration);
    }
}

服务发现

服务发现,即消费端自动发现服务地址列表的能力,是微服务框架需要具备的关键能力,借助于自动化的服务发现,微服务之间可以在无需感知对方部署位置与 IP 地址的情况下实现通信。
在这里插入图片描述
NacosWatch实现了SmartLifecycle接口,所以应用在启动后会调用其start()方法,还实现了ApplicationEventPublisherAware接口,所以具备了事件发布能力。该类的具体作用,后续会解答。

NacosServiceManager从名字上看是服务管理器的意思,它主要维护了NamingServiceNamingMaintainService对象,这两个对象是
Nacos原生客户端提供的接口,是由工厂创建,NamingService主要负责注册、注销服务,NamingMaintainService主要负责更新服务。

NacosServiceManager负责构建这两个对象。
在这里插入图片描述

NacosServiceInstance实现了ServiceInstance接口,表示一个具体的服务实例,维护了当前服务ID、端口、元数据等信息。
在这里插入图片描述
NacosServiceAutoConfiguration没什么好说的,只是注册了一个NacosServiceManager对象。
在这里插入图片描述
ConditionalOnNacosDiscoveryEnabled就是一个条件注解,表示是否开启Nacos服务注册中心,通过 spring.cloud.nacos.discovery.enabled参数配置进行控制。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@ConditionalOnProperty(
    value = {"spring.cloud.nacos.discovery.enabled"},
    matchIfMissing = true
)
public @interface ConditionalOnNacosDiscoveryEnabled {
}

学过Spring Boot Starter 启动器的都知道,首先是有一个配置类用于配置当前组件,服务注册的配置类为NacosDiscoveryProperties,可以看到提供了服务注册需要的地址、权重、元数据、心跳等配置项。
在这里插入图片描述
spring.factories文件中,可以看到很多自动配置类,这些类会在应用启动时,使用SPI机制将当前类中注册的Bean 对象加载到应用上下文中。
在这里插入图片描述
NacosDiscoveryClient服务发现客户端实现了DiscoveryClient接口,提供了获取其他服务实例的功能,通过NacosServiceDiscovery类来获取逻辑:
在这里插入图片描述
NacosServiceDiscoveryNacos就是实际提供了服务发现功能的类,可以看到他是通过NamingService来获取实例:
NacosDiscoveryAutoConfiguration注入了服务注册发现配置类,以及服务发现功能类:
在这里插入图片描述

NacosDiscoveryClientConfiguration注入了服务发现客户端以及NacosWatch:
在这里插入图片描述
configclient是集成了Spring Cloud Config配置中心:
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 00:56:31  更:2022-09-04 01:02:22 
 
开发: 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/23 12:42:21-

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