我的应用程序没有向 Consul 注册服务。我跟踪了源代码,问题似乎是 AbstractAutoServiceRegistration 的绑定方法没有调用。如果我理解正确,绑定逻辑在 org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistrationAutoConfiguration 中,它定义了一个类型为 ConsulAutoServiceRegistration 的 bean。ConsulAutoServiceRegistration 类是从 AbstractAutoServiceRegistration 扩展而来的。
@Bean
@ConditionalOnMissingBean
public ConsulAutoServiceRegistration consulAutoServiceRegistration(
ConsulServiceRegistry registry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
ConsulDiscoveryProperties properties,
ConsulAutoRegistration consulRegistration) {
return new ConsulAutoServiceRegistration(registry,
autoServiceRegistrationProperties, properties, consulRegistration);
}
然后AbstractAutoServiceRegistration中一个名为bind的方法被@EventListener(WebServerInitializedEvent.class)注解。
@EventListener(WebServerInitializedEvent.class)
public void bind(WebServerInitializedEvent event) {
ApplicationContext context = event.getApplicationContext();
if (context instanceof ConfigurableWebServerApplicationContext) {
if ("management".equals(
((ConfigurableWebServerApplicationContext) context).getServerNamespace())) {
return;
}
}
this.port.compareAndSet(0, event.getWebServer().getPort());
this.start();
}
但是我发现这个方法没有在监听器中注册,因为 AbstractAutoServiceRegistration 的包是以“org.springframework”开头的。所以在 EventListenerMethodProcessor 中它被忽略了。
private void processBean(final String beanName, final Class<?> targetType) {
if (!this.nonAnnotatedClasses.contains(targetType) && !isSpringContainerClass(targetType)) {
...
}
private static boolean isSpringContainerClass(Class<?> clazz) {
return (clazz.getName().startsWith("org.springframework.") &&
!AnnotatedElementUtils.isAnnotated(ClassUtils.getUserClass(clazz), Component.class));
}
问题是什么?我该如何解决?