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的架构及原理