2023-09-15  阅读(12)
原文作者:王伟王胖胖 原文地址: 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也有心跳续约,接下去看看服务发现吧。

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


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文