EurekaServer如何维护命名服务
本文只讲EurekaServer如何装箱的过程,后续再详细讲Eureka本身的细节。
启动分析
@startuml
Bob -> Alice : hello
@enduml
从注解开始分析
打开@EnableEurekaServer
这个注解,可以发现了一个空的Class
org.springframework.cloud.netflix.eureka.server.EurekaServerMarkerConfiguration.Marker
通过以往经验,这个Marker可能是一个flag标记,对它进行findUsage分析
可以发现它是如下JavaConfig的前置条件
@Configuration
@Import(EurekaServerInitializerConfiguration.class)
@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
@EnableConfigurationProperties({ EurekaDashboardProperties.class,
InstanceRegistryProperties.class })
@PropertySource("classpath:/eureka/server.properties")
public class EurekaServerAutoConfiguration {}
这里导入的Bean太多,如果强行分析也是可以,但是很容易陷入Spring的细节中,投入时间划不来。仔细看可以发现javax.ws
这种涉及到RESTful接口的,打上断点
EurekaServerAutoConfiguration#jerseyApplication
分析它内部扫描的Class,整理所有接口如下
@Path(value=/{version}/instances)
@Path(value=/{version}/status)
@Path(value=/{version}/vips)
@Path(value=/serverinfo)
@Path(value=/{version}/svips)
@Path(value=/{version}/peerreplication)
@Path(value=/{version}/apps)
@Path(value=/{version}/asg)
在之前的Client抓包分析中,客户端通过HTTP请求进行RPC,所以只要分析断点上述Server端的接口,即可明白其内部工作原理了。
Eureka这里使用了jersey作为它的路由实现,在Filter中代替了Servlet的工作,这点类似Struts框架。
此外进行全局搜索,发现Spring也用mvc包装了部分Controller
org.springframework.cloud.netflix.eureka.server.EurekaController
断点请求
获取APP列表
比如最简单的接口
GET /eureka/apps/ HTTP/1.1
通过上面的jerseyApplication
可以发现如下类负责此接口
ApplicationsResource#ApplicationsResource(EurekaServerContext)
在这个类中的构造函数与路由位置,各打上断点后启动,发现没有断上,分析可能是lasyload模式,接着上curl
curl localhost:8761/eureka/apps
这次断点成功了,接着按照调用栈,在如下位置打上断点,可以发现Eureka在维护Apps使用了如下结构
ResponseCacheImpl#get(Key, boolean)