nacos源码5-cmdb接入

一 基本概念

  • 实体类型
    所有实体都有对应的实体类型,如ip,主机等
  • 实体
    具体实体,每个具有一系列标签,标签用于区分不同实体
  • 标签
    表示实体的一个特征,多个实体可能有相同的标签即共性的特征,如主机所属部门等。
  • 实体事件
    cmdb数据源中实体信息有变更,触发相应实体事件,通知nacos。
public enum EntityEventType {
    ENTITY_ADD_OR_UPDATE,
    ENTITY_REMOVE
}

二 CmdbService

  • nacos基于spi机制获取使用方提供的CmdbService接口实现类
    ServiceLoader serviceLoader = ServiceLoader.load(CmdbService.class);
  • CmdbService类中接口含义,源码中说明的很清楚
public interface CmdbService {

    /**
     * Get all label names stored in CMDB
     *
     * @return label name set
     */
    Set getLabelNames();

    /**
     * Get all possible entity types in CMDB
     *
     * @return all entity types
     */
    Set getEntityTypes();

    /**
     * Get label info
     *
     * @param labelName label name
     * @return label info
     */
    Label getLabel(String labelName);

    /**
     * Get label value of label name of ip
     *
     * @param entityName entity name
     * @param entityType  entity type
     * @param labelName   target label name
     * @return label value
     */
    String getLabelValue(String entityName, String entityType, String labelName);

    /**
     * Get all label value of ip
     *
     * @param entityName entity name
     * @param entityType  entity type
     * @return all label values
     */
    Map getLabelValues(String entityName, String entityType);

    /**
     * Dump all entities in CMDB
     *
     * @return all entities
     */
    Map> getAllEntities();

    /**
     * get label change events
     *
     * @param timestamp start time of generated events
     * @return label events
     */
    List getEntityEvents(long timestamp);

    /**
     * Get single entity
     *
     * @param entityName name of entity
     * @param entityType type of entity
     * @return
     */
    Entity getEntity(String entityName, String entityType);
}

三 CmdbProvider

3.1 配置项SwitchAndOptions

  • 支持http请求变更配置
  • loadDataAtStart是否在启动阶段从cmdb源中获取数据
  • ***TaskInterval相关任务的周期时间

3.2 初始化

初始化.png

3.3 接口

  • 接口含义见源码注释
public interface CmdbReader {

    /**
     * Get entity
     *
     * @param entityName name of entity
     * @param entityType type of entity
     * @return entity
     */
    Entity queryEntity(String entityName, String entityType);

    /**
     * Get label of entity
     *
     * @param entityName name of entity
     * @param entityType type of entity
     * @param labelName  label name
     * @return label value
     */
    String queryLabel(String entityName, String entityType, String labelName);

    /**
     * Get entities of selected label
     *
     * @param labelName  name of label
     * @param labelValue value of label
     * @return list of entiy
     */
    List queryEntitiesByLabel(String labelName, String labelValue);
}

3.4 LabelSelector

  • 服务提供者作为实体
  • 配置期望标签集,需要服务消费者和服务提供者的对应标签集标签一致,才可调用。
  • 服务实例信息获取时,使用selector过滤服务提供者实例。
srvedIPs = domObj.getSelector().select(clientIP, srvedIPs);

public List select(String consumer, List providers) {

    if (labels.isEmpty()) {
        return providers;
    }

    List ipAddressList = new ArrayList<>();
    for (IpAddress ipAddress : providers) {

        boolean matched = true;
        for (String labelName : getLabels()) {

            String consumerLabelValue = cmdbReader.queryLabel(consumer, PreservedEntityTypes.ip.name(), labelName);

            if (StringUtils.isNotBlank(consumerLabelValue) &&
                    !StringUtils.equals(consumerLabelValue,
                            cmdbReader.queryLabel(ipAddress.getIp(), PreservedEntityTypes.ip.name(), labelName))) {
                matched = false;
                break;
            }
        }
        if (matched) {
            ipAddressList.add(ipAddress);
        }
    }

    if (ipAddressList.isEmpty()) {
        return providers;
    }

    return ipAddressList;
}

你可能感兴趣的:(nacos源码5-cmdb接入)