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
- 3.RecordListener接口和Record接口
- 4.Cluster类和Instance类
- 5.ServiceManager类
- 6.Synchronizer
 
 
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集群。

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

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

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。




















