dubbo下Dubbo协议注册中心理解SimpleRegistryService之register,getRegistered,notify方法理解注释

 
 
 
 
SimpleRegistryService
@Override
public void register(String service, URL url) {
    //service格式 interface+group分组+version版本号
    //调用父类 AbstractRegistryService rigister方法
    super.register(service, url);
   // 远程调用register 接口的 ip:port
   // private final ConcurrentMap<String, ConcurrentMap<String, URL>> remoteRegistered = new ConcurrentHashMap<String, ConcurrentMap<String, URL>>();
    // remoteRegistered 格式  {10.0.0.0:7001  {Demoservice/hsfgroup:1.0.0.daily Url(各类参数), remoteRegistered 格式  {10.0.0.0:7001  {Demoservice1/hsfgroup:1.0.0.daily Url(各类参数),Demoservice2/hsfgroup:1.0.0.daily Url(各类参数)}}}}
    // key:ip+port;value:{key:service;value:url}
    String client = RpcContext.getContext().getRemoteAddressString();
    //返回根据  对应ip+端口
    Map<String, URL> urls = remoteRegistered.get(client);
    if (urls == null) {
        remoteRegistered.putIfAbsent(client, new ConcurrentHashMap<String, URL>());
        urls = remoteRegistered.get(client);
    }
    urls.put(service, url);
    //调用父类 AbstractRegistryService getRegistered 获取提供改 service =服务名+组别+版本的 所有提供者信息
    //调用父类notify消息  通过父类的notifyListeners {service[notify1,notify2] 绑定的对应的订阅的监听器 所有的提供者信息都推送到订阅方(服务消费)
    notify(service, getRegistered().get(service));
}
AbstractRegistryService register,getRegistered,notify
public void register(String service, URL url) {
    //service格式 interface+group分组+version版本号
    if (service == null) {
        throw new IllegalArgumentException("service == null");
    }
    if (url == null) {
        throw new IllegalArgumentException("url == null");
    }
    //registered的数据结构例子 相同接口名称不同和版本号,不同ip+host服务
    //  {DemoService/HSF:1.0.0.daily:[url10.0.0.1:7001),url(10.0.0.2:7001)]}
    //    private final ConcurrentMap<String, List<URL>> registered = new ConcurrentHashMap<String, List<URL>>();
    List<URL> urls = registered.get(service);
    if (urls == null) {
        registered.putIfAbsent(service, new CopyOnWriteArrayList<URL>());
        urls = registered.get(service);
    }
    if (!urls.contains(url)) {
        urls.add(url);
    }
}
public Map<String, List<URL>> getRegistered() {//获取不可改视图,目的只读{DemoService/HSF:1.0.0.daily:[url10.0.0.1:7001),url(10.0.0.2:7001)]}return Collections.unmodifiableMap(registered);}
 private void doNotify(String service, List<URL> urls) {
    //放入已经通知的Map集合中
   // service 接口名称+分组+版本,urls所有注册该服务提供者
    notified.put(service, urls);
    //private final ConcurrentMap<String, List<NotifyListener>> notifyListeners = new ConcurrentHashMap<String, List<NotifyListener>>();
   //获取 该service 接口名称+分组+版本 对应的被订阅的监听列表;如果没有啥都不做
    List<NotifyListener> listeners = notifyListeners.get(service);
    if (listeners != null) {
        //如果监听列表存在 逐个通知所有服务提供者信息
        for (NotifyListener listener : listeners) {
            try {
                notify(service, urls, listener);
            } catch (Throwable t) {
                logger.error("Failed to notify registry event, service: " + service + ", urls: " + urls + ", cause: " + t.getMessage(), t);
            }
        }
    }
} protected void notify(String service, List<URL> urls, NotifyListener listener) {listener.notify(urls);}

猜你喜欢

转载自blog.csdn.net/icool_ali/article/details/80704201