Spring Cloud 2.2.2 源码之四十二nacos客户端服务注册原理

大致服务注册流程

在这里插入图片描述

服务注册相关配置类介绍

主要的也就一个NacosServiceRegistryAutoConfiguration
在这里插入图片描述

NacosServiceRegistryAutoConfiguration

NacosServiceRegistry

实现了ServiceRegistry接口,可以进行注册,注销等操作。拿到属性和命名服务,然后用命名服务可以进行注册的操作。
在这里插入图片描述
在这里插入图片描述

NacosRegistration

注册的服务实例,一些基本的信息服务都可以从这里获取。
在这里插入图片描述

NacosAutoServiceRegistration

继承了AbstractAutoServiceRegistration,就有一些服务注册的生命周期回调了,这个时候就可以做注册。
在这里插入图片描述
可以监听ServletWebServerApplicationContext在刷新完成的时候通知的ServletWebServerInitializedEvent事件。
在这里插入图片描述

注册原理

当然注册服务相关的配置离不开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
在这里插入图片描述

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
在这里插入图片描述

reqAPI

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值