> 文章列表 > SpringCloud之consul服务注册机制

SpringCloud之consul服务注册机制

SpringCloud之consul服务注册机制

注解机制涉及三个自动装配的候选类,依次为:ConsulAutoServiceRegistrationAutoConfiguration、ConsulServiceRegistryAutoConfiguration、ConsulDiscoveryClientConfiguration。

涉及的配置类包含:

  1. AutoServiceRegistrationProperties
  • spring.cloud.service-registry.auto-registration.enabled=true
  • spring.cloud.service-registry.auto-registration.registerManagement=true
  1. 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
  1. 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 {@AutowiredAutoServiceRegistrationProperties autoServiceRegistrationProperties;@Bean@ConditionalOnMissingBeanpublic ConsulAutoServiceRegistration consulAutoServiceRegistration(ConsulServiceRegistry registry,AutoServiceRegistrationProperties autoServiceRegistrationProperties,ConsulDiscoveryProperties properties,ConsulAutoRegistration consulRegistration) {return new ConsulAutoServiceRegistration(registry,autoServiceRegistrationProperties, properties, consulRegistration);}@Beanpublic ConsulAutoServiceRegistrationListener consulAutoServiceRegistrationListener(ConsulAutoServiceRegistration registration) {return new ConsulAutoServiceRegistrationListener(registration);}@Bean@ConditionalOnMissingBeanpublic 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;@Overridepublic boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {return WebServerInitializedEvent.class.isAssignableFrom(eventType);}@Overridepublic boolean supportsSourceType(Class<?> sourceType) {return true;}@Overridepublic void onApplicationEvent(ApplicationEvent applicationEvent) {if (applicationEvent instanceof WebServerInitializedEvent) {WebServerInitializedEvent event = (WebServerInitializedEvent) applicationEvent;ApplicationContext context = event.getApplicationContext();...this.autoServiceRegistration.setPortIfNeeded(event.getWebServer().getPort());//#1this.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()));//#1register();//#2if (shouldRegisterManagement()) {registerManagement();}this.context.publishEvent(new InstanceRegisteredEvent<>(this, getConfiguration()));//#3this.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 {@Deprecatedpublic static final String CATALOG_WATCH_TASK_SCHEDULER_NAME = 	ConsulCatalogWatchAutoConfiguration.CATALOG_WATCH_TASK_SCHEDULER_NAME;@Bean@ConditionalOnMissingBeanpublic ConsulDiscoveryProperties consulDiscoveryProperties(InetUtils inetUtils) {return new ConsulDiscoveryProperties(inetUtils);}@Bean@ConditionalOnMissingBeanpublic ConsulDiscoveryClient consulDiscoveryClient(ConsulClient consulClient,ConsulDiscoveryProperties discoveryProperties) {return new ConsulDiscoveryClient(consulClient, discoveryProperties);}}

3、ConsulServiceRegistryAutoConfiguration

初始化HeartbeatProperties & ConsulServiceRegistry

@AutoConfigureBefore(ServiceRegistryAutoConfiguration.class)
public class ConsulServiceRegistryAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic ConsulServiceRegistry consulServiceRegistry(ConsulClient consulClient,ConsulDiscoveryProperties properties, HeartbeatProperties heartbeatProperties,@Autowired(required = false) TtlScheduler ttlScheduler) {return new ConsulServiceRegistry(consulClient, properties, ttlScheduler,heartbeatProperties);}@Bean@ConditionalOnMissingBeanpublic HeartbeatProperties heartbeatProperties() {return new HeartbeatProperties();}@Bean@ConditionalOnMissingBeanpublic ConsulDiscoveryProperties consulDiscoveryProperties(InetUtils inetUtils) {return new ConsulDiscoveryProperties(inetUtils);}}