Eureka源码梳理

省流:eureka源码梳理

一.EurekaServerlnitializerConfiguration源码梳理

1.pom.xml文件中引入依赖:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2.该依赖引入一个org.springframework.cloud:spring-cloud-netflix-eureka-server:2.2.2.RELEASE包:
在这个包里进入下面这个目录:
spring-cloud-netflix-eureka-server-2.2.2.RELEASE.jar library root/
META-INF/
spring.factories/

3.spring.factories文件如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration

在springboot启动时,springboot启动类默认扫描和它同级目录下的包,导入的依赖所引入的jar包对该springboot来说是一个第三方web的包,所以要在这里写上把它装配到springboot环境中

4.在eureka启动类中的注解@EnableEurekaServer里面有一个@Import(EurekaServerMarkerConfiguration.class)注解导入了一个EurekaServerMarkerConfiguration,进入该类发现里面注入了一个bean,new了一个空类

5.进入到EurekaServerAutoConfiguration中,注解@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class),意思是当这个注解里面的参数有EurekaServerMarkerConfiguration.Marker.class这个类的时候,才会加载被它注解的EurekaServerAutoConfiguration配置类

6.总结:所以@EnableEurekaServer的作用就是new一个bean,也就是Maker这个空类,而在@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)注解中,Maker便是作为该注解的开关,也就是说**@EnableEurekaServer和pom文件组成了eureka server**

7.EurekaServerInitializerConfiguration一导入就会执行它里面的start方法:因为EurekaServerAutoConfiguration中注解@Import(EurekaServerInitializerConfiguration.class)里面的参数是一个配置类EurekaServerInitializerConfiguration,实现了SmartLifecycle接口,SmartLifecycle接口又继承了Lifecycle接口,Lifecycle接口里面有一个start方法

8.在EurekaServerInitializerConfiguration中的start方法里面eurekaServerBootstrap.contextInitialized处打上断点,进入到contextInitialized中:

初始化环境	
initEurekaEnvironment();

9.进入到initEurekaServerContext()中:

EurekaServerContextHolder.initialize(this.serverContext);
拉取其他节点的信息
int registryCount = this.registry.syncUp();
this.registry.openForTraffic(this.applicationInfoManager, registryCount);

10.进入到中openForTraffic接口中:
(ctrl+鼠标左键)点击 void openForTraffic()
在这里插入图片描述
或者点击左侧箭头并选择InstanceRegistry实现类

11.进入到super.openForTraffic中:

期望的客户端发送的续约的次数
this.expectedNumberOfClientsSendingRenews = count;
更新续约的每分钟的阈值,每分钟更新多少次有一个阈值
updateRenewsPerMinThreshold();

12.进入到super.postInit()中:
下面这段代码意思是:在server端会定期地将没有心跳的服务剔除
如果我的服务挂了且剔除地慢了,那么客户端就会拉取到不可用的服务

里面设置了一个剔除任务
evictionTaskRef.set(new EvictionTask());
        evictionTimer.schedule(evictionTaskRef.get(),
serverConfig.getEvictionIntervalTimerInMs(),
                serverConfig.getEvictionIntervalTimerInMs());

getEvictionIntervalTimerInMs():剔除的时间间隔的毫秒数
优化:Timer
原因:Timer的一个定时器需要一个线程去处理,如果每个任务都交给一个新的Timer处理,线程创建等消耗资源。如果对一个Timer设置了多个任务,要是有一个任务没有捕获住异常,那么会导致后面的任务都无法执行了。所以推荐使用ScheduledExecutorService来替换Timer。

13.进入到evictionTaskRef.set(new EvictionTask())中的EvictionTask()中:

14.进入到EvictionTask中run方法中的evict里:

得到注册表的大小:总大小
int registrySize = (int) getLocalRegistrySize();
注册表大小与阈值的百分比相乘
        int registrySizeThreshold = (int) (registrySize * serverConfig.getRenewalPercentThreshold());
算出要剔除的数量
        int evictionLimit = registrySize - registrySizeThreshold;
然后进行剔除操作

优化:和自我保护有关
例如:
A: 10台微服务:阈值为0.7,挂了3台服务器 ——》剩余服务占比70%

B:100台微服务:阈值为0.7,挂了9台服务器 ——》剩余服务占比93%

如果阈值设置为:0.8

当开启自我保护:A便触发自我保护了,如果A再挂一台服务器,就不会把第四台服务器剔除,但是当别的服务调用该服务时,便会出现问题

所以服务少,不开自我保护;在服务有大量数量的情况下,有个别的服务发生网络抖动是很正常的,但是会导致server收不到心跳,这时候就不应该把它踢掉,而是用自我保护把它保护起来

二.自我保护

当public boolean isLeaseExpirationEnabled()为false,不剔除服务;为true,则剔除服务,此时自我保护开始。而当 isLeaseExpirationEnabled: 此结果为true,继续剔除服务。if结果为false,走else,然后 判断最后一分钟续约数是否大于阈值,结果为true,剔除服务;最后一分钟小于阈值,为false,不剔除服务,自我保护正式开启。

三.三级缓存

三级缓存梳理图:
在这里插入图片描述当别的服务向eureka server注册的时候,会走到eureka server的方法:public Response addInstance
当服务注册到register的时候,会执行invalidate方法使缓存失效(即让readWriteCacheMap中的数据失效)

四.CAP:满足AP

在这里插入图片描述
不满足C的原因:网络不好的情况下,还是可以拉取到注册表进行调用的,但是不能保证数据的一致性

五.服务注册与服务发生的关系

在这里插入图片描述

六.集群同步

集群同步:
1.注册: 第一个节点注册进来: null(二次true),true.equls 后面那个值是false (二次: true) .
2.续约: 一直同步。所有集群
3.下线: 和2一样。
4.剔除: 没有同步这项业务,每个eureka服务都有自己的剔除

七.eurekacontroller源码梳理

在这里插入图片描述

八.client端源码梳理

在这里插入图片描述

## 九.eureka源码梳理:

在这里插入图片描述
结语:

著此篇,与君享,互勉之,共进步!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值