Search in sources :

Example 1 with Datum

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";
}
Also used : Instances(com.alibaba.nacos.naming.core.Instances) Datum(com.alibaba.nacos.naming.consistency.Datum) Service(com.alibaba.nacos.naming.core.Service) JsonNode(com.fasterxml.jackson.databind.JsonNode) TypeReference(com.fasterxml.jackson.core.type.TypeReference) RaftPeer(com.alibaba.nacos.naming.consistency.persistent.raft.RaftPeer) PostMapping(org.springframework.web.bind.annotation.PostMapping)

Example 2 with Datum

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);
}
Also used : Datum(com.alibaba.nacos.naming.consistency.Datum) ArrayList(java.util.ArrayList) GetMapping(org.springframework.web.bind.annotation.GetMapping)

Example 3 with Datum

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());
}
Also used : Datum(com.alibaba.nacos.naming.consistency.Datum) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList)

Example 4 with Datum

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;
}
Also used : Datum(com.alibaba.nacos.naming.consistency.Datum) NacosException(com.alibaba.nacos.api.exception.NacosException)

Example 5 with Datum

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);
        }
    }
}
Also used : Datum(com.alibaba.nacos.naming.consistency.Datum) UnsupportedEncodingException(java.io.UnsupportedEncodingException) NacosException(com.alibaba.nacos.api.exception.NacosException) NacosRuntimeException(com.alibaba.nacos.api.exception.runtime.NacosRuntimeException) IOException(java.io.IOException)

Aggregations

Datum (com.alibaba.nacos.naming.consistency.Datum)29 NacosException (com.alibaba.nacos.api.exception.NacosException)10 HashMap (java.util.HashMap)10 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)6 Test (org.junit.Test)6 Instances (com.alibaba.nacos.naming.core.Instances)5 Instance (com.alibaba.nacos.naming.core.Instance)4 JsonNode (com.fasterxml.jackson.databind.JsonNode)4 IOException (java.io.IOException)4 UnsupportedEncodingException (java.io.UnsupportedEncodingException)4 ArrayList (java.util.ArrayList)4 NacosRuntimeException (com.alibaba.nacos.api.exception.runtime.NacosRuntimeException)3 DistroData (com.alibaba.nacos.core.distributed.distro.entity.DistroData)3 BaseTest (com.alibaba.nacos.naming.BaseTest)3 Service (com.alibaba.nacos.naming.core.Service)3 TypeReference (com.fasterxml.jackson.core.type.TypeReference)3 Map (java.util.Map)3 WriteRequest (com.alibaba.nacos.consistency.entity.WriteRequest)2 DistroKey (com.alibaba.nacos.core.distributed.distro.entity.DistroKey)2 Serializer (com.alibaba.nacos.naming.cluster.transport.Serializer)2