前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度剖析Spring Cloud Alibaba系列——如何兼容Spring Cloud

深度剖析Spring Cloud Alibaba系列——如何兼容Spring Cloud

作者头像
35岁程序员那些事
发布2022-09-23 17:05:38
4330
发布2022-09-23 17:05:38
举报
文章被收录于专栏:35岁程序员那些事

Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案,它是Spring Cloud组件被植入Alibaba元素之后的产物。利用Spring Cloud Alibaba,可以快速搭建微服务架构并完成技术升级。中小企业如果需要快速落地业务中台和技术中台,并向数字化业务转型,那Spring Cloud Alibaba绝对是一个“神器”。

本系列将带着大家一起鸟瞰Spring Cloud Alibaba注册中心,从而熟悉它的注册中心架构及相关原理。

咱们可以试着回忆下,没有Spring Cloud Alibaba之前,我们是如何使用Spring Cloud的?

回忆Spring Cloud的使用方式

Spring Cloud支持多种注册中心,比如Eureka、ZooKeeper、Consul等。

如果软件开发人员需要采用Eureka作为注册中心,则需要搭建一个Eureka Server集群,用于管理注册中心服务的元数据,然后应用服务需要接入Eureka,就需要使用对应的注解将服务提供者以及服务订阅者注册到Eureka注册中心。同理ZooKeeper和Consul也是采用同样的方式,使用对应注册中心的注解完成服务的注册和订阅。

Spring Cloud为了方便软件开发人员快速的接入不同的注册中心,统一使用注解@EnableDiscoveryClient+对应注册中心的Starter组件。当然Eureka还是沿用老的使用方式@EnableEurekaClient+对应注册中心的Starter组件,主要是由于Spring Cloud已经停止了对Eureka的维护。

好吧问题来了,Spring Cloud已经将ZooKeeper和Consul的使用方式统一起来,软件开发人员非常愉快的将应用接入Spring Cloud,但是目前市面上又出了一个新的注册中心,比如Nacos,它的性能非常高,并且支持CP和AP模式,但是Spring Cloud不支持。

定义Nacos注册中心的Starter组件

为了满足软件开发人员对Nacos注册中心的述求,Spring Cloud Alibaba定义一个Starter组件spring-cloud-starter-alibaba-nacos-discovery,好吧我们来看看它是如何兼容Spring Cloud和Nacos的。

首选,我们可以从Spring Cloud Alibaba架构师的视角去分析,如何做到使用“@EnableDiscoveryClient+spring-cloud-starter-alibaba-nacos-discovery”将服务接入Nacos注册中心。

其次,我们还要从软件开发人员的视角去分析,如何改造Nacos,并且还能够快速的支持Nacos的版本迭代更新。

我们先来看第一个问题,架构师通常是这么分析问题的:既然是要软件开发人员零成本的从Eureka和Consul注册中心迁移到Nacos注册中心,我们一定要去摸清楚Spring Cloud的架构思想。

第一步,我们可以打开注解@EnableDiscoveryClient的源码,它使用注解@Import自动的注入了一个EnableDiscoveryClientImportSelector类,如下所示:

代码语言:javascript
复制
@Import(EnableDiscoveryClientImportSelector.class)
public @interface EnableDiscoveryClient {}

第二步,读者可以打开EnableDiscoveryClientImportSelector类,我们只看关键代码,如下所示:

代码语言:javascript
复制
//①默认autoRegister=true
if (autoRegister) {
    List<String> importsList = new ArrayList<>(Arrays.asList(imports));
//②利用Spring Boot的自动装配的原理,注入一个AutoServiceRegistrationConfiguration类
importsList.add("org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");
    imports = importsList.toArray(new String[0]);
}

第三步,我们可以打开AutoServiceRegistrationConfiguration类,看关键源码,如下所示:

代码语言:javascript
复制
@Configuration(proxyBeanMethods = false)
//①向Spring IOC容器中注入一个AutoServiceRegistrationProperties类
@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)
//②使用Spring Boot的条件注解,定义一个开关,开关打开就可以完成初始化
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
        matchIfMissing = true)
public class AutoServiceRegistrationConfiguration {}

第四步,我们打开AutoServiceRegistrationProperties类,看关键源码,如下所示:

代码语言:javascript
复制
//①读取属性前缀为spring.cloud.service-registry.auto-registration.*的属性值
@ConfigurationProperties("spring.cloud.service-registry.auto-registration")
public class AutoServiceRegistrationProperties {
    //②开启Spring Cloud的自动注册
    private boolean enabled = true;
    //③开启Spring Cloud的注册管理
    private boolean registerManagement = true;
    //④关闭Spring Cloud的快速失败机制
    private boolean failFast = false;
}

第五步,看到这里,我们可以就认为Spring Cloud充分的利用的Spring Boot的自动装配和条件注解的思想,来控制自身资源的加载。那么Spring Cloud Alibaba会不会也是同样的思想呢?

我们再看看Spring Cloud Alibaba是怎么和Spring Cloud衔接的?

第一步,我们使用IDEA查找Spring Cloud的AutoServiceRegistrationProperties类依赖关系,发现Spring Cloud Alibaba在Starter组件spring-cloud-starter-alibaba-nacos-discovery中使用了这个类,关键代码如下:

代码语言:javascript
复制
//①利用AutoServiceRegistrationProperties类控制NacosRegistration类的初始化
@Bean
@ConditionalOnBean(AutoServiceRegistrationProperties.class)
public NacosRegistration nacosRegistration() {
    return new NacosRegistration(registrationCustomizers.getIfAvailable(),
                nacosDiscoveryProperties, context);
}
//②利用AutoServiceRegistrationProperties类控制NacosAutoServiceRegistration类的初始化
@Bean
@ConditionalOnBean(AutoServiceRegistrationProperties.class)
public NacosAutoServiceRegistration nacosAutoServiceRegistration() {
    return new NacosAutoServiceRegistration(registry,
                autoServiceRegistrationProperties, registration);
}

第二步,看到这里我们应该恍然大悟,原来只是利用一个注解@EnableDiscoveryClient,就可以将Spring Cloud Alibaba和Spring Cloud衔接起来。

第三步,于是我们开发人员就可以使用如下方式,快速的开启Spring Cloud Alibaba+Nacos的开发之旅,如下:

代码语言:javascript
复制
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {}

好吧,关于Spring Cloud Alibaba是如何衔接Nacos的架构及原理,我会下接下来的文章中剖析,敬请期待。

总结

本文带着大家从使用者的角度去分析了Spring Cloud Alibaba如何兼容Spring Cloud,非常简洁易懂。Spring Cloud Alibaba使用了大道至简的架构思想,采用Spring Cloud兼容Spring Boot的技术栈,比如自动装配和条件注解,让软件开发人员几乎零成本的从Spring Cloud迁移到Spring Cloud Alibaba,但是依然可以使用原有的注册中心ZooKepper和Consul,只是增加了Nacos注册中心的能力。

下一期:Spring Cloud Alibaba是如何衔接Nacos的架构及原理


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构随笔录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文带着大家从使用者的角度去分析了Spring Cloud Alibaba如何兼容Spring Cloud,非常简洁易懂。Spring Cloud Alibaba使用了大道至简的架构思想,采用Spring Cloud兼容Spring Boot的技术栈,比如自动装配和条件注解,让软件开发人员几乎零成本的从Spring Cloud迁移到Spring Cloud Alibaba,但是依然可以使用原有的注册中心ZooKepper和Consul,只是增加了Nacos注册中心的能力。
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档