Dubbo 服务注册

107 阅读1分钟

整体流程如下

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");
}