Предоставление URL-адреса для @FeignClient по имени службы в application.properties без балансировщика нагрузки

Я хочу использовать клиент Feign и указать URL-адрес в application.properties по имени службы.

Предпосылки:

Я использую Spring Boot, и у меня есть зависимость Feign от Spring Cloud:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

Я включил клиентов Feign:

@SpringBootApplication
@EnableFeignClients
public class MyApplication {
    public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); }
}

Попытки:

1. Жестко запрограммированный URL-адрес в коде

Я знаю, как использовать хардкор URL в коде:

@FeignClient(name = "some-service", url = "http://some-service.com/")
public interface SomeServiceClient {}

Но я хочу использовать файл свойств.

2. Жестко запрограммированное свойство

Я знаю, как жестко закодировать свойство для чтения URL-адреса из свойств:

@FeignClient(name = "some-service", url = "${some-service.url}")
public interface SomeServiceClient {}

application.properties:

some-service.url=http://some-service.com/

Это намного лучше, но я хочу отделить имя свойства от клиента Feign. Я хотел бы использовать только name.

3. Лента с балансировщиком нагрузки.

Я знаю, что Spring Cloud предоставляет Ribbon, когда я могу указать список URL-адресов (по имени клиента Feign) для балансировщика нагрузки Ribbon.

@FeignClient(name = "some-service")
public interface SomeServiceClient {}

application.properties:

some-service.ribbon.listOfServers=http://some-service.com/
ribbon.eureka.enabled=false

Примечание: мне нужно отключить Eureka (который включен по умолчанию), потому что мне не нужен сервер Eureka. Мне нужно указать URL-адрес в application.properties в моем приложении.

Зависимость:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

Это решение кажется лучше, потому что мой клиент Feign в коде содержит только name (без URL-адреса или связанного имени свойства для URL-адреса). Это именно то, что я хотел получить.

Но в журналах я вижу, что Spring / Ribbon запускает для меня балансировщик нагрузки:

2020-11-03 23:39:01.832  INFO 12168 --- [nio-8080-exec-2] c.netflix.config.ChainedDynamicProperty  : Flipping property: some-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2020-11-03 23:39:01.892  INFO 12168 --- [nio-8080-exec-2] c.netflix.loadbalancer.BaseLoadBalancer  : Client: some-service instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=some-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2020-11-03 23:39:01.908  INFO 12168 --- [nio-8080-exec-2] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
2020-11-03 23:39:01.955  INFO 12168 --- [nio-8080-exec-2] c.netflix.config.ChainedDynamicProperty  : Flipping property: some-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2020-11-03 23:39:01.970  INFO 12168 --- [nio-8080-exec-2] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client some-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=some-service,current list of Servers=[jsonplaceholder.typicode.com:443],Load balancer stats=Zone stats: {unknown=[Zone:unknown;  Instance count:1;   Active connections count: 0;    Circuit breaker tripped count: 0;   Active connections per server: 0.0;]
},Server stats: [[Server:jsonplaceholder.typicode.com:443;  Zone:UNKNOWN;   Total Requests:0;   Successive connection failure:0;    Total blackout seconds:0;   Last connection made:Thu Jan 01 01:00:00 CET 1970;  First connection made: Thu Jan 01 01:00:00 CET 1970;    Active Connections:0;   total failure count in last (1000) msecs:0; average resp time:0.0;  90 percentile resp time:0.0;    95 percentile resp time:0.0;    min resp time:0.0;  max resp time:0.0;  stddev resp time:0.0]
]}ServerList:com.netflix.loadbalancer.ConfigurationBasedServerList@6a4bfe52

Мне не нужен балансировщик нагрузки (у меня только один URL). Как отключить и всегда получать listOfServers первым? Может быть, есть способ предоставить индивидуальную реализацию балансировщика нагрузки? Или хотя бы отключить логи для избыточного балансировщика нагрузки?

Или как по-другому настроить один URL для имени сервиса?

Прочитал документацию, но решения не нашел:


person mkczyk    schedule 03.11.2020    source источник


Ответы (1)


У меня тот же вопрос, пробовали ли вы следующее, как предлагается в EnableFeignClients заставляет Spring не загружать контекст?

spring.main.allow-bean-definition-overriding=true
feign.client.config.some-service.url=http://some-service.com/
person stefan123t    schedule 28.01.2021