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)

获取Instance列表