在没有负载均衡器的情况下,在application.properties中通过服务名称为@FeignClient提供URL

问题描述 投票:0回答:2

我想使用 Feign 客户端并通过服务名称在

application.properties
中提供 URL。

先决条件:

我使用 Spring Boot,并且我依赖 Spring Cloud 中的 Feign:

<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.带负载平衡器的功能区

当我可以为 Ribbon 的负载均衡器指定 URL 列表(通过 Feign 客户端名称)时,我知道 Spring Cloud 提供了 Ribbon。

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

application.properties

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

注意:我必须禁用 Eureka(默认启用),因为我不需要 Eureka 服务器。我需要在我的应用程序中的

application.properties
中提供 URL。

依赖性:

<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?

我阅读了文档,但没有找到解决方案:

spring-boot spring-cloud spring-cloud-feign feign netflix-ribbon
2个回答
0
投票

我面临着同样的问题,您是否按照EnableFeignClients使得Spring无法加载上下文中的建议尝试了以下操作?

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

0
投票

@mkczyk - 您对上述问题有任何解决方案吗?我面临着非常类似的问题 - springCloud 2021.09 、 Springboot 2.6.15 、 openFeign 、 Hystrix 和 Ribbon 等。

© www.soinside.com 2019 - 2024. All rights reserved.