实战监听 Eureka client 的缓存更新

从 Eureka server 获取服务列表

  • Spring cloud 环境中的应用,如果注册到 Eureka server,就会从 Eureka server 获取所有应用的注册信息(也叫服务列表),然后保存到本地,这个操作是周期性的,默认每三十秒一次;
  • 以下是来自官方的架构图,可以看到 Application Service 向 Eureka Server 有 Get Registry 的请求:

实战内容

  • 本文是一篇实战的文章,实战内容如下:

  1. 启动 Eureka server;
  2. 开发一个应用 springcloudcustomizelistener,启动后会注册到 Eureka server;
  3. 此时该应用身份为 Eureka client,会周期性的从 Eureka server 获取服务列表(已有逻辑);
  4. 每次成功获取的服务列表成功都会存入本地缓存(已有逻辑);
  5. 存入缓存后,会在 spring 容器内发送广播(已有逻辑);
  6. 本次实战的重点就是自定义一个监听器来接收上述广播,收到广播后把详情用日志打印出来;
  7. 再启动另一个应用 springclouddeepprovider,也会注册到 Eureka server;
  8. 再去观察 springcloudcustomizelistener 的广播监听日志,会发现 springclouddeepprovider 的注册信息;

Eureka client 缓存服务列表的源码简介

  • 实战前,先对 Eureka client 缓存服务列表的实现源码做个简介,这样才能做出匹配的监听器;
  • 应用作为 Eureka Client 的启动时,在 com.netflix.discovery.DiscoveryClient 类的 initScheduledTasks 方法中,会启动周期性任务,每隔 30 秒从 Eureka server 获取服务列表信息,如下图,红框中的 TimedSupervisorTask 负责周期性执行,绿框中的 CacheRefreshThread 负责具体的更新逻辑:

  • 在 CacheRefreshThread 类中经过层层调用,获取服务列表并更新本地缓存的逻辑在 fetchRegistry 方法中实现,如下图,红框中的 getAndStoreFullRegistry 方法负责全量更新,绿框中的 getAndUpdateDelta 方法负责增量更新,黄框中的 onCacheRefreshed 方法就是今天的重点:发送广播,广播类型是服务列表的本地缓存已更新

  • onCacheRefreshed 方法在子类 CloudEurekaClient 中被重写,可见这里发送了一个普通的 spring 容器内广播,类型是 HeartbeatEvent,我们可以自定义监听类来接收广播,并通过泛型规定只接受 HeartbeatEvent 类型:

    @Override
    protected void onCacheRefreshed() {
        if (this.cacheRefreshedCount != null) { //might be called during construction and will be null
            long newCount = this.cacheRefreshedCount.incrementAndGet();
            log.trace("onCacheRefreshed called with count: " + newCount);
            //spring容器内广播,HeartbeatEvent实例在创建时收到两个参数:CloudEurekaClient实例和缓存刷新次数
            this.publisher.publishEvent(new HeartbeatEvent(this, newCount));
        }
    }

复制代码

实战应用设定

  • 本次实战要搭建一个小的 Spring Cloud 环境,包括以下应用:

源码下载

  • springclouddeepeureka 和 springclouddeepprovider 这两个应用,在文章《Spring Cloud 源码分析之 Eureka 篇第一章:准备工作》中已有详细介绍,本文中就不多说了,您可以参考文章,也可以在 github 下载这两个应用的源码,地址和链接信息如下表所示:

  • 这个 git 项目中有多个文件夹,本章源码分别在 springclouddeepeurek
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值