Eureka源码(一)— eureka server启动
2021-11-08 11:13:46 2 举报
eureka源码,server启动
作者其他创作
大纲/内容
结束
服务实例构造
作为Eureka Client完成构造
eureka server集群,处理Peer节点相关事情
eureka运行核心流程
eureka的服务端,其实就是eureka的注册中心
EUREKA_PROPS_FILE,对应着要加载的eureka的配置文件的名字。默认为eureka-server
EurekaMonitors.registerAllStats();
环境初始化
可以认为EurekaInstanceConfig是服务实例相关的一些配置。eureka server同时也是一个eureka client,因为他可能要向其他的eureka server去进行注册,组成一个eureka server的集群。eureka server把自己也当做是一个eureka client,也就是一个服务实例
初始化数据中心的配置如果没有配置就是DEFAULT
如果要抓取注册表,会先注册一个定时任务,每隔一定时间(默认是30s),去执行CacheRefreshThread,放到调度线程池里---------------------------------------------------------------------------------------------------------
property(key):archaius.deployment.datacenter
监控相关联
配置文件加载
创建ConcurrentCompositeConfiguration实例,实例加入了一堆config,然后返回这个实例,作为所谓的那个配置的单例
对下面5个步骤分别描述
serverContext.initialize();
EurekaClientConfig
支持心跳的线程池
----------------------------------------------------------------------------------------------------创建了服务实例的状态变更的监听器,如果配置了监听,那么就会注册监听器
基于EurekaServerConfig(eureka server配置)、PeerAwareInstanceRegistry(注册表)、PeerEurekaNodes(eureka server集群)、ApplicationInfoManager(服务实例)构造eureka server上下文EurekaServerContext
eureka源码主要结构
eureka
构建的时候,用的是EurekaClient的子类,DiscoveryClient基于ApplicationInfoManager和eureka client一起构建DiscoveryClient
构造感知eureka server集群的注册表PeerAwareInstanceRegistry
DefaultEurekaServerConfig提供的获取配置项的各个方法,都是通过硬编码的配置项名称,从DynamicPropertyFactory中获取配置项的值DynamicPropertyFactory是从ConfigurationManager那儿来的,也包含了所有配置项的值在获取配置项的时候,如果没有配置,那么就会有默认的值,全部属性都是有默认值的例如:连接节点服务器超时时间配置
InstanceInfo instanceInfo
PeerAwareInstanceRegistry registry
构造eureka server集群的信息PeerEurekaNodes
eureka-server --> build.gradle中的依赖和构建的配置
基于EurekaInstanceConfig和InstnaceInfo,构造了ApplicationInfoManager后面会基于这个ApplicationInfoManager对服务实例进行一些管理包含了服务实例的信息、配置,作为服务实例管理的一个组件
PeerEurekaNodes peerEurekaNodes
保存EurekaInstanceConfig和InstanceInfo
生成
initScheduledTasks();
EurekaInstanceConfig instanceConfig
ApplicationInfoManager applicationInfoManager
eureka使用的例子
加载eureka-server.properties配置文件构造EurekaServerConfig
基于eureka server集群的信息,初始化注册表将eureka server集群中所有的eureka server的注册表的信息抓取过来,放到本地的注册表中,跟eureka server集群之间的注册表信息互换有关联的
从相邻的eureka节点拷贝注册信息
Eureka Server启动流程图
从相邻的eureka server节点拷贝注册表
支持缓存刷新的线程池
将eureka-server.properties中的配置加载到了一个Properties对象中,然后将Properties对象中的配置放到ConfigurationManager中去,此时ConfigurationManager中就有了所有的配置了
eureka-server web.xml --> listener --> 4个filter --> jersy filter --> filter mapping --> welcome file
eureka-server
EurekaServerContext serverContext
ApplicationInfoManager
用上述配置文件中的配置进行代码处理
eureka-core
开始
服务器上下文构造
eureka server启动
如果要向eureka server进行注册,会生成定时任务,每隔一定时间发送心跳,执行HeartbeatThread
ConfigurationManager.loadCascadedPropertiesFromResources(eurekaPropsFile);
initEurekaServerContext();
eureka的单元测试工具类
支持底层的eureka client跟eureka server进行网络通信的组件对网络通信组件进行了一些初始化的操作
eureka server的启动,相当于是注册中心的启动 eureka client的启动,相当于是服务的启动
DiscoveryClient 构造流程
Eureka-Client 自身初始化过程中,涉及到主要对象
读取eureka-client.properties中eureka client配置构造EurekaClientConfig、基于ApplicationInfoManager和EurekaClientConfig构造EurekaClient(DiscoveryClient)
EurekaClientConfig也是去读eureka-client.properties里的一些配置对外暴露了一大堆的配置项,这里包含的是EurekaClient相关的一些配置项。EurekaClientConfig和EurekaInstanceConfig的区别EurekaInstanceConfig,重在应用实例,例如,应用名、应用的端口等等。EurekaClientConfig,重在 Eureka-Client,例如, 连接的 Eureka-Server 的地址、获取服务提供者列表的频率、注册自身为服务提供者的频率等等。
感知eureka server集群的服务实例注册表假如有一个eureka server集群,这里包含了其他的eureka server中的服务实例注册表的信息的
将EurekaServerContext放在了holder中,在整个系统运行期间,若要使用EurekaServerContext,直接从holder中获取
启动eureka server集群更新一下eureka server集群的信息,让当前的eureka server感知到所有的其他的eureka server。设置定时调度任务,就一个后台线程,每隔一定的时间,更新eureka server集群的信息
EurekaClient
EurekaServerContext进行初始化1、更新eureka server集群信息2、基于eureka server集群信息初始化注册表
registry.syncUp();
eureka的客户端,注册到eureka上面去的一个服务无论是你要注册,还是要发现别的服务,无论是服务提供者还是服务消费者,都是一个eureka客户端
初始化ConfigurationManager的实例
将之前构造好的所有的对象,都放在EurekaServerContext里,代表了当前这个eureka server的一个服务器上下文,包含了服务器需要的所有的东西
初始化调度任务
创建了服务实例副本传播器,将自己作为一个定时任务进行调度
初始化环境(数据中心、运行环境)
InstanceInfo
eureka-server的初始化逻辑入口在前面介绍的web.xml的listener监听器EurekaBootStrapEurekaBootStrap在eureka-core项目中,contextInitialized()为初始化方法
EurekaClient eurekaClient
ConfigurationManager.getConfigInstance()方法配置管理器的初始化,管理eureka所有的配置,读取配置文件里的配置到内存里,供后续的eureka-server运行来使用单例模式(double check + volatile来实现线程安全的单例模式)
上方代码标识处是创建instanceInfo的方法InstanceInfo,可以认为是当前这个服务实例本身的信息,直接用了构造器模式,用InstanceInfo.Builder来构造一个复杂的代表一个服务实例的InstanceInfo对象。核心的思路是,从EurekaInstanceConfig中,读取各种各样的服务实例相关的配置信息,再构造了几个其他的对象,最终完成了InstanceInfo的构建
eureka-examples
DefaultEurekaServerConfig.init()
EurekaInstanceConfig
property(key):archaius.deployment.environment
支持调度的线程池
initEurekaEnvironment();
EurekaTransport eurekaTransport
初始化eurueka运行的环境如果没有配置,默认设置为test环境
eureka-client
eureka-test-utils
EurekaServerConfig eurekaServerConfig = new DefaultEurekaServerConfig();
读取eureka-client.properties中服务实例配置构造EurekaInstanceConfig、构造服务实例信息InstanceInfo、构造服务实例信息管理器ApplicationInfoManager
基于jsp开发的eureka控制台,web页面,上面可以看到各种注册服务
EurekaServerContextHolder.initialize(serverContext);
eureka-resources
EurekaClientConfig eurekaClientConfig
将eureka-client.properties文件中的配置加载到ConfigurationManager中去,然后基于EurekaInstanceConfig对外暴露的接口来获取这个eureka-client.properties文件中的一些配置项的读取
注册监控
处理是否要注册以及抓取注册表
EurekaServerConfig,代表了eureka-server需要的所有的配置项,通过接口定义了大量的方法,可以从这里获取所有需要的配置DefaultEurekaServerConfig,是上面那个接口的实现类,创建实例的时候,会执行一个init()方法,在这个方法中,就会完成eureka-server.properties文件中的配置项的加载
把eureka-client、eureka-core、eureka-resources打包成了一个war包eureka-server自己本身也是一个eureka-client,同时也是注册中心,同时也提供eureka控制台。真正的使用的注册中心
读取EurekaClientConfig,包括EurekaTransportConfig
1、eureka client往eureka server注册的过程,服务注册;2、服务发现,eureka client从eureka server获取注册表的过程;3、服务心跳,eureka client定时往eureka server发送续约通知(心跳);4、服务实例摘除;通信,限流,自我保护,server集群。
compile project(':eureka-client')eureka server依赖eureka clienteureka server也是一个eureka client,在集群模式的时候,eureka server也要扮演eureka client的角色,往其他的eureka server上去注册。compile project(':eureka-core')eureka core,扮演了核心的注册中心的角色,接收别人的服务注册请求,提供服务发现的功能,保持心跳(续约请求),摘除故障服务实例。eureka server依赖eureka core的,基于eureka core的功能对外暴露接口,提供注册中心的功能compile \"com.sun.jersey:jersey-server:$jerseyVersion\"compile \"com.sun.jersey:jersey-servlet:$jerseyVersion\"eureka server依赖jersey框架,可以认为jersey框架类比于spring web mvc框架,支持mvc模式,支持restful http请求eureka client和eureka server之间进行通信,都是基于jersey框架实现http restful接口请求和调用的。eureka-client-jersey2,eureka-core-jersey2这两个工程,就是eureka对jersey框架的一个封装,提供更多的功能testCompile \"org.mockito:mockito-core:${mockitoVersion}\"mocktio,mock测试框架testCompile \"org.eclipse.jetty:jetty-server:$jetty_version\"testCompile \"org.eclipse.jetty:jetty-webapp:$jetty_version\"jetty,测试的时候,是会基于jetty直接将eureka server作为一个web应用给运行起来,jersey对外暴露了一些restful接口,然后测试类里,就可以基于jersey的客户端,发送http请求,调用eureka server暴露的restful接口,测试比如说:服务注册、心跳、服务实例摘除,等等功能。war { from (project(':eureka-resources').file('build/resources/main'))}把eureka-server工程,打成一个war包,会将eureka-resources中的jsp、js、css给打到war包中,然后运行起来,提供一个index页面。
0 条评论
回复 删除
下一页