Nacos注册中心7-Server端(启动和重要API)
欢迎大家关注 github.com/hsfxuebao ,希望对大家有所帮助,要是觉得可以的话麻烦给点一下Star哈
0. 环境
- nacos版本:1.4.1
- Spring Cloud : 2020.0.2
- Spring Boot :2.4.4
- Spring Cloud alibaba: 2.2.5.RELEASE
1. Server端启动
1.1 单机启动
找到console
模块下的Nacos类直接运行,无需做任何的配置。不过,此时无法启动成功,因为其默认以
集群方式
启动。所以可以在VM options
中添加-Dnacos.standalone=true
动态参数,再运行就没
有问题了。
1.2 Nacos集群启动
由于使用内嵌Storage无法启动集群,所以若要以集群方式启动Nacos,首先需要修改console模块下的
application.properties
。将其中的连接数据库URL中的数据库Server地址及要连接的数据库进行替换,
并修改数据库连接的用户名与密码。然后在VM options
中添加类似-Dserver.port=8849
的动态参
数,指定当前启动Nacos的端口号。
同理,设置不同的端口号,启动多台的Nacos Server。
2. 重要API
2.1 InstanceController类
该类为一个处理器,用于处理服务实例
的心跳、注册等请求。
2.2 core/Service类
在Nacos客户端的一个微服务名称定义的微服务,在Nacos服务端是以Service
实例的形式出现的。其类
似于ServiceInfo
,只不过ServiceInfo是客户端服务,而core/Service是服务端服务
。
Service类中有一个属性protectThreshold,保护阈值
。与Eureka中的保护阈值对比:
- 相同点:都是一个0-1的数值,表示健康实例占所有实例的比例
- 保护方式不同:
Eureka
:一旦健康实例数量小于阈值,则不再从注册表中清除不健康的实例Nacos
:如果健康实例数量大于阈值,则消费者调用到的都是健康实例。一旦健康实例数量小于阈值,则消费者会从所有实例中进行选择调用,有可能会调用到不健康实例。这样可以保护健康的实例不会被压崩溃。
- 范围不同:
Eureka
:这个阈值针对的是所有服务中的实例Nacos
:这个阈值针对的是当前Service中的服务实例
2.3 RecordListener接口
Service
类实现了RecordListener
接口。这个接口是一个数据监听的接口。即Service类本身还是一个监
听器,用于监听指定数据的变更或删除。
Record接口RecordListener
接口的泛型为指定了该监听器所要监听的实体类型。这个类型是一个Record接口的子接口。Record是一个在Nacos集群中传输和存储的记录。
// 泛型,指定监听的数据类型
public interface RecordListener<T extends Record> {
// 判断的当前监听器是否监听 指定key
boolean interests(String key);
boolean matchUnlistenKey(String key);
// 若指定key的数据发生变更,则触发这个方法
void onChange(String key, T value) throws Exception;
// 若指定key的数据被删除,则触发这个方法
void onDelete(String key) throws Exception;
}
2.4 Cluster类
提供某一服务的Instance
集群,即隶属于某一Service的Instance集群
。
public class Cluster extends com.alibaba.nacos.api.naming.pojo.Cluster implements Cloneable {
private static final String CLUSTER_NAME_SYNTAX = "[0-9a-zA-Z-]+";
private static final long serialVersionUID = 8940123791150907510L;
/**
* a addition for same site routing, can group multiple sites into a region, like Hangzhou, Shanghai, etc.
*/
private String sitegroup = StringUtils.EMPTY;
private int defCkport = 80;
private int defIpPort = -1;
@JsonIgnore
private HealthCheckTask checkTask;
// 持久实例集合
@JsonIgnore
private Set<Instance> persistentInstances = new HashSet<>();
// 临时实例集合
@JsonIgnore
private Set<Instance> ephemeralInstances = new HashSet<>();
@JsonIgnore
private Service service;
@JsonIgnore
private volatile boolean inited = false;
private Map<String, String> metadata = new ConcurrentHashMap<>();
}
2.5 Instance类
注册到Nacos中的具体服务实例
。
public class Instance extends com.alibaba.nacos.api.naming.pojo.Instance implements Comparable {
private static final double MAX_WEIGHT_VALUE = 10000.0D;
private static final double MIN_POSITIVE_WEIGHT_VALUE = 0.01D;
private static final double MIN_WEIGHT_VALUE = 0.00D;
private static final long serialVersionUID = -6527721638428975306L;
private volatile long lastBeat = System.currentTimeMillis();
@JsonIgnore
private volatile boolean mockValid = false;
// 对于持久实例,为true表示当前实例状态 不健康,即当前是被标记
// 对于临时实例,为false 对临时实例没有意义
private volatile boolean marked = false;
private String tenant;
private String app;
private static final Pattern ONLY_DIGIT_AND_DOT = Pattern.compile("(\d|\.)+");
private static final String SPLITER = "_";
}
2.6 ServiceManager类
Nacos中所有Service的核心管理者
。其中一个很重要的属性是serviceMap
,就是Nacos中的服务注册 表
。该接口中有很多的方法,这些方法可以完成在nacos集群中相关操作的同步。
@Component
public class ServiceManager implements RecordListener<Service> {
/**
* Map(namespace, Map(group::serviceName, Service)).
*/
// Server端注册表 是一个双层map
// 外层map的key:namespaceId value为内层map
// 内层map的key:group::serviceName value:为Service
private final Map<String, Map<String, Service>> serviceMap = new ConcurrentHashMap<>();
private final LinkedBlockingDeque<ServiceKey> toBeUpdatedServicesQueue = new LinkedBlockingDeque<>(1024 * 1024);
// todo Service状态同步器
private final Synchronizer synchronizer = new ServiceStatusSynchronizer();
private final Lock lock = new ReentrantLock();
// 一致性服务
@Resource(name = "consistencyDelegate")
private ConsistencyService consistencyService;
private final SwitchDomain switchDomain;
private final DistroMapper distroMapper;
private final ServerMemberManager memberManager;
private final PushService pushService;
private final RaftPeerSet raftPeerSet;
private int maxFinalizeCount = 3;
private final Object putServiceLock = new Object();
}
2.7 Synchronizer接口
同步器
,是当前Nacos主动发起的同步操作。其包含两个方法,分别表示当前Nacos主动发送自己的 Message给指定的Nacos;主动从指定Nacos中获取指定key的Message
。
public interface Synchronizer {
// 将msg发送给指定的server
void send(String serverIP, Message msg);
// 获取指定key的数据
Message get(String serverIP, String key);
}
参考文章
nacos-1.4.1源码分析(注释) springcloud-source-study学习github地址 深度解析nacos注册中心 mac系统如何安装nacos