Мы написали собственный клиент обнаружения служб (SD) на основе spring-cloud-common SPI , что означает, что он предоставляет реализации для интерфейсов 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
DiscoveryClient
?И если да, то можно ли это сделать в нашей библиотеке, а не в приложениях конечного пользователя?