Nacos 如何实现服务自动注册
Posted 互联网后端架构
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nacos 如何实现服务自动注册相关的知识,希望对你有一定的参考价值。
1. 背景
接着上次的说,Nacos问题的分析。这次就来分享一下自己的分析方法。以及如何利用Spring事件完成服务注册。
2. 分析一下
2.1 问题分析过程
问题是这样的,我以为是Nacos服务注册不上吗?那就肯定是注册有问题了, 那就去找是服务是如何注册的。
关键是从哪找呢?具体步骤:
知道服务启动方式。如Nacos,就是通过properties,那就找哪有用到启动的属性文件
项目用SpringBoot集成,那核心类的加载就在Spring.factories中。(这个文件会被springSPI加载到)
找到关键类
很凑巧,我们在spring.factories中找到了名字很像启动注册类的类。如下图:
在找类的时候不要怕错,大胆猜,只要验证了自己的想法即可,不对就在接着找。
com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration
类我们找到了,接下来就是去看这个类中的代码去验证自己的想法了。
2.2 Nacos是如何利用Spring事件来实现服务注册的?
com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration
代码如下:
public class NacosServiceRegistryAutoConfiguration {
// 注册类实现,验证我们的想法,需要用到NacosDiscoverProperties
public NacosServiceRegistry nacosServiceRegistry(
NacosDiscoveryProperties nacosDiscoveryProperties) {
return new NacosServiceRegistry(nacosDiscoveryProperties);
}
// 构建注册事例,依然要用到NacosDiscoverProperties
(AutoServiceRegistrationProperties.class)
public NacosRegistration nacosRegistration(
NacosDiscoveryProperties nacosDiscoveryProperties,
ApplicationContext context) {
return new NacosRegistration(nacosDiscoveryProperties, context);
}
// 服务自动注册,通过上面实例化的两个类
(AutoServiceRegistrationProperties.class)
public NacosAutoServiceRegistration nacosAutoServiceRegistration(
NacosServiceRegistry registry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
NacosRegistration registration) {
return new NacosAutoServiceRegistration(registry,
autoServiceRegistrationProperties, registration);
}
}
通过查看代码,发现和我们猜想没有出入,是通过NacosDiscoverProperties
来进行初始化,和官方给的Demo也相似(只是没继承SpringBoot,名字不叫这个),前面两个类我们先不用关注(好奇的可以先点进去看看),我们直接进入第三个方法NacosAutoServiceRegistration
中,通过名字我们也可以看出,这个是自动注册的,参数中包含了Registry和Registration。我们进入类中接着查看。
public class NacosAutoServiceRegistration
extends AbstractAutoServiceRegistration<Registration> {
private NacosRegistration registration;
// 构造参数,关键
public NacosAutoServiceRegistration(ServiceRegistry<Registration> serviceRegistry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
NacosRegistration registration) {
super(serviceRegistry, autoServiceRegistrationProperties);
this.registration = registration;
}
// 注册方法
protected void register() {
if (!this.registration.getNacosDiscoveryProperties().isRegisterEnabled()) {
log.debug("Registration disabled.");
return;
}
if (this.registration.getPort() < 0) {
this.registration.setPort(getPort().get());
}
// 调用了父类的注册方法
super.register();
}
}
进入类中,我们发现了register()方法,更进一步验证我们想法,是通过这个类来进行服务注册,但是在register()方法中,调用了父类的register()方法, 这点就要引起我们的好奇,父类都没都啥东西,调用父类的方法有啥用呢?这个时候就想到了肯定有构造参数,或者方法初始化父类的东西啦!
我们观察构造参数,发现把serviceRegistry传入到了父类构造参数中,我们直接查看父类代码。