文章目录
一、服务注册源码
1.1 服务注册入口ApplicationResource#addInstance
在
eureka中使用的web框架是jersey,和springMVC差不多,这里重点就是调用注册表注册服务

1.1.1 PeerAwareInstanceRegistryImpl#register
这里重点有两个步骤
- 更新本地注册表,把待注册的实例添加到本地注册表中。
- 同步给集群间其他节点。

1.1.1.1 AbstractInstanceRegistry#register
这里代码比较长重要有以下这几个步骤
- 更新注册表信息,这里注册表就是一个
map(key是appName,value是Lease(InstanceInfo)),这个lease其实就是租约的相关信息,其中会包含实例信息,ip,port和最后一次续约的时间戳,租期等,这里如果判断之前在注册表中就存在的话,看有没有变更过,通过变更时间来判断,如果没有,则继续使用原有的instance信息。如果是第一次注册肯定注册表里没有实例信息,那么就会将expectedNumberOfClientsSendingRenew+1,这个表示需要续约的客户端数量,然后就是调用updateRenewsPerMinThreshold更新下一接受续约的最少的阈值(跟自我保护有关,后续会讲),然后生成租约信息放入注册表中。- 塞入最近改变队列中,更新最后更新时间,这里最近改变队列
- 失效本地缓存(服务发现的时候会先去本地的一级二级缓存中获取,没有的话才会才回去注册表中查找)
public void register(InstanceInfo registrant, int leaseDuration, boolean isReplication) {
// 获取读锁
read.lock();
try {
// 先从注册表中 获取对应 appName 的 map 集合
Map<String, Lease<InstanceInfo>> gMap = registry.get(registrant.getAppName());
REGISTER.increment(isReplication);
// 不存在就创建,并且塞入 appName 的 map 集合
if (gMap == null) {
final ConcurrentHashMap<String, Lease<InstanceInfo>> gNewMap =
new ConcurrentHashMap<String, Lease<InstanceInfo>>();
// 存在就不会 put ,并将存在的那个返回来,不能存在的话进行 put ,返回 null
// 试想该地使用 putIfAbsent 的作用 : double check, 虽然使用了concurrentHashMap
// 保证了元素的增删改查没有问题,但是还是不能保证 gNewMap 只存在一个
gMap = registry.putIfAbsent(registrant.getAppName(), gNewMap);
if (gMap == null) {
gMap = gNewMap;
}
}
// 获取该实例 id 对应的租约信息
Lease<InstanceInfo> existingLease = gMap.get(registrant.getId());
// Retain the last dirty timestamp without overwriting it, if there is already a l

本文深入解析了Eureka服务注册的核心源码,包括服务注册入口、PeerAwareInstanceRegistryImpl的register方法以及AbstractInstanceRegistry的实现。在register方法中,首先更新本地注册表,然后同步到其他节点。此外,还介绍了如何处理已有租约信息和生成新的租约,以及如何处理服务状态的变更。最后,提到了deltaRetentionTask用于清理最近改变队列中超过三分钟未更新的条目。

最低0.47元/天 解锁文章
5320

被折叠的 条评论
为什么被折叠?



