2023-09-15
原文作者:王伟王胖胖 原文地址: https://blog.csdn.net/wangwei19871103/article/details/105787403

大致服务注册流程

202309152316597071.png

服务注册相关配置类介绍

主要的也就一个NacosServiceRegistryAutoConfiguration

202309152317005072.png

NacosServiceRegistryAutoConfiguration

NacosServiceRegistry

实现了ServiceRegistry接口,可以进行注册,注销等操作。拿到属性和命名服务,然后用命名服务可以进行注册的操作。

202309152317012303.png

202309152317018944.png

NacosRegistration

注册的服务实例,一些基本的信息服务都可以从这里获取。

202309152317025555.png

NacosAutoServiceRegistration

继承了AbstractAutoServiceRegistration,就有一些服务注册的生命周期回调了,这个时候就可以做注册。

202309152317031976.png
可以监听ServletWebServerApplicationContext在刷新完成的时候通知的ServletWebServerInitializedEvent事件。

202309152317039547.png

注册原理

当然注册服务相关的配置离不开NacosDiscoveryAutoConfiguration的优先注入,因为要用到属性和命名服务呀。还会依赖AutoServiceRegistrationConfiguration,也是用到里面AutoServiceRegistrationProperties的属性,不过我们先不看命名服务干了什么,先介绍注册的原理。

NacosServiceRegistry的register

创建服务实例Instance,然后调用命名服务去注册。

    	@Override
    	public void register(Registration registration) {
    		...
    		//注册服务名
    		String serviceId = registration.getServiceId();
    		String group = nacosDiscoveryProperties.getGroup();//组
    
    		Instance instance = getNacosInstanceFromRegistration(registration);
    
    		try {
    			namingService.registerInstance(serviceId, group, instance);
    			log.info("nacos registry, {} {} {}:{} register finished", group, serviceId,
    					instance.getIp(), instance.getPort());
    		}
    			catch (Exception e) {
    		...
    		}
    	}

注册服务信息封装成Instance

202309152317045808.png

NacosNamingService的registerInstance

如果是临时的,就需要用心跳来告诉服务器还活着,所以要开启心跳任务,默认是临时的。

     @Override
        public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
    
            if (instance.isEphemeral()) {
                BeatInfo beatInfo = new BeatInfo();
                beatInfo.setServiceName(NamingUtils.getGroupedName(serviceName, groupName));
                beatInfo.setIp(instance.getIp());
                beatInfo.setPort(instance.getPort());
                beatInfo.setCluster(instance.getClusterName());
                beatInfo.setWeight(instance.getWeight());
                beatInfo.setMetadata(instance.getMetadata());
                beatInfo.setScheduled(false);
                beatInfo.setPeriod(instance.getInstanceHeartBeatInterval());
    
                beatReactor.addBeatInfo(NamingUtils.getGroupedName(serviceName, groupName), beatInfo);
            }
    
            serverProxy.registerService(NamingUtils.getGroupedName(serviceName, groupName), groupName, instance);
        }

NamingProxy的registerService

设置参数,然后调用API

202309152317054119.png

reqAPI

随机先选一个地址开始调用,如果出错了就轮询其他的,成功就返回,注册中心应该用集群模式,当然也可以集群前挂个nginx,这样好点,最后里面就是URL的请求连接,就不多说了。

2023091523170650010.png

这样服务注册基本上讲完了,其实思路跟zk的有点像,还有临时结点,有心跳维持,eureka也有心跳续约,接下去看看服务发现吧。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

阅读全文