【源码分析】2020.3.12笔记——eureka的客户端(Hoxton版)

eureka的客户端

eurekak客户端同服务端一样,也是通过SPI计算完成的自动配置,它的自动配置类如下
在这里插入图片描述
eureka的client实例对象如下
在这里插入图片描述
下面是初始化client实例对象的方法
在这里插入图片描述
下面是判断客户端是否开启了服务发现和服务注册功能,我们可以通过配置开启或者关闭
在这里插入图片描述
创建三个线程池,为后面的执行定时任务做准备
在这里插入图片描述
下面是客户端从服务端拿取服务注册信息,fetchRegistry是服务发现的方法,如果没有发现,就会进入if判断通过fetchRegistryFromBackup从备用服务器获取
在这里插入图片描述

服务注册

下面就是客户端服务注册的方法
在这里插入图片描述
重点是register方法
在这里插入图片描述
实现服务注册逻辑的是AbstractJerseyEurekaHttpClient的register方法,可以发现就是发送了一个http的post请求
在这里插入图片描述

心跳续约

依然是在客户端实例的初始化方法中,在下面这个方法中初始化了很多定时任务
在这里插入图片描述
其中有一个定时任务是用于发送心跳给服务端的,逻辑代码还是在HeartbeatThread中
在这里插入图片描述
很简单就是一个run方法,其中renew方法执行发送心跳,后面记录操作时间
在这里插入图片描述
可以发现renew方法也只是发送一个http请求
在这里插入图片描述

服务发现

同样还是在初始化的时候实现了服务发现
在这里插入图片描述
同样也在定时任务中实现了
在这里插入图片描述
进入CacheRefreshThread方法
在这里插入图片描述
在refreshRegistry方法中同样也调用了这个服务发现方法
在这里插入图片描述
fetchRegistry就是服务发现的核心逻辑吗,至于forceFullRegistryFetch这个参数则代表是否强制全量拉取。

  • 全量拉取:把eureka服务端所有的注册信息拉取下来;
  • 增量拉取:把eureka最近(3分钟之内)更新的注册信息拉取下来。

注意下面首先通过getApplications方法获得本地缓存的服务信息。
在这里插入图片描述
在这里插入图片描述
其中进入全量拉取的条件有:

  1. 配置文件中配置的是全量拉取;
  2. 配置了vip地址,这个vip地址同样是在配置文件中配置,而且这样配置后客户端只会从配置的地址拉取数据;
  3. 传入的forceFullRegistryFetch为true;
  4. 本地缓存的服务信息对象为null;
  5. 本地缓存的服务信息对象的size为0;
  6. 本地缓存的服务信息对象的版本为-1。

这些条件和上图中的if条件一一对应,其中注意上面vip地址的配置方式如下
在这里插入图片描述
这里先看一下增量的方法
在这里插入图片描述
首先还是通过一个http请求向服务端获取增量的信息
在这里插入图片描述
如果什么都没拉取到还是会执行全量的拉取方法,如果吗,拉取到了就通过updateDelta方法缓存服务信息。
在这里插入图片描述
增量获取的信息需要进行处理,简单来说就是首先将增量的数据遍历,通过信息的类别(代码中就是ActionType)判断是需要将服务信息添加到本地缓存还是去除。
在这里插入图片描述
至于全量拉取的方法就更加简单了,就只是单纯发送http请求,获取响应中的数据,更新缓存。
在这里插入图片描述
至此我们可以回到服务端的服务发现模块,ApplicationsResource存在两个方法负责接收请求,分别处理全量拉取和增量拉取。通过方法中的key对象就可以分别请求的类型。

下面是全量拉取的请求
在这里插入图片描述
下面是增量拉取的请求
在这里插入图片描述
全量拉取的数据很容易拿到,无非是所有缓存服务信息,但是对于增量拉取的数据则不是这么简单,服务端为了缓存增量拉取的数据维护了一个队列,专门存放增量拉取的数据。

这个列队是在AbstractInstanceRegistry类(这个类的详细说明可以参考对另一篇对服务端的分析)中存储的
在这里插入图片描述
而为了维护这个队列在AbstractInstanceRegistry创建时开启了一个定时器,这个定时器会
在这里插入图片描述
服务端通过一个队列存储最近的服务操作的信息,通过一个定时器维护这个队列,这个定时器每隔30s会更新队列中的数据,这个队列存储最近发生状态改变的服务实例,如果超过3分钟没有更新状态就会清出这个队列。
在这里插入图片描述
下面就是从缓存中取数据代码,其中getApplicationDeltas方法就是增量更新中取队列中数据的方法
在这里插入图片描述
在这里插入图片描述
服务端还会发送一个hashcode给客户端,这个hashcode就是通过增量的数据计算的
在这里插入图片描述
客户端会接收到增量的数据和hashcode,下面会对比这个hashcode和客户端拉取的数据的hashcode,如果不一样代表客户端获取的数据和服务端应该发送的数据不一致,那就是获取失败,就会进入if通过reconcileAndLogDifference再次拉取数据。这个hashcode就是用来校验获取增量数据的。
在这里插入图片描述

服务下架

eureka客户端自动下架的方法,spring容器销毁时自动调用,不过这种方式很少见
在这里插入图片描述
服务下架方法
在这里插入图片描述
当然我们还可以直接通过实例对象直接调用
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程介绍 【完善体系+精品资料】本课程总计115课时,打造全网最全的微服务体系课程;从微服务是什么、能够做什么开始讲起,绝对零基础入门到精通类型。课程整体脉络十分清晰,每个章节一个知识点,画图+源码+运行讲解,不信你学不会。1、课程先讲解了什么是单体架构、什么是微服务架构、他们之间有什么区别和联系,各自有什么优缺点。2、从本质入手,使用最简单的Spring Boot搭建微服务,让你认清微服务是一种思想和解决问题的手段,而不是新兴技术。3、讲解Spring Boot 与 Spring Cloud 微服务架构之间的联系,原生的RestTemplate工具,以及Actuator监控端点的使用。4、带着微服务所带来的各种优缺点,为大家引入服务发现与注册的概念和原理,从而引入我们的第一个注册中心服务Eureka。5、引入负载均衡的理念,区分什么是服务端负载均衡,什么是客户端负载均衡,进而引入Ribbon负载均衡组件的详细使用。6、为了解决微服务之间复杂的调用,降低代码的复杂度,我们引入了Feign声明式客户端,让你几行代码学习服务的远程调用。7、为了解决服务之间的稳定性,避免发生雪崩问题,我们引入了Hystrix断路器,服务降级和熔断机制。8、微服务集群十分庞大,监控起来是十分困难的,尤其是对每一个接口的熔断情况进行监控,因此我们引入了Turbine微服务监控。9、微服务的调用是杂乱无章的,可以网状调用,怎么做到统一的入口出口,统一的授权、加密、解密、日志过滤,我们引入了第一代网关Zuul。10、微服务的配置分散,每次要修改配置都要重启服务,因此我们引入了Config配置中心。11、跟上主流,Consul是当前主流的服务注册与发现、配置中心一体化的解决方案。12、阿里的Nacos服务注册与发现、配置中心在国内炙手可热,Nacos 经历过双十一的微服务中间件。13、Turbin做微服务监控还是太弱,我们需要更强大,可视化,操作性更强的监控系统,因此我引入了Spring Boot Admin体系。14、Zuul已经停止更新支持,Spring Cloud官方推荐的二代网关Spring Cloud Gateway更加强大。15、微服务的安全架构体系虽然复杂,但是是有学习条例的,什么是认证授权、什么是OAuth2.0的原理、 JWT、怎么样去开发实现。 课程资料 【独家资料】1、课程附带全部63个项目源码,其中Hoxton版本项目源码37个,Edgware版本项目26个,2、230页高清PDF正课件。3、附带nacos、consul、cmder等视频配套软件。学习方法1、每一节课程均有代码,较好的方式为一边听我的讲解,一边使用我提供的项目代码进行观察和运行。2、课程体系庞大,但是并不杂乱,每个章节只针对一个知识点,减轻学习压力。3、坚持每天学习1~2个章节,可以在地铁、公交上用手机学习。【完善知识体系图】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值