找到console模块下的Nacos类直接运行,无需做任何的配置。不过,此时无法启动成功,因为其默认以 集群方式启动。所以可以在VM options中添加-Dnacos.standalone=true动态参数,再运行就没 有问题了。
由于使用内嵌Storage无法启动集群,所以若要以集群方式启动Nacos,首先需要修改console模块下的 application.properties。将其中的连接数据库URL中的数据库Server地址及要连接的数据库进行替换, 并修改数据库连接的用户名与密码。然后在VM options中添加类似-Dserver.port=8849的动态参 数,指定当前启动Nacos的端口号。
同理,设置不同的端口号,启动多台的Nacos Server。
该类为一个处理器,用于处理服务实例的心跳、注册等请求。
在Nacos客户端的一个微服务名称定义的微服务,在Nacos服务端是以Service实例的形式出现的。其类 似于ServiceInfo,只不过ServiceInfo是客户端服务,而core/Service是服务端服务。
Service类中有一个属性protectThreshold,保护阈值。与Eureka中的保护阈值对比:
Eureka:一旦健康实例数量小于阈值,则不再从注册表中清除不健康的实例Nacos:如果健康实例数量大于阈值,则消费者调用到的都是健康实例。一旦健康实例数量小于阈值,则消费者会从所有实例中进行选择调用,有可能会调用到不健康实例。这样可以保护健康的实例不会被压崩溃。Eureka:这个阈值针对的是所有服务中的实例Nacos:这个阈值针对的是当前Service中的服务实例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;
- }
- 复制代码
提供某一服务的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<>();
- }
- 复制代码
注册到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 = "_";
- }
- 复制代码
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();
- }
- 复制代码
同步器,是当前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);
- }