You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.2 KiB

package mxdx1;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
//服务注册中心(单例模式)
public class ServiceRegistry {
// 单例实例
private static ServiceRegistry instance;
// 服务存储:服务名 -> 服务列表
private Map<String, List<ServiceInfo>> serviceMap;
// 观察者列表:服务名 -> 观察者列表
private Map<String, List<ServiceObserver>> observers;
// 私有构造函数
private ServiceRegistry() {
serviceMap = new ConcurrentHashMap<>();
observers = new ConcurrentHashMap<>();
}
// 获取单例实例
public static synchronized ServiceRegistry getInstance() {
if (instance == null) {
instance = new ServiceRegistry();
}
return instance;
}
// 注册服务
public void register(ServiceInfo serviceInfo) {
String serviceName = serviceInfo.getServiceName();
serviceMap.computeIfAbsent(serviceName, k -> new CopyOnWriteArrayList<>())
.add(serviceInfo);
// 通知观察者
notifyObservers(serviceName);
}
// 注销服务
public void unregister(ServiceInfo serviceInfo) {
String serviceName = serviceInfo.getServiceName();
List<ServiceInfo> services = serviceMap.get(serviceName);
if (services != null) {
services.remove(serviceInfo);
// 通知观察者
notifyObservers(serviceName);
}
}
// 发现服务
public List<ServiceInfo> discover(String serviceName) {
return serviceMap.getOrDefault(serviceName, new ArrayList<>());
}
// 注册观察者
public void addObserver(String serviceName, ServiceObserver observer) {
observers.computeIfAbsent(serviceName, k -> new CopyOnWriteArrayList<>())
.add(observer);
}
// 通知观察者
private void notifyObservers(String serviceName) {
List<ServiceObserver> obs = observers.get(serviceName);
if (obs != null) {
List<ServiceInfo> services = discover(serviceName);
for (ServiceObserver observer : obs) {
observer.onServiceChanged(serviceName, services);
}
}
}
}