• Nacos注册中心7-Server端(启动和重要API)


    0. 环境

    • nacos版本:1.4.1
    • Spring Cloud : 2020.0.2
    • Spring Boot :2.4.4
    • Spring Cloud alibaba: 2.2.5.RELEASE

    测试代码:github.com/hsfxuebao/s…

    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集群中传输和存储的记录。

    1. // 泛型,指定监听的数据类型
    2. public interface RecordListener<T extends Record> {
    3. // 判断的当前监听器是否监听 指定key
    4. boolean interests(String key);
    5. boolean matchUnlistenKey(String key);
    6. // 若指定key的数据发生变更,则触发这个方法
    7. void onChange(String key, T value) throws Exception;
    8. // 若指定key的数据被删除,则触发这个方法
    9. void onDelete(String key) throws Exception;
    10. }
    11. 复制代码

    2.4 Cluster类

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

    1. public class Cluster extends com.alibaba.nacos.api.naming.pojo.Cluster implements Cloneable {
    2. private static final String CLUSTER_NAME_SYNTAX = "[0-9a-zA-Z-]+";
    3. private static final long serialVersionUID = 8940123791150907510L;
    4. /**
    5. * a addition for same site routing, can group multiple sites into a region, like Hangzhou, Shanghai, etc.
    6. */
    7. private String sitegroup = StringUtils.EMPTY;
    8. private int defCkport = 80;
    9. private int defIpPort = -1;
    10. @JsonIgnore
    11. private HealthCheckTask checkTask;
    12. // 持久实例集合
    13. @JsonIgnore
    14. private Set<Instance> persistentInstances = new HashSet<>();
    15. // 临时实例集合
    16. @JsonIgnore
    17. private Set<Instance> ephemeralInstances = new HashSet<>();
    18. @JsonIgnore
    19. private Service service;
    20. @JsonIgnore
    21. private volatile boolean inited = false;
    22. private Map<String, String> metadata = new ConcurrentHashMap<>();
    23. }
    24. 复制代码

    2.5 Instance类

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

    1. public class Instance extends com.alibaba.nacos.api.naming.pojo.Instance implements Comparable {
    2. private static final double MAX_WEIGHT_VALUE = 10000.0D;
    3. private static final double MIN_POSITIVE_WEIGHT_VALUE = 0.01D;
    4. private static final double MIN_WEIGHT_VALUE = 0.00D;
    5. private static final long serialVersionUID = -6527721638428975306L;
    6. private volatile long lastBeat = System.currentTimeMillis();
    7. @JsonIgnore
    8. private volatile boolean mockValid = false;
    9. // 对于持久实例,为true表示当前实例状态 不健康,即当前是被标记
    10. // 对于临时实例,为false 对临时实例没有意义
    11. private volatile boolean marked = false;
    12. private String tenant;
    13. private String app;
    14. private static final Pattern ONLY_DIGIT_AND_DOT = Pattern.compile("(\d|\.)+");
    15. private static final String SPLITER = "_";
    16. }
    17. 复制代码

    2.6 ServiceManager类

    Nacos中所有Service的核心管理者。其中一个很重要的属性是serviceMap,就是Nacos中的服务注册 表。该接口中有很多的方法,这些方法可以完成在nacos集群中相关操作的同步。

    1. @Component
    2. public class ServiceManager implements RecordListener<Service> {
    3. /**
    4. * Map(namespace, Map(group::serviceName, Service)).
    5. */
    6. // Server端注册表 是一个双层map
    7. // 外层map的key:namespaceId value为内层map
    8. // 内层map的key:group::serviceName value:为Service
    9. private final Map<String, Map<String, Service>> serviceMap = new ConcurrentHashMap<>();
    10. private final LinkedBlockingDeque<ServiceKey> toBeUpdatedServicesQueue = new LinkedBlockingDeque<>(1024 * 1024);
    11. // todo Service状态同步器
    12. private final Synchronizer synchronizer = new ServiceStatusSynchronizer();
    13. private final Lock lock = new ReentrantLock();
    14. // 一致性服务
    15. @Resource(name = "consistencyDelegate")
    16. private ConsistencyService consistencyService;
    17. private final SwitchDomain switchDomain;
    18. private final DistroMapper distroMapper;
    19. private final ServerMemberManager memberManager;
    20. private final PushService pushService;
    21. private final RaftPeerSet raftPeerSet;
    22. private int maxFinalizeCount = 3;
    23. private final Object putServiceLock = new Object();
    24. }
    25. 复制代码

    2.7 Synchronizer接口

    同步器,是当前Nacos主动发起的同步操作。其包含两个方法,分别表示当前Nacos主动发送自己的 Message给指定的Nacos;主动从指定Nacos中获取指定key的Message

    1. public interface Synchronizer {
    2. // 将msg发送给指定的server
    3. void send(String serverIP, Message msg);
    4. // 获取指定key的数据
    5. Message get(String serverIP, String key);
    6. }
  • 相关阅读:
    布隆过滤器原理及实现
    (七)笔记.net core学习之反射、加载dll、读取moudle、类、方法、特性
    INS惯性导航系统相关技术(概念版)
    在vue2和vue3中Vuex的使用及其持久化存储,mutation和actions的区别
    【一行记录】达梦timestamp转yyyy-mm-dd
    数据结构-Prim算法构造无向图的最小生成树
    一种高精度低功耗NB-IoT温度传感器
    面试:CountDownLatch、CyclicBarrier 原理
    QML代码生成
    Springboot 项目中实现文件上传(封装成上传工具模块)
  • 原文地址:https://blog.csdn.net/BASK2311/article/details/127699829