大致服务注册流程
服务注册相关配置类介绍
主要的也就一个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
也有心跳续约,接下去看看服务发现吧。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。
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] ,回复【面试题】 即可免费领取。