• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

java语言中Nacos注册中心:Server端【启动和重要API】

武飞扬头像
juejin
帮助255

前言

java语言中Nacos注册中心: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集群中传输和存储的记录。

// 泛型,指定监听的数据类型
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);
}

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanehig
系列文章
更多 icon
同类精品
更多 icon
继续加载