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