Netflix Eureka - Eureka Server 服务注册

354 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

eureka server服务注册

eureka client 服务注册:InstanceInfoReplicator.start(); EurekaClient.register();

eureka client 所有的请求都会发送到eureka server的web应用的Filter(com.sun.jersey.spi.container.servlet.ServletContainer extends HttpServlet implements Filter),jersey的Filter会根据请求的路径,将请求转发给eureka core里面的resource。

package resources

eureka core项目的resources包:

  • ApplicationsResource:
  • class ApplicationResource:

ApplicationsResource

ApplicationsResource 实例化时通过注入EurekaServerContext设置EurekaServerConfig、PeerAwareInstanceRegistry、ResponseCache属性。

属性

EurekaServerConfig:eureka server 配置信息(加载的是eureka-server.properties和eureka-server-env.properties文件的配置项)

PeerAwareInstanceRegistry:可察觉到集群中其他节点的服务实例注册表(EurekaServerConfig、EurekaClientConfig、ServerCodes、EurekaClient)

ResponseCache:用于缓存响应数据(全量注册表、增量注册表)

接口

getApplicationResource:获取指定appName的ApplicationResource

getContainers:获取所有的Applications

getContainerDifferential:获取增量的Applications

ApplicationResources

属性

appName:服务名称

EurekaServerConfig:eureka-server.properties和eureka-server-env.properties文件的配置项

PeerAwareInstanceRegistry:能感知eureka server集群中其他节点的服务实例注册表

ResponseCache:PeerAwareInstanceRegistry.getResponseCache() 注册表缓存

接口

getApplication:获取Application

getInstanceInfo:获取InstanceInfo

addInstance:添加Instance,即注册服务实例

HTTP 请求

ApplicationResources接收http://localhost:8080/v2/apps/ServiceA请求。

ServiceA:appName(appId),服务名称。

ApplicationResource处理POST请求,获取eureka client发送的InstanceInfo实例及请求头里带的x-netflix-discovery-replication值。

ApplicationResource.addInstance()方法接收post请求的。接收的是一个InstanceInfo,代表了一个服务实例。

服务实例

InstanceInfo(服务实例):

(1)主机名、ip地址、端口号、url地址

(2)lease(租约)的信息:保持心跳的间隔时间,最近心跳的时间,服务注册的时间,服务启动的时间

注册表

PeerAwareInstanceRegistry:注册表,包含所有的服务实例注册的信息

PeerAwareInstanceRegistry.register()方法,将服务实例往注册表去进行注册,实际上会调用父类AbstractInstanceRegistry的register()方法中去了

一个服务可能存在多个服务实例,每个服务实例的服务名称当然是一样,但是服务实例id不一样。

服务可能会部署在多台机器上,每台机器上部署的就是一个服务实例。

服务实例注册表数据结构:ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry

注册逻辑

如果registry中不存在InstanceInfo,说明是第一个注册请求,将服务实例信息放到了一个registry中。

如果registry中已存在InstanceInfo,说明不是第一个注册请求,与注册表中的InstanceInfo的LastDirtyTimestamp比较,保留LastDirtyTimestamp比较大的InstancdInfo放入registry

可重入读写锁

read.lock():注册的时候,上的是读锁。多个服务实例,可以同时注册。

write.lock():获取增量注册实例时,上的是写锁。只允许同一时间一个线程访问。为了获取当前快照applications的一致性Hash值,此时不能对注册表有修改操作。