Nacos服务注册过程中做了哪些事情
本文简单地介绍了nacos注册的过程,
包括:创建实例信息、组装心跳参数并发送请求、请求nacos服务端注册等。
*SpringCloud定义了服务注册的统一规范
SpringCloud不关注服务注册与发现的组件具体是哪一种,
例如eureka、consul、zookeeper、nacos,
它们接入SpringCloud都需要遵循spring-cloud-commons中的一系列规范。
*spring-cloud-commons
serviceregistry包
定义了服务注册的规范
discovery包
定义了服务发现的规范
loadbalancer包
定义了负载均衡的规范
*服务注册
AutoServiceRegistration
自动注册
Registration
约束注册信息
例如:ip、host、serviceid、协议等。
ServiceRegistry
包含服务注册register()、注销deregister()方法。
nacos实现
*nacos服务注册
NacosServiceRegistry实现了SpringCloud的ServiceRegistry接口,
负责将服务注册/注销至注册中心。
启动本地nacos服务
不熟悉的可以参照:Nacos 快速开始
在NacosServiceRegistry的register()这里打上断点
debug启动服务实例
*register()调用链路
NacosAutoServiceRegistration.bind(WebServerInitializedEvent)
看到bind方法之上的注解:@EventListener(WebServerInitializedEvent.class),
我们知道服务注册是在WebServer实例初始化完成时发生的,
从这里往下看去。
NacosAutoServiceRegistration.start()
NacosAutoServiceRegistration.register()
AbstractAutoServiceRegistration.register()
*NacosServiceRegistry.register(Registration)
创建服务实例
Instance instance = new Instance();
instance.setIp(registration.getHost());
instance.setPort(registration.getPort());
instance.setWeight(nacosDiscoveryProperties.getWeight());
instance.setClusterName(nacosDiscoveryProperties.getClusterName());
instance.setMetadata(registration.getMetadata());
调用namingService注册
try {
namingService.registerInstance(serviceId, instance);
log.info("nacos registry, {} {}:{} register finished", serviceId,
instance.getIp(), instance.getPort());
}
namingService.registerInstance(serviceId, instance)
这个registerInstance方法做了两件事情:
1、
如果是临时实例,组装心跳信息并加载到心跳执行器beatReactor,
查看源码得知beatReactor构造方法中启动了一个ScheduledThreadPoolExecutor,
主要任务是通过定时任务使用http向nacos发送心跳请求。
2、
通过服务代理serverProxy向nacos注册。
然后我们就可以在nacos控制台看到多出了一个服务实例
如有不当之处,还请指正!
参考资料:
牧_风:Nacos服务注册原理解析
若相惜、補棄:nacos服务注册流程
Errol的杂货铺:Nacos初探(2)-- 服务注册原理解析
Programer Hai:SpringCloudAlibaba-Nacos服务注册的原理
随风去。:Nacos 服务注册的原理