nacos 注册中心
注册中心使用
引入nacos discovery , 并在SpingBoot启动类中添加@EnableDiscoveryClient 注解
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
根据spring.factories来配置来完成相关类的注册,
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\
com.alibaba.cloud.nacos.ribbon.RibbonNacosAutoConfiguration,\
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
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration
我们来重点关注一下几个类,看名称可能是用来服务注册,NacosServiceRegistryAutoConfiguration用来注册管理这几个bean
public class NacosServiceRegistryAutoConfiguration {
@Bean
public NacosServiceRegistry nacosServiceRegistry(
NacosDiscoveryProperties nacosDiscoveryProperties) {
return new NacosServiceRegistry(nacosDiscoveryProperties);
}
@Bean
@ConditionalOnBean(AutoServiceRegistrationProperties.class)
public NacosRegistration nacosRegistration(
NacosDiscoveryProperties nacosDiscoveryProperties,
ApplicationContext context) {
return new NacosRegistration(nacosDiscoveryProperties, context);
}
@Bean
@ConditionalOnBean(AutoServiceRegistrationProperties.class)
public NacosAutoServiceRegistration nacosAutoServiceRegistration(
NacosServiceRegistry registry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
NacosRegistration registration) {
return new NacosAutoServiceRegistration(registry,
autoServiceRegistrationProperties, registration);
}
}
NacosServiceRegistry: 完成服务注册,实现ServiceRegistry
NacosRegistration: 用来注册时存储nacos服务端的相关消息
NacosAutoServiceRegistration: 继承spring 中的AbstractAutoServiceRegistration,AbstractAutoServiceRegistration实现ApplicationListener
通过事件监听发起服务注册,到时会调用NacosServiceRegistry.register(Registration)
服务注册
容器启动时->AbstractAutoServiceRegistration.onApplicationEvent(WebServerInitializedEvent event)->NacosServiceRegistry.register(Registration registration);
具体的代码,可以将nacos源码下载到本地,进行查看。
补充
在将服务注册到nacos时,在NacosServiceRegistry.register(Registration registration); 方法中添加心跳逻辑
服务提供者向nacos server发起注册前,先向nacos server建立起心跳检测机制,同时nacos server也有心跳检测,服务者不停向nacos server发布心跳检测,告知服务的健康状态,nacos server发现服务心跳检测超时会发布超时事件来告知消费者。
服务发现
服务发现有NacosWatch完成,NacosWatch实现了spring 的SmartLifecycle接口,他在容器启动和销毁时会调用对于的start()和stop()方法。
1、服务消费者订阅后会执行一个轮询任务(1s/次)用来拉去最新的服务提供者信息并实时更新,实现代码在HostReactor.UpdateTask中完成。
2、上面服务注册时我们说过,服务提供者注册时nacos服务端也有一个相应的心跳检测,当心跳检测超时也就是未及时收到服务提供者的心跳包,nacos server判定该服务状态异常 随后通过UDP推送服务信息用来告知对应服务消费者,服务消费者通过PushReceiver来处理udp协议,HostReactor.processServiceJson(String json)来更新本地服务列表