之前分析过Spring Cloud的Eureka服务发现, 今天分析一下服务注册.

配置

BootstrapConfiguration

EurekaDiscoveryClientConfigServiceBootstrapConfiguration

spring-cloud-config环境中使用的配置

引入EurekaDiscoveryClientConfigurationEurekaClientAutoConfiguration

EurekaDiscoveryClientConfiguration
  1. 在spring-cloud中(通过是否存在RefreshScopeRefreshedEvent.class判断), 添加RefreshScopeRefreshedEvent的listener. 收到事件后重新注册实例.
  2. eureka.client.healthcheck.enabled设置为true时, 注册EurekaHealthCheckHandlerbean. EurekaHealthCheckHandler负责将应用状态映射为实例状态InstanceStatus.
EurekaClientAutoConfiguration

支持spring-cloud和非spring-cloud环境, 在spring-cloud环境中, 下面两个bean要使用@RefreshScope标注

  1. 实例化EurekaClientbean, 在spring-cloud中使用实现类CloudEurekaClient.
  2. 使用EurekaInstanceConfig实例, 实例化ApplicationInfoManagerbean

EnableAutoConfiguration

EurekaClientConfigServerAutoConfiguration

在spring-cloud-config的环境中, 将configPath加入到实例的metadata map中.

EurekaDiscoveryClientConfigServiceAutoConfiguration

当config客户端希望通过服务发现寻找config服务的时候使用的引导配置

spring.cloud.config.discovery.enabledtrue时, 关闭父application context里实例化的EurekaClient实例. 只使用当前上下文里的实例.

EurekaClientAutoConfiguration

核心配置 支持spring-cloud(支持动态配置)和非spring-cloud环境, EurekaClientEurekaInstanceConfig两个bean要使用@RefreshScope标注

  1. 实例化当前服务实例信息EurekaInstanceConfigBean的实例
  2. 实例化DiscoveryClient的实现, 在这里是EurekaDiscoveryClient
  3. 实例化EurekaServiceRegistry
  4. 实例化EurekaRegistration
  5. 实例化EurekaAutoServiceRegistration, 这个类实现了StartLifecycle接口. 在ApplicationContext refresh或者shutdown之后注册或者注销当前实例
  6. 实例化EurekaClientbean, 在spring-cloud中使用实现类CloudEurekaClient
  7. 使用EurekaInstanceConfig实例, 实例化ApplicationInfoManagerbean

EurekaClientAutoConfiguration

RibbonEurekaAutoConfiguration

当启用Eureka client(eureka.client.enable为true和ribbon.eureka.enabled为true时, 默认为true)时配置默认基于eureka的ribbon. 使用EurekaRibbonClientConfiguration提供的配置: RibbonPing, ServerList, ServerIntrospector.

EurekaDiscoveryClientConfiguration

提供监听RefreshScopeRefreshedEvent的监听器, 当事件发生时注销并重新注册(防止metadata发生改变) 提供一个默认的EurekaHealthCheckHandler实例, 当bean不存在的且eureka.client.healthcheck.enabled为true时.

主要类

ServiceRegistry

spring提供的服务实例注册和注销的接口.

EurekaServiceRegistry

ServiceRegistry的Eureka实现. 注册和注销的实现是通过EurekaRegistrationApplicationInfoManager修改实例状态实现的.

EurekaRegistration

通过实现ServiceInstance提供访问实例信息的接口,

ApplicationInfoManager

提供修改实例状态的接口, 并通知状态变化的监听器. 提供内部类StatusChangeListener. 提供注册和注销状态变化监听器的接口, Eureka的DiscoveryClient中通过匿名类的方式实现了该接口, 当实例状态发生变化时, 刷新实例状态.