如何解决在没有负载均衡器的情况下通过application.properties中的服务名称为@FeignClient提供URL 先决条件: 1代码中的硬编码URL 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?
我阅读了文档,但没有找到解决方法:
- https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html
- https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html
解决方法
我面临同样的问题,您是否按照 EnableFeignClients makes Spring not able to load the context 中的建议尝试了以下操作?
spring.main.allow-bean-definition-overriding=true
feign.client.config.some-service.url=http://some-service.com/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。