实战监听 Eureka client 的缓存更新
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
从 Eureka server 获取服务列表
Spring cloud 环境中的应用,如果注册到 Eureka server,就会从 Eureka server 获取所有应用的注册信息(也叫服务列表),然后保存到本地,这个操作是周期性的,默认每三十秒一次;
以下是来自官方的架构图,可以看到 Application Service 向 Eureka Server 有 Get Registry 的请求:
参考文章
如果您有兴趣,想深入了解 spring 广播机制或者 Eureka client 更新服务列表,推荐您参考以下两篇文章:
《Spring Cloud 源码分析之 Eureka 篇第五章:更新服务列表 》
实战内容
本文是一篇实战的文章,实战内容如下:
启动 Eureka server;
开发一个应用 springcloudcustomizelistener,启动后会注册到 Eureka server;
此时该应用身份为 Eureka client,会周期性的从 Eureka server 获取服务列表(已有逻辑);
每次成功获取的服务列表成功都会存入本地缓存(已有逻辑);
存入缓存后,会在 spring 容器内发送广播(已有逻辑);
本次实战的重点就是自定义一个监听器来接收上述广播,收到广播后把详情用日志打印出来;
再启动另一个应用 springclouddeepprovider,也会注册到 Eureka server;
再去观察 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 类型:
实战应用设定
本次实战要搭建一个小的 Spring Cloud 环境,包括以下应用:
源码下载
springclouddeepeureka 和 springclouddeepprovider 这两个应用,在文章《Spring Cloud 源码分析之 Eureka 篇第一章:准备工作》中已有详细介绍,本文中就不多说了,您可以参考文章,也可以在 github 下载这两个应用的源码,地址和链接信息如下表所示:
这个 git 项目中有多个文件夹,本章源码分别在 springclouddeepeureka、springclouddeepprovider 这两个文件夹下,如下图红框所示:
启动 springclouddeepeureka
应用 springclouddeepeureka 开发完成后就立即启动,在浏览器访问地址:http://localhost:8081,可见 Eureka server 已经启动,不过还没有任何应用注册上来,如下图:
开发 springcloudcustomizelistener
接下来一起开发应用 springcloudcustomizelistener,在此应用中添加自定义的 spring 广播监听器,如果您不想敲代码,也可以从 github 上直接下载源码,地址和链接信息如下表所示:
这个 git 项目中有多个文件夹,本章源码在 springcloudcustomizelistener 文件夹下,如下图红框所示:
一起来开发吧:
创建一个 springboot 的 web 应用,pom.xml 内容如下,注意为了在日志中展示更详细的内容,依赖了 fastjson 库:
应用配置文件 application.yml 的内容如下:
创建监听器 EurekaCacheRefreshListener.java,前面已经分析过 HeartbeatEvent 实例的两个成员变量,值为缓存刷新次数和 CloudEurekaClient 实例,在收到广播时,将这两个成员变量都在日志中打印出来:
启动应用,等待大约 30 秒左右,EurekaCacheRefreshListener 中的日志就会在控制台输出,内容十分丰富,建议您复制这些内容去在线格式化 JSON 的网站做一下格式化再来看,下面列出部分关键信息,其他的内容已经略去:
如上所示,当前应用的实例信息在本地已经缓存了;
启动 springclouddeepprovider
应用 springclouddeepprovider 是最后一个启动的应用,启动该应用后,再去观察 springcloudcustomizelistener 的日志,发现应用 springclouddeepprovider 的注册信息已经获取到了:
至此,本次实战就完成了,通过开发自定义的广播监听器,我们对 Eureka 的注册发现机制有了进一步了解,在您的 Spring Cloud 学习过程中,希望本文能祝您一臂之力;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/c717c9087514fbbb31854988f】。文章转载请联系作者。
评论