服务治理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 {

	@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);
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值