有个需求是手机上发送请求,电脑上调用打印机。前提条件是电脑上已经部署springbcloud client服务。spring cloud service 服务端部署在服务器上,手机发送请求到服务端,携带需要调用的服务的服务名。例两台客户端,一台服务名ClientA,另一台服务名ClientB,手机需要调用ClientA所在的电脑绑定的打印机。
图里是eureka-server服务端的jar包,在里面可以找到控制器和首页页面。
贴上代码
@RestController
public class FindClientController {
@RequestMapping("/findClient")
public String findClient(){
ArrayList<Map<String, Object>> list = populateApps();
System.out.println(list);
return "ok";
}
private EurekaServerContext getServerContext() {
return EurekaServerContextHolder.getInstance().getServerContext();
}
private PeerAwareInstanceRegistry getRegistry() {
return this.getServerContext().getRegistry();
}
/**
* 获取已注册的服务
* */
private ArrayList<Map<String, Object>> populateApps() {
List<Application> sortedApplications = this.getRegistry().getSortedApplications();
ArrayList<Map<String, Object>> apps = new ArrayList<>();
for (Application app : sortedApplications) {
LinkedHashMap<String, Object> appData = new LinkedHashMap<>();
apps.add(appData);
appData.put("name", app.getName());
Map<String, Integer> amiCounts = new HashMap<>();
Map<InstanceInfo.InstanceStatus, List<Pair<String, String>>> instancesByStatus = new HashMap<>();
Map<String, Integer> zoneCounts = new HashMap<>();
Iterator var10 = app.getInstances().iterator();
InstanceInfo.InstanceStatus status;
while (var10.hasNext()) {
InstanceInfo info = (InstanceInfo) var10.next();
String id = info.getId();
String url = info.getStatusPageUrl();
status = info.getStatus();
String ami = "n/a";
String zone = "";
if (info.getDataCenterInfo().getName() == DataCenterInfo.Name.Amazon) {
AmazonInfo dcInfo = (AmazonInfo) info.getDataCenterInfo();
ami = dcInfo.get(AmazonInfo.MetaDataKey.amiId);
zone = dcInfo.get(AmazonInfo.MetaDataKey.availabilityZone);
}
Integer count = amiCounts.get(ami);
if (count != null) {
amiCounts.put(ami, count + 1);
} else {
amiCounts.put(ami, 1);
}
count = zoneCounts.get(zone);
if (count != null) {
zoneCounts.put(zone, count + 1);
} else {
zoneCounts.put(zone, 1);
}
List<Pair<String, String>> list = instancesByStatus.computeIfAbsent(status, (k) -> new ArrayList<>());
list.add(new Pair(id, url));
}
appData.put("amiCounts", amiCounts.entrySet());
appData.put("zoneCounts", zoneCounts.entrySet());
ArrayList<Map<String, Object>> instanceInfos = new ArrayList<>();
appData.put("instanceInfos", instanceInfos);
for (Map.Entry<InstanceInfo.InstanceStatus, List<Pair<String, String>>> instanceStatusListEntry : instancesByStatus.entrySet()) {
Map.Entry<InstanceInfo.InstanceStatus, List<Pair<String, String>>> entry = instanceStatusListEntry;
List<Pair<String, String>> value = entry.getValue();
status = entry.getKey();
LinkedHashMap<String, Object> instanceData = new LinkedHashMap<>();
instanceInfos.add(instanceData);
instanceData.put("status", entry.getKey());
ArrayList<Map<String, Object>> instances = new ArrayList<>();
instanceData.put("instances", instances);
instanceData.put("isNotUp", status != InstanceInfo.InstanceStatus.UP);
for (Pair<String, String> stringStringPair : value) {
LinkedHashMap<String, Object> instance = new LinkedHashMap<>();
instances.add(instance);
instance.put("id", stringStringPair.first());
String url = stringStringPair.second();
instance.put("url", url);
boolean isHref = url != null && url.startsWith("http");
instance.put("isHref", isHref);
}
}
}
return apps;
}
}
效果图