use of com.alibaba.nacos.naming.consistency.Datum in project nacos by alibaba.
the class RaftController method onPublish.
/**
* Commit publish datum.
*
* @param request http request
* @param response http response
* @return 'ok' if success
* @throws Exception exception
*/
@PostMapping("/datum/commit")
public String onPublish(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (versionJudgement.allMemberIsNewVersion()) {
throw new IllegalStateException("old raft protocol already stop");
}
response.setHeader("Content-Type", "application/json; charset=" + getAcceptEncoding(request));
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Content-Encode", "gzip");
String entity = IoUtils.toString(request.getInputStream(), "UTF-8");
String value = URLDecoder.decode(entity, "UTF-8");
JsonNode jsonObject = JacksonUtils.toObj(value);
String key = "key";
RaftPeer source = JacksonUtils.toObj(jsonObject.get("source").toString(), RaftPeer.class);
JsonNode datumJson = jsonObject.get("datum");
Datum datum = null;
if (KeyBuilder.matchInstanceListKey(datumJson.get(key).asText())) {
datum = JacksonUtils.toObj(jsonObject.get("datum").toString(), new TypeReference<Datum<Instances>>() {
});
} else if (KeyBuilder.matchSwitchKey(datumJson.get(key).asText())) {
datum = JacksonUtils.toObj(jsonObject.get("datum").toString(), new TypeReference<Datum<SwitchDomain>>() {
});
} else if (KeyBuilder.matchServiceMetaKey(datumJson.get(key).asText())) {
datum = JacksonUtils.toObj(jsonObject.get("datum").toString(), new TypeReference<Datum<Service>>() {
});
}
raftConsistencyService.onPut(datum, source);
return "ok";
}
use of com.alibaba.nacos.naming.consistency.Datum in project nacos by alibaba.
the class RaftController method get.
/**
* Get datum.
*
* @param request http request
* @param response http response
* @return datum
* @throws Exception exception
*/
@GetMapping("/datum")
public String get(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (versionJudgement.allMemberIsNewVersion()) {
throw new IllegalStateException("old raft protocol already stop");
}
response.setHeader("Content-Type", "application/json; charset=" + getAcceptEncoding(request));
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Content-Encode", "gzip");
String keysString = WebUtils.required(request, "keys");
keysString = URLDecoder.decode(keysString, "UTF-8");
String[] keys = keysString.split(",");
List<Datum> datums = new ArrayList<Datum>();
for (String key : keys) {
Datum datum = raftCore.getDatum(key);
datums.add(datum);
}
return JacksonUtils.toJson(datums);
}
use of com.alibaba.nacos.naming.consistency.Datum in project nacos by alibaba.
the class ServiceManager method updateIpAddresses.
/**
* Compare and get new instance list.
*
* @param service service
* @param action {@link UtilsAndCommons#UPDATE_INSTANCE_ACTION_REMOVE} or {@link UtilsAndCommons#UPDATE_INSTANCE_ACTION_ADD}
* @param ephemeral whether instance is ephemeral
* @param ips instances
* @return instance list after operation
* @throws NacosException nacos exception
*/
public List<Instance> updateIpAddresses(Service service, String action, boolean ephemeral, Instance... ips) throws NacosException {
Datum datum = consistencyService.get(KeyBuilder.buildInstanceListKey(service.getNamespaceId(), service.getName(), ephemeral));
List<Instance> currentIPs = service.allIPs(ephemeral);
Map<String, Instance> currentInstances = new HashMap<>(currentIPs.size());
Set<String> currentInstanceIds = CollectionUtils.set();
for (Instance instance : currentIPs) {
currentInstances.put(instance.toIpAddr(), instance);
currentInstanceIds.add(instance.getInstanceId());
}
Map<String, Instance> instanceMap;
if (datum != null && null != datum.value) {
instanceMap = setValid(((Instances) datum.value).getInstanceList(), currentInstances);
} else {
instanceMap = new HashMap<>(ips.length);
}
for (Instance instance : ips) {
if (!service.getClusterMap().containsKey(instance.getClusterName())) {
Cluster cluster = new Cluster(instance.getClusterName(), service);
cluster.init();
service.getClusterMap().put(instance.getClusterName(), cluster);
Loggers.SRV_LOG.warn("cluster: {} not found, ip: {}, will create new cluster with default configuration.", instance.getClusterName(), instance.toJson());
}
if (UtilsAndCommons.UPDATE_INSTANCE_ACTION_REMOVE.equals(action)) {
instanceMap.remove(instance.getDatumKey());
} else {
Instance oldInstance = instanceMap.get(instance.getDatumKey());
if (oldInstance != null) {
instance.setInstanceId(oldInstance.getInstanceId());
} else {
instance.setInstanceId(instance.generateInstanceId(currentInstanceIds));
}
instanceMap.put(instance.getDatumKey(), instance);
}
}
if (instanceMap.size() <= 0 && UtilsAndCommons.UPDATE_INSTANCE_ACTION_ADD.equals(action)) {
throw new IllegalArgumentException("ip list can not be empty, service: " + service.getName() + ", ip list: " + JacksonUtils.toJson(instanceMap.values()));
}
return new ArrayList<>(instanceMap.values());
}
use of com.alibaba.nacos.naming.consistency.Datum in project nacos by alibaba.
the class ServiceManager method getLocatedInstance.
/**
* Locate consistency's datum by all or instances provided.
*
* @param namespaceId namespace
* @param serviceName serviceName
* @param isEphemeral isEphemeral
* @param all get from consistencyService directly
* @param waitLocateInstance instances provided
* @return located instances
* @throws NacosException nacos exception
*/
public List<Instance> getLocatedInstance(String namespaceId, String serviceName, boolean isEphemeral, boolean all, List<Instance> waitLocateInstance) throws NacosException {
List<Instance> locatedInstance;
// need the newest data from consistencyService
Datum datum = consistencyService.get(KeyBuilder.buildInstanceListKey(namespaceId, serviceName, isEphemeral));
if (datum == null) {
throw new NacosException(NacosException.NOT_FOUND, "instances from consistencyService not exist, namespace: " + namespaceId + ", service: " + serviceName + ", ephemeral: " + isEphemeral);
}
if (all) {
locatedInstance = ((Instances) datum.value).getInstanceList();
} else {
locatedInstance = new ArrayList<>();
for (Instance instance : waitLocateInstance) {
Instance located = locateInstance(((Instances) datum.value).getInstanceList(), instance);
if (located == null) {
continue;
}
locatedInstance.add(located);
}
}
return locatedInstance;
}
use of com.alibaba.nacos.naming.consistency.Datum in project nacos by alibaba.
the class RaftCore method listen.
/**
* Add listener for target key.
*
* @param key key
* @param listener new listener
*/
public void listen(String key, RecordListener listener) {
notifier.registerListener(key, listener);
Loggers.RAFT.info("add listener: {}", key);
// if data present, notify immediately
for (Datum datum : datums.values()) {
if (!listener.interests(datum.key)) {
continue;
}
try {
listener.onChange(datum.key, datum.value);
} catch (Exception e) {
Loggers.RAFT.error("NACOS-RAFT failed to notify listener", e);
}
}
}
Aggregations