本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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值,此时不能对注册表有修改操作。