java语言中Nacos注册中心:Server端【启动和重要API】
前言
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
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
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01