关于nacos:Nacos-启动

196次阅读

共计 4027 个字符,预计需要花费 11 分钟才能阅读完成。

看了 Eureka 系列、Ribbon 系列、Feign 系列、Zuul 系列,我置信大家应该晓得怎么找到看源码的入口了,一个是须要用的注解,一个是 spring.factories。咱们还是从注解先来。

@EnableDiscoveryClient

这个注解做了两件事,一个是 import 了 EnableDiscoveryClientImportSelector,另外一个就是默认 autoRegister 为 true,开启主动注册。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(EnableDiscoveryClientImportSelector.class)
public @interface EnableDiscoveryClient {boolean autoRegister() default true;
}

EnableDiscoveryClientImportSelector 的 selectImports 办法,通过下面的 autoRegister 来判断,如果为 true,则 import 了 AutoServiceRegistrationConfiguration,如果为 false,pring.cloud.service-registry.auto-registration.enabled 设置为 false。这个参数决定了是否引入主动注册。

@Override
public String[] selectImports(AnnotationMetadata metadata) {
    // 其余略
    boolean autoRegister = attributes.getBoolean("autoRegister");

    if (autoRegister) {List<String> importsList = new ArrayList<>(Arrays.asList(imports));
        importsList.add("org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");
        imports = importsList.toArray(new String[0]);
    }
    else {
        // 其余略
        // spring.cloud.service-registry.auto-registration.enabled 设置为 false
        map.put("spring.cloud.service-registry.auto-registration.enabled", false);
        // 其余略

    }
    return imports;
}

NacosServiceAutoConfiguration

注解的局部看完了,咱们开始看 spring.factories。首先是 NacosServiceAutoConfiguration。
这里只加载了 NacosServiceManager,是 service 外围治理类,NamingService 就是他治理的。

NacosDiscoveryAutoConfiguration

这个是用于服务发现的,他加载了两个类,NacosDiscoveryProperties 和 NacosServiceDiscovery。
NacosDiscoveryProperties 是配置类,咱们配置注册核心的信息就是在这里配置。
NacosServiceDiscovery 次要是用于服务发现。

NacosServiceRegistryAutoConfiguration

NacosServiceRegistryAutoConfiguration,这个是用于主动注册的。
咱们看到他下面的注解信息,@AutoConfigureAfter 确保 AutoServiceRegistrationConfiguration 先加载,而后判断 spring.cloud.service-registry.auto-registration.enabled 是否为 true,为 true 才能够加载。所以下面 @EnableDiscoveryClient 的 autoRegister 如果设置为 false,则不加载。
因为 spring.cloud.service-registry.auto-registration.enabled 默认是 true 的,所以 @EnableDiscoveryClient 其实不引入,也是能够加载 NacosServiceRegistryAutoConfiguration。

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
@ConditionalOnNacosDiscoveryEnabled
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
        matchIfMissing = true)
@AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
        AutoServiceRegistrationAutoConfiguration.class,
        NacosDiscoveryAutoConfiguration.class })
public class NacosServiceRegistryAutoConfiguration

这个类会加载 NacosServiceRegistry、NacosRegistration、NacosAutoServiceRegistration。NacosServiceRegistry、NacosRegistration 会注入到 NacosAutoServiceRegistration。
NacosServiceRegistry 次要用于注册、勾销注册。
NacosRegistration 是以后实例的信息,比方实例名称、实例 id、端口、ip 等。
NacosAutoServiceRegistration 继承了 NacosAutoServiceRegistration,NacosAutoServiceRegistration 又继承了 AbstractAutoServiceRegistration。AbstractAutoServiceRegistration 实现了 ApplicationListener<WebServerInitializedEvent> 接口,通过 WebServerInitializedEvent 就晓得了,当 tomcat 启动胜利后,会调用 onApplicationEvent(WebServerInitializedEvent event) 办法。这个办法会实现注册操作,前面再来解说。

NacosDiscoveryClientConfiguration

这里加载了两个类,DiscoveryClient 和 NacosWatch。
DiscoveryClient 次要用于示例获取和服务获取。
NacosWatch 实现了 SmartLifecycle 接口,所以会调用 start 和 stop 办法。
start 办法次要是退出 NamingEvent 监听、获取 NamingService、注册监听、公布 HeartbeatEvent 事件。

@Override
public void start() {
    // 启动的时候,退出 NamingEvent 监听
    if (this.running.compareAndSet(false, true)) {EventListener eventListener = listenerMap.computeIfAbsent(buildKey(),
                event -> new EventListener() {
                    @Override
                    public void onEvent(Event event) {if (event instanceof NamingEvent) {List<Instance> instances = ((NamingEvent) event)
                                    .getInstances();
                            Optional<Instance> instanceOptional = selectCurrentInstance(instances);
                            instanceOptional.ifPresent(currentInstance -> {resetIfNeeded(currentInstance);
                            });
                        }
                    }
                });
        // 获取 NamingService
        NamingService namingService = nacosServiceManager
                .getNamingService(properties.getNacosProperties());
        try {
            // 注册监听
            namingService.subscribe(properties.getService(), properties.getGroup(),
                    Arrays.asList(properties.getClusterName()), eventListener);
        }
        catch (Exception e) {log.error("namingService subscribe failed, properties:{}", properties, e);
        }
        // 公布 HeartbeatEvent 事件
        this.watchFuture = this.taskScheduler.scheduleWithFixedDelay(this::nacosServicesWatch, this.properties.getWatchDelay());
    }
}

正文完
 0