整体流程如下
1.RegistryProtocol类
@Override
public <T> Exporter<T> export(final Invoker<T> originInvoker) throws RpcException {
//服务netty启动
final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker, providerUrl);
if (register) {
//服务注册
register(registryUrl, registeredProviderUrl);
}
}
public void register(URL registryUrl, URL registeredProviderUrl) {
//工厂模式
Registry registry = registryFactory.getRegistry(registryUrl);
//跟进去
registry.register(registeredProviderUrl);
}
2.FailbackRegistry类
@Override
public void register(URL url) {
super.register(url);
removeFailedRegistered(url);
removeFailedUnregistered(url);
try {
// Sending a registration request to the server side
//跟进去,这里是模板模式,调用子类的方法
doRegister(url);
} catch (Exception e) {
//添加到失败的集合中
addFailedRegistered(url);
}
}
3.NacosRegistry类(我使用的是Nacos注册中心,所以这里走到这里)
@Override
public void doRegister(URL url) {
//serviceName = providers:com.doukill.dubbo.FoodService::
final String serviceName = getServiceName(url);
final Instance instance = createInstance(url);
execute(namingService -> namingService.registerInstance(serviceName, instance));
}
4.NacosNamingService类
public void registerInstance(String serviceName, Instance instance) throws NacosException {
this.registerInstance(serviceName, "DEFAULT_GROUP", instance);
}
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());
this.beatReactor.addBeatInfo(NamingUtils.getGroupedName(serviceName, groupName), beatInfo);
}
//发送请求注册服务
this.serverProxy.registerService(NamingUtils.getGroupedName(serviceName, groupName), groupName, instance);
}
5.NamingProxy类
public void registerService(String serviceName, String groupName, Instance instance) throws NacosException {
LogUtils.NAMING_LOGGER.info("[REGISTER-SERVICE] {} registering service {} with instance: {}", new Object[]{this.namespaceId, serviceName, instance});
Map<String, String> params = new HashMap(9);
params.put("namespaceId", this.namespaceId);
params.put("serviceName", serviceName);
params.put("groupName", groupName);
params.put("clusterName", instance.getClusterName());
params.put("ip", instance.getIp());
params.put("port", String.valueOf(instance.getPort()));
params.put("weight", String.valueOf(instance.getWeight()));
params.put("enable", String.valueOf(instance.isEnabled()));
params.put("healthy", String.valueOf(instance.isHealthy()));
params.put("ephemeral", String.valueOf(instance.isEphemeral()));
params.put("metadata", JSON.toJSONString(instance.getMetadata()));
//发起请求
this.reqAPI(UtilAndComs.NACOS_URL_INSTANCE, params, "POST");
}