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