Как отключить CompositeDiscoveryClient и SimpleDiscoveryClient в библиотеке обнаружения служб
Мы написали собственный клиент для обнаружения сервисов (SD), основанный на SPI Spring-cloud-commons, то есть он предоставляет реализации для интерфейсов. ServiceRegistry
а также DiscoveryClient
и некоторые другие предоставляемые Spring абстракции.
Приложения, которые используют нашу библиотеку, просто добавляют ее в свой файл pom, и она автоматически связывает DiscoveryClient
со своей собственной реализацией, InHouseDiscoveryClient
<dependency>
<groupId>blah.blah<groupId>
<artifactId>inhouse-service-discovery-client<artifactId>
<dependency>
Однако вместо того, чтобы ссылаться на InHouseDiscoveryClient
в коде рекомендуется использовать интерфейс DiscoveryClient
как показано ниже
# Good
@Autowired
DiscoveryClient client;
# Bad (binds app to a particular SD implementation)
@Autowired
InHouseDiscoveryClient client;
Таким образом, мы должны добавить spring-cloud-commons
к проекту.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
Это где проблема начинается. Библиотека commons фактически автоматически связывает две дополнительные реализации DiscoveryClient
- SimpleDiscoveryClient
и CompositeDiscoveryClient
,
Это создает странный пользовательский опыт для наших клиентов. Вместо того, чтобы просто иметь InHouseDiscoveryClient
пользователи оказываются с этими дополнительными компонентами.
Можно ли предотвратить spring-cloud-commons
"s DiscoveryClient
реализации от автопроводки? И если так, можно ли это сделать в нашей библиотеке, а не в приложениях конечного пользователя?
2 ответа
Я в конечном итоге продлен AutoConfigurationImportFilter
в моей библиотеке, чтобы удалить автоматически подключенные bean-компоненты из облачных сообществ. Я также удалил его индикатор здоровья, но у нас была очень веская причина - скорее всего, лучше его оставить.
my.package
public class StratusDiscoveryExclusionFilter implements AutoConfigurationImportFilter {
private static final Set<String> SHOULD_SKIP = new HashSet<>(
Arrays.asList(
// DiscoveryClient Beans
"org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClientAutoConfiguration",
"org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration",
// Health indicators
"org.springframework.cloud.client.CommonsClientAutoConfiguration")
);
/**
* For each class name, provide an assocated boolean array indicated whether or not to include
*/
@Override
public boolean[] match(String[] classNames, AutoConfigurationMetadata metadata) {
boolean[] matches = new boolean[classNames.length];
for (int i = 0; i < classNames.length; i++) {
matches[i] = !SHOULD_SKIP.contains(classNames[i]);
}
return matches;
}
}
Я думаю добавить ссылку на это в моей библиотеке spring.factories
файл
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=my.package.MyExclusionFilter
Есть дваAutoConfiguration
классы, которые необходимо исключить.
Вы можете сделать это через@SpringBootApplication
аннотация.
@SpringBootApplication(exclude = {CompositeDiscoveryClientAutoConfiguration.class, SimpleDiscoveryClientAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Или через файл свойств как@spencergibb
предложенный:
# yml version
spring:
autoconfigure:
exclude:
- org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClientAutoConfiguration
- org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration
# classic version
spring.autoconfigure.exclude= \
org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClientAutoConfiguration, \
org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration