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集群。
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。