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