/** * 服务注册中心 * 支持服务的注册和发现功能 */ import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class ServiceRegistry { // 使用ConcurrentHashMap存储服务信息,确保线程安全 private final Map> services; // 单例模式实现 private static volatile ServiceRegistry instance; private ServiceRegistry() { services = new ConcurrentHashMap<>(); System.out.println("服务注册中心初始化完成"); } // 获取单例实例 public static ServiceRegistry getInstance() { if (instance == null) { synchronized (ServiceRegistry.class) { if (instance == null) { instance = new ServiceRegistry(); } } } return instance; } // 注册服务 public synchronized void register(String serviceName, String host, int port) { ServiceInstance instance = new ServiceInstance(host, port); services.computeIfAbsent(serviceName, k -> new ArrayList<>()).add(instance); System.out.println("服务注册成功: " + serviceName + " at " + host + ":" + port); } // 注销服务 public synchronized void deregister(String serviceName, String host, int port) { List instances = services.get(serviceName); if (instances != null) { boolean removed = instances.removeIf(instance -> instance.getHost().equals(host) && instance.getPort() == port); if (removed) { System.out.println("服务注销成功: " + serviceName + " at " + host + ":" + port); // 如果该服务没有实例了,移除服务 if (instances.isEmpty()) { services.remove(serviceName); } } else { System.out.println("服务不存在: " + serviceName + " at " + host + ":" + port); } } else { System.out.println("服务不存在: " + serviceName); } } // 发现服务(获取所有实例) public List discover(String serviceName) { List instances = services.get(serviceName); if (instances != null && !instances.isEmpty()) { System.out.println("发现服务: " + serviceName + ",实例数量: " + instances.size()); return new ArrayList<>(instances); // 返回副本避免并发修改问题 } System.out.println("未发现服务: " + serviceName); return Collections.emptyList(); } // 获取随机实例(简单的负载均衡) public ServiceInstance getRandomInstance(String serviceName) { List instances = discover(serviceName); if (!instances.isEmpty()) { Random random = new Random(); ServiceInstance instance = instances.get(random.nextInt(instances.size())); System.out.println("选择随机实例: " + serviceName + " at " + instance.getHost() + ":" + instance.getPort()); return instance; } return null; } // 获取所有已注册的服务名称 public Set getAllServices() { return new HashSet<>(services.keySet()); } // 服务实例内部类 public static class ServiceInstance { private final String host; private final int port; private final long registerTime; public ServiceInstance(String host, int port) { this.host = host; this.port = port; this.registerTime = System.currentTimeMillis(); } public String getHost() { return host; } public int getPort() { return port; } public long getRegisterTime() { return registerTime; } @Override public String toString() { return host + ":" + port; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ServiceInstance that = (ServiceInstance) o; return port == that.port && Objects.equals(host, that.host); } @Override public int hashCode() { return Objects.hash(host, port); } } }