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:[url(10.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:[url(10.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);}