Nacos提供了服务注册的API接口,客户端只需要向该接口发送请求,即可实现服务注册
NacosServiceRegistryAutoConfiguration 负责自动装配
核心实现如下
public void register(Registration registration) {
// 判断serviceId是否为空,也就是spring.application.name不能为空
if (StringUtils.isEmpty(registration.getServiceId())) {
log.warn("No service to register for nacos client...");
return;
}
// 获取Nacos的命名服务,其实就是注册中心服务
NamingService namingService = namingService();
// 获取 serviceId 和 Group
String serviceId = registration.getServiceId();
String group = nacosDiscoveryProperties.getGroup();
// 封装服务实例的基本信息,如 cluster-name、是否为临时实例、权重、IP、端口等
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) {
if (nacosDiscoveryProperties.isFailFast()) {
log.error("nacos registry, {} register failed...{},", serviceId,
registration.toString(), e);
rethrowRuntimeException(e);
}
else {
log.warn("Failfast is false. {} register failed...{},", serviceId,
registration.toString(), e);
}
}
}
NacosNamingService 提供服务注册和订阅能力
public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
NamingUtils.checkInstanceIsLegal(instance);
clientProxy.registerService(serviceName, groupName, instance);
}
调用proxy的注册服务registerService实现,如下
先获取client,分成grpc和http两种实现
然后注册服务,先看下grpc的实现
1.先缓存到cache
2.执行注册流程,如下图
2.1 可以看到是grpcClient发送请求到服务server端注册,如下图实现
2.2 然后更新本地内存redoData数据,设置为已经注册
再看下http协议的实现
按照域名 调用server端,或者没有域名,就随机选择一个server,调用
callServer进行注册
也是执行一个http调用,发送注册请求到server端
++++++++++++++++++++++++++++++++++++++++++++
继续看下server端处理注册InstanceControllerV2的register方法