Netflix源码解析之Eureka:Eureka client 到Server的调用过程

前面一篇文章中介绍了spring cloud会自动的在服务端维护一个自己的org.springframework.cloud.netflix.eureka.EurekaDiscoveryClient,其实是对netflix原生的?com.netflix.discovery.EurekaClient的一个封装。在这里向了解下这个client是怎样工作的,怎样去和eureka server通信的。在这篇文章中重点就是粗线条的知道下eureka client 到server的整个通信(交互)的过程(通道或者方式)。不是对每个接口的详细追踪。管用非常重要的register操作见Spring-cloud & Netflix 源码解析:Eureka client 注册过程
从client提供的API已经知道了,虽然有spring cloud的封装,但是真正实现还是netflix原生的client,即com.netflix.discovery.EurekaClient。观察com.netflix.discovery.DiscoveryClient 源码看到维护有一个本地对象:

来存储所有的注册服务信息。观察Applications的结构是对所有注册信息的封装, 猜这应该是该客户端对所有注册信息的缓存。这样不管是查询服务的,还是查询服务实例的,也就是从在从这个结构中获取到。即使服务端不可达,也能保证本地的服务总能获取到注册信息。

看这个对象怎样被维护也就大概能理解eureka client的工作。应该也就是定期从服务端给本地刷新呗。

首次从DiscoveryClient?构造函数中调用的initScheduledTasks方法说起。初始化了多个定时任务,其中一个定时任务就是间隔的获取远端的注册信息。

使用CacheRefreshThread线程中定时执行refresh操作。

refresh操作的内部实现是

获取远端注册信息,根据参数会决定是调用getAndStoreFullRegistry()或者getAndUpdateDelta(applications)获取服务端的注册信息刷新client的缓存

比如getAndStoreFullRegistry方法的调用,看到里面有个httpclient。

这里才看到如何调用远端eureka的注册信息,是通过一个httpclient来完成的。eureka client访问server的接口定义在EurekaHttpClient中。这也是eureka server向外提供的全部数据接口。

eureka_http_client

 

com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient.getApplications其实就是发起一个Rest请求。

再观察下服务端的注册信息怎样发布出来。服务端的一个rest 的resource来提供服务。提供的服务在这里可以找到:

https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

实现是在这样一组resource中提供:

ApplicationsResource_packages
如前面例子中对apps/的 请求的资源是:. com.netflix.eureka.resources.ApplicationsResource.getContainers

这个resource通过ResponseCacheImpl来访问到 AbstractInstanceRegistry中提供的接口来获取数据。AbstractInstanceRegistry 是真正存储和处理注册信息的地方,在服务端存储和注册信息。


至此,erueka client和server的交互方式差不多就能理出来。

原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba

本文链接地址: Netflix源码解析之Eureka:Eureka client 到Server的调用过程


, , ,

Trackbacks/Pingbacks

  1. Spring-cloud & Netflix 源码解析之Eureka | idouba - 2016年4月17日

    […] Spring-cloud & Netflix 源码解析:Eureka client 到Server的调用过程 […]

  2. Spring-cloud & Netflix 源码解析:Eureka client 注册过程 | idouba - 2016年3月17日

    […] 记录下eureka client如何将本地服务的注册信息发送到远端的注册服务器eureka server上。不像上文中讲到的get操作,服务需要自己发起读取注册信息来进行自己后续的服务调用。服务注册可以认为是Eureka client自己完成,不需要服务来费心。 […]

发表评论