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.

48 lines
1.8 KiB

package mxdx1;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
public abstract class ServiceClient implements ServiceObserver {
private ServiceRegistry registry;
private Map<String, List<ServiceInfo>> serviceCache;
public ServiceClient() {
this.registry = ServiceRegistry.getInstance();
this.serviceCache = new ConcurrentHashMap<>();
}
// 订阅服务
public void subscribe(String serviceName) {
registry.addObserver(serviceName, this);
// 初始化缓存
serviceCache.put(serviceName, registry.discover(serviceName));
}
// 调用服务(简化实现)
public String invoke(String serviceName, String method, String param) {
List<ServiceInfo> services = serviceCache.get(serviceName);
if (services == null || services.isEmpty()) {
return "No available service: " + serviceName;
}
// 简单负载均衡:随机选择
ServiceInfo service = services.get(new Random().nextInt(services.size()));
return "Invoke " + serviceName + " on " + service.getHost() + ":" + service.getPort()
+ " result: " + mockInvoke(service, method, param);
}
// 模拟远程调用
private String mockInvoke(ServiceInfo service, String method, String param) {
// 实际项目中这里会通过网络调用服务
return "Mock result for " + method + "(" + param + ")";
}
// 服务变更通知
@Override
public void onServiceChanged(String serviceName, List<ServiceInfo> serviceInfos) {
System.out.println("Service " + serviceName + " changed, new list: " + serviceInfos);
serviceCache.put(serviceName, serviceInfos);
}
}