Как отключить 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
Другие вопросы по тегам