Eureka源码解析
Eureka源码解析1. Eureka基本概念2. Eureka 高可用2.1 服务注册--源码2.2 服务续约--源码2.3 获取服务注册列表信息--源码2.4 服务下线--源码2.5 服务剔除--源码2.6 为什么Eureka Client获取服务实例这么慢2.7 Eureka的自我保护模式3. 高可用的Eureka Server集群3.1 创建Eureka Server3.2 配置3.3 启..._eureka源码解析
文章信息
- 原文链接:https://jiayq.blog.csdn.net/article/details/104458740
- 发布时间:2020-02-23 16:32:23
- 阅读量:649
- 分类:微服务同时被 2 个专栏收录, 订阅专栏, spring boot
- 标签:#Eureka 源码解析, #Eureka 操作分析, #Eureka Server集群, #Eureka 自我保护模式, #Eureka与boot
摘要
文章浏览阅读649次。Eureka源码解析1. Eureka基本概念2. Eureka 高可用2.1 服务注册–源码2.2 服务续约–源码2.3 获取服务注册列表信息–源码2.4 服务下线–源码2.5 服务剔除–源码2.6 为什么Eureka Client获取服务实例这么慢2.7 Eureka的自我保护模式3. 高可用的Eureka Server集群3.1 创建Eureka Server3.2 配置3.3 启…_eureka源码解析
Eureka源码解析
- 1. Eureka基本概念
- 2. Eureka 高可用
- 2.1 服务注册–源码
- 2.2 服务续约–源码
- 2.3 获取服务注册列表信息–源码
- 2.4 服务下线–源码
- 2.5 服务剔除–源码
- 2.6 为什么Eureka Client获取服务实例这么慢
- 2.7 Eureka的自我保护模式
- 2.1 服务注册–源码
- 3. 高可用的Eureka Server集群
- 3.1 创建Eureka Server
- 3.2 配置
- 3.3 启动
- 3.1 创建Eureka Server
1. Eureka基本概念
- 服务注册:Register
当 Eureka Client向Eureka Server注册使,Eureka Client 提供自身的元数据,比如IP地址、端口运行url、主页地址等
- 服务注册:Register
- 服务续约:Renew
Eureka Client 在默认的情况下会每隔30秒发送一次心跳来进行服务续约。通过服务续约来告知 Eureka Server 该 Eureka Client 仍然可用,没有出现改障。正常情况下,如果Eureka Server在90 秒内没有收到 Eureka Client 的心跳,Eureka Server 会将 Eureka Client实例从注册列表中删除。注意:官网建议不要更改服务续约的间隔时间。
- 服务续约:Renew
- 获取服务注册列表信息:Fetch Registries
Eureka Client从 Eurcka Server获取服务注册表信息,并将其缓存在本地。Eureka Client会使用服务注册列表信息查找其他服务的信息,从而进行远程调用。该注册列表信息定时(每30秒)更新一次,每次返回注册列表信息可能与EurekaClient的缓存信息不同,EurekaClient会自己处理这些信息。如果由于某种原因导致注册列表信息不能及时匹配,Eureka Client会重新获取整个注册表信息。Eureka Seryer缓存了所有的服务注册列表信息,并将整个注册列表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。Eureka Client 和Eureka Server 可以使用 JSON 和XML数据格式进行通信。在默认的情况下,Eureka Client使用JSON格式的方式来获取服务注册列表的信息。
- 获取服务注册列表信息:Fetch Registries
- 服务下线:Cancel
Eureka Client 在程序关闭时可以向Eurcka Server发送下线请求。发送请求后,该客户端的实例信息将从 Eureka Server的服务注册列表中删除。该下线请求不会自动完成,需要在程序关闭时调用以下代码:
- 服务下线:Cancel
1
Discoverylanager.getInstance() .shutdownComponent ();
- 服务剔除:Eviction
在默认情况下,当 Eureka Client 连续90秒没有向 Eureka Server发送服务续约(即心跳)时,Eureka Server会将该服务实例从服务注册列表删除,即服务剔除。
- 服务剔除:Eviction
2. Eureka 高可用
服务注册,即 Eureka Client 向 Eureka Server提交自己的服务信息,包括IP地址、端口、ServiceId 等信息。如果 Eureka Client 在配置文件中没有配置 ServiceId,则默认为配置文件中配置的服务名,即${spring.application.name}的值。
当Eureka Client启动时,会将自身的服务信息发送到EurekaServer。这个过程其实非常简单。在
eureka-client-1.6.2.jar包。在 com.netflix.discovery 包下有一个 DiscoveryClient类,该类包含了Eureka Client 向 Eureka Server注册的相关方法。其中,DiscoveryClient 实现了 EurekaClient 接口,并且它是一个单例模式,而 EurekaClient继承了LookupService 接口。
2.1 服务注册–源码
在DiscoveryClient类中有一个服务注册的方法register(),该方法通过http请求向Eureka Server 注册。

在接口中有多个实现。

查看register调用关系,发现是InstanceInfoReplicator调用

其实现了Runnable接口

查看其初始化

发现是在DiscoveryClient初始化时初始化的。

其有一个获取时间间隔的方法调用。

默认是30秒。

Eureka Server的代码实现。
在EurekaBootStrap类中,初始化上下文时,初始化了两个类。
PeerAwareInstanceRegistryImpl
PeerEurekaNodes


进入父类的register方法,发现其信息被放到了一个Map中。


查看register方法的调用

ApplicationResource的addInstance方法调用。

2.2 服务续约–源码
Eureka Client的Renew方法,调用了register方法。870行。

Eureka Server方法




2.3 获取服务注册列表信息–源码
2.4 服务下线–源码

发现调用的是DiscoveryCilent的shutdown方法

eureka client调用服务端的cancle方法进行下线。

调用rest接口进行下线

eureka server端,提供了cancel接口,下线后,更新了服务列表

更新服务列表后,更新每个节点的服务列表

更新注册、删除、覆盖等

2.5 服务剔除–源码
服务剔除是eureka server端的操作

服务剔除先会查询服务的状态

然后记录时间,并获取下一次时间

没30秒心跳检测一次。

其心跳成功率为85%

2(60/30)0.85 = 3.4 取整 = 3 * 30 =90 秒
(许多资料直接说服务剔除的时间是90秒,我就想知道这个90秒是怎么来的。通过猜测其调度和更新的相关代码,用这种方式得到了90秒。不保证正确,如果有误,请指正。)
2.6 为什么Eureka Client获取服务实例这么慢
- (1) Eureka Client 的注册延迟 Fureka Client 启动之后,不是立即向Eureka Server注册的,而是有一个延迟向服务端注册的时间。通过跟踪源码,可以发现默认的延迟时间为 40秒,源码在 eurcka-client-1.6.2jar的DefaultEurekaClientConfig类中,代码如下:

- (2)EurekaServer的响应缓存
Euroka Server 维护每30秒更新一次响应缓存,可通过更改配置eurcka.server.rsponseCach UpdaientevalMs 来修改。所以即使是刚刚注册的实例,也不会立即出现在服务注册列表中。 - (3)Eureka Client的缓存
Eureka Client 保留注册表信息的缓存。该缓存每30秒更新一次(如前所述)。因此,Eureka Clien
刷新本地缓存并发现其他新注册的实例可能需要30秒。 - (4) LoadBalancer 的缓存
Ribbon的负载平衡器从本地的 Eureka Client 获取服务注册列表信息。Ribbon本身还维护了缓存,以避免每个请求都需要从Eureka Client获取服务注册列表。此缓存每30秒刷新一次(可由 ribbon.ServerListRefreshInterval 配置),所以可能至少需要30秒的时间才能使用新注册的实例。
综上因素,一个新注册的实例,默认延迟40秒向服务注册中心注册,所以不能马上被Eureka Server发现。另外,刚注册的EurekaClient也不能立即被其他服务调用,原因是调用由于各种缓存没有及时获取到最新的服务注册列表信息。
2.7 Eureka的自我保护模式
当有一个新的 Eureka Server出现时,它尝试从相邻Peer节点获取所有服务实例注册表息。如果从相邻的 Peer 节点获取信息时出现了故障,Eureka Server会尝试其他的Peer节点。
如果 Eureka Serve 能够成功获取所有的服务实例信息,则根据配置信息设置服务续约的阅值在任何时间,如果Eurcka Serve接收到的服务续约低于为该值配置的百分比(默认为15分内低于85%),则服务器开启自我保护模式,即不再剔除注册列表的信息。
这样做的好处在于,如果是 Eureka Server自身的网络问题而导致EurekaClient无法续约Eureka Client的注册列表信息不再被删除,也就是Eureka Client还可以被其他服务消费。
在默认情况下,Eureka Server的自我保护模式是开启的,如果需要关闭,则在配置文件添加以下代码:

3. 高可用的Eureka Server集群
在实际的项目中,可能有几十个或者几百个微服务实例,这时Eureka Server承担了非常高的负载。由于Eureka Server在整个微服务架构中非常重要,所以需要实现Eureka Server高可用集群。
3.1 创建Eureka Server
3.2 配置
springbooteurekaserver

springbooteurekaserver1

3.3 启动
在启动类增加注解后启动,没有先后循序,启动即可
然后启动Eureka Client,Eureka Client随便向其中一个注册即可。

然后访问主面板


两个Eureka Server 分别向对方注册,即两个Eureka Server 都拥有全部节点的信息。
那么结合其他负载均衡机制,可以实现Eureka Server的高可用。





