注解机制涉及三个自动装配的候选类,依次为:ConsulAutoServiceRegistrationAutoConfiguration、ConsulServiceRegistryAutoConfiguration、ConsulDiscoveryClientConfiguration。
涉及的配置类包含:
- AutoServiceRegistrationProperties
- spring.cloud.service-registry.auto-registration.enabled=true
- spring.cloud.service-registry.auto-registration.registerManagement=true
- ConsulDiscoveryProperties
- spring.cloud.consul.discovery.port
- spring.cloud.consul.discovery.hostname
- spring.cloud.consul.discovery.managementPort
- spring.cloud.consul.discovery.instanceId
- spring.cloud.consul.discovery.healthCheckUrl
- spring.cloud.consul.discovery.healthCheckPath
- HeartbeatProperties
- spring.cloud.consul.discovery.heartbeat.enabled=false
- spring.cloud.consul.discovery.heartbeat.intervalRatio= 2.0 / 3.0
1、ConsulAutoServiceRegistrationAutoConfiguration
AutoServiceRegistrationConfiguration
并非consul相关包下的类,而是spring-cloud-common包下的。
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(AutoServiceRegistrationProperties.class)
@ConditionalOnMissingBean(
type = "org.springframework.cloud.consul.discovery.ConsulLifecycle")
@ConditionalOnConsulEnabled
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
matchIfMissing = true)
@AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
ConsulServiceRegistryAutoConfiguration.class })
public class ConsulAutoServiceRegistrationAutoConfiguration {
@Autowired
AutoServiceRegistrationProperties autoServiceRegistrationProperties;
@Bean
@ConditionalOnMissingBean
public ConsulAutoServiceRegistration consulAutoServiceRegistration(
ConsulServiceRegistry registry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
ConsulDiscoveryProperties properties,
ConsulAutoRegistration consulRegistration) {
return new ConsulAutoServiceRegistration(registry,
autoServiceRegistrationProperties, properties, consulRegistration);
}
@Bean
public ConsulAutoServiceRegistrationListener consulAutoServiceRegistrationListener(
ConsulAutoServiceRegistration registration) {
return new ConsulAutoServiceRegistrationListener(registration);
}
@Bean
@ConditionalOnMissingBean
public ConsulAutoRegistration consulRegistration(
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
ConsulDiscoveryProperties properties, ApplicationContext applicationContext,
ObjectProvider<List<ConsulRegistrationCustomizer>> registrationCustomizers,
ObjectProvider<List<ConsulManagementRegistrationCustomizer>> managementRegistrationCustomizers,
HeartbeatProperties heartbeatProperties) {
return ConsulAutoRegistration.registration(autoServiceRegistrationProperties,
properties, applicationContext, registrationCustomizers.getIfAvailable(),
managementRegistrationCustomizers.getIfAvailable(), heartbeatProperties);
}
}
ConsulAutoRegistration
核心功能是实例化其属性NewService
。
NewService的作用是其字段属性映射ConsulDiscoveryProperties配置属性值。包含 服务相关属性NewService 以及 健康检查NewService.Check 相关属性映射。
ConsulAutoServiceRegistration
核心功能是服务的 注册功能。
ConsulAutoServiceRegistrationListener
核心功能触发 ConsulAutoServiceRegistration 的注册功能。
1.1、ConsulAutoServiceRegistrationListener
该监听器触发服务注册功能。接受的事件类型为WebServerInitializedEvent,即ServletWebServerInitializedEvent。
AbstractApplicationContext#refresh~finishRefresh发布WebServerInitializedEvent类型的事件。
public class ConsulAutoServiceRegistrationListener implements SmartApplicationListener {
private final ConsulAutoServiceRegistration autoServiceRegistration;
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return WebServerInitializedEvent.class.isAssignableFrom(eventType);
}
@Override
public boolean supportsSourceType(Class<?> sourceType) {
return true;
}
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
if (applicationEvent instanceof WebServerInitializedEvent) {
WebServerInitializedEvent event = (WebServerInitializedEvent) applicationEvent;
ApplicationContext context = event.getApplicationContext();
...
this.autoServiceRegistration.setPortIfNeeded(event.getWebServer().getPort());//#1
this.autoServiceRegistration.start();//#2
}
}
}
步骤1:区别于NewService中用于健康检测的端口~健康检查可以自定义healthCheckUrl。该处的端口是指用户服务中server.port对应的端口。健康检查端口跟server.port可以不一致哦。
步骤2:通过抽象类AbstractAutoServiceRegistration实现真正的服务注册功能。
1.2、AbstractAutoServiceRegistration
public abstract class AbstractAutoServiceRegistration{
public void start() {
if (!this.running.get()) {
this.context.publishEvent(new InstancePreRegisteredEvent(this, getRegistration()));//#1
register();//#2
if (shouldRegisterManagement()) {
registerManagement();
}
this.context.publishEvent(new InstanceRegisteredEvent<>(this, getConfiguration()));//#3
this.running.compareAndSet(false, true);
}
}
}
步骤2:ConsulClient 通过地址 http://localhost:8500/v1/agent/service/register 完成注册功能。
步骤1、步骤3:用户可以实现对应的事件类型,在注册前后修改 实例ConsulAutoServiceRegistration 中的属性值。
2、ConsulDiscoveryClientConfiguration
初始化ConsulDiscoveryProperties
& ConsulDiscoveryClient
。
@AutoConfigureAfter({ UtilAutoConfiguration.class, ConsulAutoConfiguration.class })
public class ConsulDiscoveryClientConfiguration {
@Deprecated
public static final String CATALOG_WATCH_TASK_SCHEDULER_NAME =
ConsulCatalogWatchAutoConfiguration.CATALOG_WATCH_TASK_SCHEDULER_NAME;
@Bean
@ConditionalOnMissingBean
public ConsulDiscoveryProperties consulDiscoveryProperties(InetUtils inetUtils) {
return new ConsulDiscoveryProperties(inetUtils);
}
@Bean
@ConditionalOnMissingBean
public ConsulDiscoveryClient consulDiscoveryClient(ConsulClient consulClient,
ConsulDiscoveryProperties discoveryProperties) {
return new ConsulDiscoveryClient(consulClient, discoveryProperties);
}
}
3、ConsulServiceRegistryAutoConfiguration
初始化HeartbeatProperties
& ConsulServiceRegistry
。
@AutoConfigureBefore(ServiceRegistryAutoConfiguration.class)
public class ConsulServiceRegistryAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public ConsulServiceRegistry consulServiceRegistry(ConsulClient consulClient,
ConsulDiscoveryProperties properties, HeartbeatProperties heartbeatProperties,
@Autowired(required = false) TtlScheduler ttlScheduler) {
return new ConsulServiceRegistry(consulClient, properties, ttlScheduler,
heartbeatProperties);
}
@Bean
@ConditionalOnMissingBean
public HeartbeatProperties heartbeatProperties() {
return new HeartbeatProperties();
}
@Bean
@ConditionalOnMissingBean
public ConsulDiscoveryProperties consulDiscoveryProperties(InetUtils inetUtils) {
return new ConsulDiscoveryProperties(inetUtils);
}
}