版本說明:
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
提供了服务注册健康检测,从源码中可以看到健康状态、服务发现这两个端点:
访问健康状态端点,可以看到当前服务发现和配置中心的状态为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
提供的接口能力来实现注册功能,集成代码如下:
ServiceRegistry
是Spring 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
从名字上看是服务管理器的意思,它主要维护了NamingService
和NamingMaintainService
对象,这两个对象是
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
类来获取逻辑:
NacosServiceDiscovery
是Nacos
就是实际提供了服务发现功能的类,可以看到他是通过NamingService
来获取实例:
NacosDiscoveryAutoConfiguration
注入了服务注册发现配置类,以及服务发现功能类:
NacosDiscoveryClientConfiguration
注入了服务发现客户端以及NacosWatch
:
configclient
是集成了Spring Cloud Config
配置中心: