05、Nacos源码分析-Server主要类和接口

InstanceController: 处理器, 处理服务实例的心跳和注册等请求。

core/Service: 在Nacos客户端的一个微服务名称定义的微服务, 在Nacos服务端是以Service实例的形式出现的。类似于ServiceInfo, ServiceInfo为客户端服务, Service为服务端服务。

RecordListener: Service类实现了RecordListener接口, 这个接口为数据监听接口, 所以Service本身是一个监听器, 可以监听指定数据的变化和删除。

Record: RecordListener接口的泛型为指定了该监听器所要监听的实体类型, 这个类型是一个Record的子接口, Record是Nacos集群传输和存储的记录。

Cluster: 提供某一服务的Instance集群, 和Service为n: 1的状态, Service为1。

Instance: 注册到Nacos中的具体服务实例。

ServiceManager: Nacos中所有service的核心管理者。其中serviceMap属性为Nacos中的服务注册表。

Synchronizer: 同步器。当前Nacos主动发起同步操作。包含两个方法, 一个是当前Nacos主动发送自己的Message给指定Nacos和主动向指定的Nacos获取指定key的Message。

1.InstanceController

处理服务实例的心跳和注册等请求。

 

 

2.core/Service

 

继承pojo/Service, 实现Record和RecordListener接口。

Service类中有一个属性protectThreshold, 为阈值。

与Eureka中的保护阈值对比:

  • 相同点: 0-1, 表示健康实例占所有实例的比例

  • 保护方式不同:

  • Eureka: 一旦健康实例数量小于阈值, 则不再从注册表中清除不健康的实例

  • Nacos: 如果健康实例数量大于阈值, 则消费者调用到的都是健康实例。一旦健康实例数量小于阈值, 则消费者会从所有实例中进行选择调用, 有可能会调用到不健康实例。这样可以保护健康的实例不会被压崩溃。

  • 范围不同:

  • Eureka: 这个阈值针对的是所有服务中的实例

  • Nacos: 这个阈值针对的是当前Service中的服务实例

    private int finalizeCount = 0;

    private String token;

    private List<String> owners = new ArrayList<>();

    private Boolean resetWeight = false;

    private Boolean enabled = true;

    private Selector selector = new NoneSelector();

    private String namespaceId;

    /**
     * IP will be deleted if it has not send beat for some time, default timeout is 30 seconds.
     */
    private long ipDeleteTimeout = 30 * 1000;

    private volatile long lastModifiedMillis = 0L;

    // 校验和,是当前Service的所有SCI信息的字符串拼接
    private volatile String checksum;

    /**
     * TODO set customized push expire time.
     */
    private long pushCacheMillis = 0L;
    // 重要集合
    // key为clusterName
    // value为Cluster实例
    private Map<String, Cluster> clusterMap = new HashMap<>();

3.RecordListener接口和Record接口

RecordListener是数据监听接口

// 泛型指定了当前监听器正在监听的数据类型
public interface RecordListener<T extends Record> {

    /**
     * Determine if the listener was registered with this key.
     * 判断当前监听器是否监听着指定key的数据
     *
     * @param key candidate key
     * @return true if the listener was registered with this key
     */
    boolean interests(String key);

    /**
     * Determine if the listener is to be removed by matching the 'key'.
     * 判断当前监听器是否已经不再监听当前指定key的数据
     *
     * @param key key to match
     * @return true if match success
     */
    boolean matchUnlistenKey(String key);

    /**
     * Action to do if data of target key has changed.
     * 若指定key的数据发生了变更,则触发该方法的执行
     *
     * @param key   target key
     * @param value data of the key
     * @throws Exception exception
     */
    void onChange(String key, T value) throws Exception;

    /**
     * Action to do if data of target key has been removed.
     * 若指定key的数据被删除,则触发该方法的执行
     *
     * @param key target key
     * @throws Exception exception
     */
    void onDelete(String key) throws Exception;
}

Record是Nacos集群传输和存储的记录。

public interface Record {

    /**
     * get the checksum of this record, usually for record comparison.
     *
     * @return checksum of record
     */
    String getChecksum();
}

4.Cluster类和Instance类

Cluster类: 提供某一服务的Instance集群, 即隶属于某一Service的Instance集群。

&nbsp;

Instance: 注册到Nacos中的具体服务实例。

&nbsp;

5.ServiceManager类

ServiceManager: Nacos中所有service的核心管理者。其中serviceMap属性为Nacos Server端的服务注册表。

&nbsp;

serviceMap为Naocs Server端的服务注册表。serviceInfoMap为Nacos Client端的服务注册表

6.Synchronizer

service状态同步器

public interface Synchronizer {

    /**
     * Send message to server.
     * 将msg发送给指定的server
     *
     * @param serverIP target server address
     * @param msg      message to send
     */
    void send(String serverIP, Message msg);

    /**
     * Get message from server using message key.
     *
     * @param serverIP source server address
     * @param key      message key
     * @return message
     */
    Message get(String serverIP, String key);
}

send方法为将msg发送给指定的server, get方法为得到指定server的msg。

&nbsp;